diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/threadedlogger.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/threadedlogger.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,104 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "threadedlogger.h" + +CThreadedLogger* CThreadedLogger::NewLC(MOmxScriptTestLogger& aRealLogger) + { + CThreadedLogger* self = new(ELeave) CThreadedLogger(aRealLogger); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CThreadedLogger::CThreadedLogger(MOmxScriptTestLogger& aRealLogger): +CActive(EPriorityHigh), +iRealLogger(aRealLogger) + { + iCreatorThreadId = iCreatorThread.Id(); + } + +void CThreadedLogger::ConstructL() + { + User::LeaveIfError(iCreatorThread.Open(iCreatorThreadId)); + User::LeaveIfError(iMutex.CreateLocal()); + User::LeaveIfError(iSemaphore.CreateLocal(0)); + CActiveScheduler::Add(this); + iStatus = KRequestPending; + SetActive(); + } + +CThreadedLogger::~CThreadedLogger() + { + Cancel(); + iSemaphore.Close(); + iMutex.Close(); + iCreatorThread.Close(); + } + +void CThreadedLogger::Log(const TText8* aFile, TInt aLine, TOmxScriptSeverity aSeverity, const TDes& aMessage) + { + if(RThread().Id() == iCreatorThreadId) + { + iRealLogger.Log(aFile, aLine, aSeverity, aMessage); + } + else + { + // proxy the log to creator thread + + // mutex prevents multiple threads to proxy at the same time + iMutex.Wait(); + + // const_cast is regrettable but all we do is pass the params onto a another MOmxScriptTestLogger which will + // also treat the args as const + iFile = const_cast(aFile); + iLine = aLine; + iSeverity = aSeverity; + iMessage = &const_cast(aMessage); + + // signal the creator thread (waking the Active Object) + TRequestStatus* statusPtr = &iStatus; + iCreatorThread.RequestComplete(statusPtr, KErrNone); + + // wait for creator thread to signal back + + iSemaphore.Wait(); + iMutex.Signal(); + } + } + +void CThreadedLogger::RunL() + { + if(iStatus.Int() == KErrCancel) + { + return; + } + iRealLogger.Log(iFile, iLine, iSeverity, *iMessage); + iFile = NULL; + iLine = 0; + iSeverity = (TOmxScriptSeverity) 0; + iMessage = NULL; + iStatus = KRequestPending; + SetActive(); + iSemaphore.Signal(); // signal the requestor thread + } + +void CThreadedLogger::DoCancel() + { + TRequestStatus* statusPtr = &iStatus; + User::RequestComplete(statusPtr, KErrCancel); + }