serialserver/c32serialserver/INC/cs_glob.h
changeset 0 dfb7c4ff071f
--- /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 <e32base.h>
+
+
+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<CTLSRedirector *>(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
+
+
+
+
+
+