diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/plugins/openwfcrs/src/openwfcthreadmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/plugins/openwfcrs/src/openwfcthreadmanager.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,151 @@ +// Copyright (c) 1995-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 "openwfcthreadmanager.h" +#include "openwfcjobmanager.h" + + +COpenWfcMonitorThread::COpenWfcMonitorThread(COpenWfcJobManger& aManager): +iEndThread(EFalse), +iManager(aManager) + { + + } + +COpenWfcMonitorThread::~COpenWfcMonitorThread() + { + EndThread(); + TRequestStatus threadDies = KErrNone; + iThread.Resume(); + iThread.Logon(threadDies); + if (iThread.ExitType() == EExitPending || + threadDies != KRequestPending) + { + User::WaitForRequest(threadDies); + } + iThread.Close(); + iSemaphore.Close(); + } + +void COpenWfcMonitorThread::ConstructL(TInt aScreenNumber) + { + TBuf <255> threadManagerName; + /* + * At a given instant in time, one screen can have at most one monitor + * thread. Test code will, for a given screen, destroy and re-create + * the monitor thread. + * + * At appears that the thread, once killed off, still lingers in + * the OS for a short time. The newly created thread fails to create + * if it shares the same name as the one that was killed but still is + * lingering around. + * + * A unique name is needed. This is guaranteed by using a thread name + * which includes a microsecond counter. This counter wraps every hour, + * roughly. This is comfortably outside the race condition above. + * + * To make debugging easier, we also include the screen number in + * the thread name. + * + * Thus, the thread name is: + * WFCMonitorThread__ + */ + _LIT(KThreadName, "WFCMonitorThread_%d_%d"); + TTime now; + now.UniversalTime(); + TInt microseconds = I64LOW(now.Int64()); + threadManagerName.Format(KThreadName, aScreenNumber, microseconds); + + User::LeaveIfError(iThread.Create(threadManagerName, + static_cast(&COpenWfcMonitorThread::Main), + KDefaultStackSize, + NULL, + this, + EOwnerProcess)); + iThread.SetPriority(EPriorityNormal); + User::LeaveIfError(iSemaphore.CreateLocal(0)); + Start(); + } + +COpenWfcMonitorThread* COpenWfcMonitorThread::NewLC(TInt aNumber, COpenWfcJobManger& aManager) + { + COpenWfcMonitorThread* self = new(ELeave) COpenWfcMonitorThread(aManager); + CleanupStack::PushL(self); + self->ConstructL(aNumber); + return(self); + } + +COpenWfcMonitorThread* COpenWfcMonitorThread::NewL(TInt aNumber, COpenWfcJobManger& aManager) + { + COpenWfcMonitorThread* self = COpenWfcMonitorThread::NewLC(aNumber, aManager); + CleanupStack::Pop(self); + return self; + } + +TInt COpenWfcMonitorThread::Main(TAny *aSelf) + { + COpenWfcMonitorThread* self = static_cast(aSelf); + return self->Run(); + } + +void COpenWfcMonitorThread::Start() + { + iThread.Rendezvous(iThreadStatus); + iThread.Resume(); + User::WaitForRequest(iThreadStatus); + } + +void COpenWfcMonitorThread::Resume() + { + iThread.Resume(); + } + +void COpenWfcMonitorThread::EndThread() + { + iSemaphore.Signal(); + iEndThread = ETrue; + } + +void COpenWfcMonitorThread::Suspend() + { + iThread.Suspend(); + } + +void COpenWfcMonitorThread::Signal() + { + iSemaphore.Signal(); + } + +TInt COpenWfcMonitorThread::Run() + { + RThread::Rendezvous(KErrNone); + JQLOG(("** START * COpenWfcMonitorThread::Run()")); + while(!iEndThread) + { + JQLOG(("** WAIT FOR SIGNAL * CCOpenwfcMonitorThread::Run()")); + iSemaphore.Wait(); + + if (!iEndThread) + { + iManager.DoExecuteJob(); + } + } + + /* Release any use of EGL by this thread. */ + eglReleaseThread(); + + JQLOG(("** EXIT * COpenWfcMonitorThread::Run()")); + return KErrNone; + }