diff -r 000000000000 -r dfb7c4ff071f serialserver/c32serialserver/SCOMM/cs_glob.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/serialserver/c32serialserver/SCOMM/cs_glob.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,214 @@ +// Copyright (c) 2005-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: +// + +/** + @file + @internalComponent +*/ + +#include "cs_glob.h" +#include +#include "C32LOG.H" +#include "cs_roles.h" +#include "cs_thread.h" + + +CC32Data* CC32Data::NewL() + { + return new(ELeave) CC32Data(); + } + + + +CC32Data::CC32Data() + { + } + + +CC32WorkerThread* CC32Data::SelfWorker() const + { + return iWorkerThread; + } + +void C32GlobalUtil::InitC32GlobalsL(CC32WorkerThread* aWorker) + { + CTLSRedirector* tls = CRedirectorInTls(); + if(tls) + { + Fault(EInitTwice); + } + + // Allocate global storage to be held in tls. + // only transfer ownership to tls at end since if we fail, the thread is never started + CC32Data *globals=CC32Data::NewL(); + + CleanupStack::PushL(globals); + + // Pre allocate the shutdown timer so that we can always shut down. + globals->iShutdownWatchDog=CC32ShutdownWatchDog::NewL(); +#ifdef _DEBUG + globals->iShutdownWatchDog->SetWorkerId(aWorker->WorkerId()); +#endif + CleanupStack::PushL(globals->iShutdownWatchDog); + + globals->iWorkerThread = aWorker; + + tls = CTLSRedirector::NewL(); + + CleanupStack::PushL(tls); + + CDeltaTimer* timer = CDeltaTimer::NewL(CActive::EPriorityHigh, KCommTimerGranularity); + + tls->SetDeltaTimer(timer); // ownership transferred + + tls->SetC32GlobalData(globals); //ownership transferred + + + Dll::SetTls(tls); // owned now indirectly by the worker thread which must now remove it when shutting down + + CleanupStack::Pop(3); //watchdog, globals, tls + + C32LOG1(KC32Bootup, _L("C32GlobalUtil::InitL() Done!")); + } + +void C32GlobalUtil::ShutDown() +/** +free data structures +*/ + { + // Mark ourself as on the way out + CC32Data* globals = CC32DataInTls(); + CTLSRedirector* tls = CRedirectorInTls(); + // The CC32Data destructor does not own so does not delete the data it points + // This is since don't want to delete the Watchdog - it is left to delete itself. + // So we delete everything else in CC32Data explicitly. + + C32LOG2(KC32Shutdown, _L("--------------- C32Server W%d starting shutdown ---------------"), globals->iWorkerThread->WorkerId()); + + delete globals->iWorkerThread; + delete tls; + Dll::SetTls(NULL); // so that logger sees it is gone. + } + +void C32GlobalUtil::NewSession() +/** +Increment the session counter - if we were about to shutdown, stop. +*/ + { + CC32Data* globals = CC32DataInTls(); + globals->iNumSessions++; + C32LOG2(KC32Detail, _L8("C32GlobalUtil::NewSession() iNumSessions= %d "), globals->iNumSessions ); + } + +void C32GlobalUtil::SessionClosing() +/** +A session is closing, if it's the last one take our stumps home. +*/ + { + CC32Data* globals = CC32DataInTls(); + globals->iNumSessions--; + C32LOG2(KC32Detail, _L8("C32GlobalUtil::SessionClosing() iNumSessions= %d "), globals->iNumSessions ); + + CC32WorkerThread* selfWorker = globals->SelfWorker(); + if (selfWorker->ShuttingDown()) + { + C32LOG2(KC32Shutdown, _L8("Shutdown requested: %d sessions"), globals->iNumSessions ); + if (globals->iNumSessions <= 0) + { + if(selfWorker->IsMainThread()) + { + selfWorker->DealerByRef().SessionShutdownComplete(); + } + else + { + selfWorker->MaybeTriggerThreadShutdownCallback(); + } + } + } + } + + + +CTLSRedirector* CTLSRedirector::NewL() + { + return new(ELeave) CTLSRedirector(); + } + + +CTLSRedirector::~CTLSRedirector() + { + delete iTimer; + delete iC32Data; + } + + +CC32ShutdownWatchDog::CC32ShutdownWatchDog() + :CTimer(EPriorityLow) +/** +Constructor +*/ + { + } + +void CC32ShutdownWatchDog::Shutdown() +/** +Que ourselves to shut the C32 server down after a suitable delay. +*/ + { + C32LOG1(KC32Shutdown, _L("CC32ShutdownWatchDog::Shutdown()")); + + if (!IsAdded()) + { + CActiveScheduler::Add(this); + } + + if(!IsActive()) + { + After(KCommServerShutdownLatencyMicroSeconds); + } + } + +void CC32ShutdownWatchDog::RunL() + { + C32LOG1(KC32Shutdown, _L("CC32ShutdownWatchDog::RunL()")); + ASSERT(CC32DataInTls()->iNumSessions == 0); + // End of the line + C32GlobalUtil::ShutDown(); + CActiveScheduler::Stop(); + // tls is now deleted, so we mimmick our workerId description on the log line: + C32LOG2(KC32Shutdown, _L("W%d: CC32ShutdownWatchDog::RunL() - about to delete self, which is last step of shutdown"),iWorkerId); + delete this; + } + +CC32ShutdownWatchDog* CC32ShutdownWatchDog::NewL() + { + CC32ShutdownWatchDog* t=new (ELeave) CC32ShutdownWatchDog(); + CleanupStack::PushL(t); + t->ConstructL(); + CleanupStack::Pop(t); + return t; + } + +#ifdef _DEBUG +void CC32ShutdownWatchDog::SetWorkerId(TWorkerId aWorkerId) + { + iWorkerId = aWorkerId; + } +#endif + + +// EOF - CS_GLOB.CPP + +