diff -r 000000000000 -r dfb7c4ff071f serialserver/c32serialserver/INC/cs_glob.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/serialserver/c32serialserver/INC/cs_glob.h Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,174 @@ +// 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 + @internalTechnology +*/ + +#ifndef CS_GLOB_H +#define CS_GLOB_H + +#include "cs_thread.h" +#include "CS_STD.H" +#include + + +class C32GlobalUtil + { +public: + static void InitC32GlobalsL(CC32WorkerThread* aWorker); + static void ShutDown(void); + static void NewSession(); + static void SessionClosing(); + }; + + + +class CC32ShutdownWatchDog; + + +class CC32Data : public CBase +// owned by CTLSRedirector and meant to be referenced via TLS. Holds various pointers +// to facilitate tricky scenarios such as shutdown and static logging with workerthread id + { +public: + static CC32Data* NewL(); + CC32WorkerThread* SelfWorker() const; + +public: + CC32WorkerThread* iWorkerThread; // pointer to the main class of the thread, not owned + CC32ShutdownWatchDog* iShutdownWatchDog; // loosely owned by workerthread: normally watchdog deletes itself when it fires + TInt iNumSessions; //< Keep a counter of the sessions +private: + CC32Data(); + }; + + + +NONSHARABLE_CLASS(CTLSRedirector) : public CBase +// stored at TLS pointer and handles the two separate situations where TLS is used in C32: +// 1. inside C32, TLS is used for global data and CommTimer +// 2. outside C32, clients may call CommTimer which uses client's TLS + { +public: + static CTLSRedirector* NewL(); + inline CDeltaTimer* DeltaTimer() const; + + + inline void SetDeltaTimer(CDeltaTimer* aTimer); + + + inline CC32Data* C32GlobalData() const; + + inline void SetC32GlobalData(CC32Data* aC32Data); + + inline TBool IsC32GlobalDataSet() const; + + ~CTLSRedirector(); + +private: + CDeltaTimer* iTimer; // The global delta timer for this thread. owned directly by this class + CC32Data* iC32Data; // always owned by CWorkerThread. Never created in client thread situation. + }; + + + + +NONSHARABLE_CLASS(CC32ShutdownWatchDog) : public CTimer +/** +@internalComponent +*/ +// There is some unclarity with regards to this watchdog, since it was copied from Esock along with most +// of the shutdown ideas. It appears it allows +// the workerthread to delay the destruction of data structures until both the dealer and player classes +// have had a chance to shutdown - without which the destruction of the transport would panic due +// to commsfw seeing open channels. +// In practice the watchdog is often triggered for each thread when they run the shutdown for the +// dealer of the main thread (done by whoever gets there first). The watchdog allows the thread to yield +// and then it runs the player class shutdown, after which the watchdog runs. +// It is not known why a timer has been used rather than simply commence the data destruction after both +// dealer and player classes have shut down. +// The watchdog does not seem to be used to mitigate any inter-thread races. +// + { +public: + void Shutdown(); + static CC32ShutdownWatchDog* NewL(); +#ifdef _DEBUG + void SetWorkerId(TUint16 aId); +#endif +private: + CC32ShutdownWatchDog(); + void RunL(); +private: +#ifdef _DEBUG + TInt iWorkerId; +#endif + }; + + + +inline CDeltaTimer* CTLSRedirector::DeltaTimer() const + { + // non=-null not guaranteed, but this function is hardly used + return iTimer; + } + + +inline void CTLSRedirector::SetDeltaTimer(CDeltaTimer* aTimer) + { + iTimer = aTimer; + } + + +inline CC32Data* CTLSRedirector::C32GlobalData() const + { + __ASSERT_DEBUG(iC32Data!=NULL,Fault(EBadState,_L8("CTLSRedirector: access of null C32GlobalData attempted"))); + return iC32Data; + } +inline void CTLSRedirector::SetC32GlobalData(CC32Data* aC32Data) + { + __ASSERT_DEBUG(iC32Data==NULL,Fault(EBadState,_L8("CTLSRedirector: attempt to set already-set GlobalData"))); + iC32Data=aC32Data; + } + +inline TBool CTLSRedirector::IsC32GlobalDataSet() const + { + return iC32Data!=NULL; + } + + +inline CTLSRedirector* CRedirectorInTls() +// provide a convenient way to access the tls redirector. + { + return static_cast(Dll::Tls()); + } + +inline CC32Data* CC32DataInTls() +// provide a convenient way to access the global data. +// Panics if the global data is not set + { + return CRedirectorInTls()->C32GlobalData(); + } + + +#endif // CS_GLOB_H + + + + + +