commsfwutils/commsbufs/mbufmgrimpl/inc/MBufManager.h
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwutils/commsbufs/mbufmgrimpl/inc/MBufManager.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,142 @@
+// Copyright (c) 1997-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
+*/
+
+#if !defined(__MBufManager_h__)
+#define __MBufManager_h__
+
+#include "mbufsizeallocator.h"	// for MBufSizeAllocator
+#include "commsbufpondintf.h"
+#include "commsbufponddbg.h"
+#include <es_mbuf.h>
+#include <elements/rworkerlock.h>
+#include "commsbufasyncreqinternal.h"
+
+class Nif;
+class CRequestAsyncAlloc;
+class CMBufPoolManager;
+class CMBufMemoryAllocator;
+
+NONSHARABLE_CLASS(CMBufManager) : public CBase, public MCommsBufPondIntf, public MCommsBufPondDbg
+/**
+@file
+@internalTechnology
+*/
+	{
+friend class Nif;
+
+private:
+	CMBufManager();
+public:
+	virtual ~CMBufManager();
+	IMPORT_C static MCommsBufPondIntf* New(RArray <TCommsBufPoolCreateInfo>& aPoolInfo, RLibrary& aLibrary, TInt aMaxHeapSize);
+
+	RMBuf* AllocL(TInt aSize);
+	RMBuf* Alloc(TInt aSize);
+
+	static void Panic(TMBufPanic aPanic);
+	
+	void CallBackAfterFree();
+
+
+	static CDeltaTimer* Timer();
+
+	// Used to reference the single process-wide MBufManager from different threads+DLLs
+	// Don't try to inline these - if TLS is in use then they need to be in this DLL
+	static CMBufManager* Context(); // Panics if no context!
+
+	RMBuf* Alloc(TInt aSize, TInt aMinMBufSize);
+	RMBuf* Alloc(TInt aSize, TInt aMinMBufSize, TInt aMaxMBufSize, TBool aIsAllocPool);
+	RMBuf* Alloc(TInt aSize, const RMBufChain& aMBufChain);
+
+	virtual RMBuf* Alloc(TInt aSize, TInt aMinBufSize, TInt aMaxBufSize);
+	virtual RMBuf* FromHandle(TInt aHandle);
+	virtual TInt Store(TDes8& aStore) const;
+	virtual void Free(RCommsBuf* aBuf);
+	virtual TInt BytesAvailable() const;
+	virtual TInt BytesAvailable(TInt aSize) const;
+	virtual TInt NextBufSize(TInt aSize) const;
+	virtual TInt LargestBufSize() const;
+	virtual void StartRequest(CCommsBufAsyncRequest& aRequest);
+	virtual void CancelRequest(CCommsBufAsyncRequest& aRequest);
+	// A new thread/DLL needs to call this when the TLS handling is in use, ie in the
+	// thread startup function, having obtained a pointer to the CMBufManager somehow
+	// (eg caller passed in). Consider it as the thread/dll introducing itself to the
+	// MBufMgr. "Pleased to meet you..."
+	virtual void SetContext();
+	virtual void Release(RLibrary& aLib);
+	virtual MCommsBufPondDbg& CommsBufPondDbg();
+	
+	void WatchDogReset();
+	
+private:
+	CMBufManager(RLibrary& aLibrary);
+	void ConstructL(RArray <TCommsBufPoolCreateInfo>& aPoolInfo, TInt aMaxHeapSize);
+	void ConstructL(TInt aMaxHeapSize);
+
+	static TInt WatchDogExpire(TAny* aPtr);
+	static TInt FreeCallBack(TAny* aPtr);
+	void CompleteAsyncAllocs(TBool aIsAllocPool);
+
+private:
+
+	RWorkerLock iAsynAllocLock;
+
+    CMBufPoolManager* iMBufPoolManager;
+
+	TDblQue<CCommsBufAsyncRequest> iAllocsPending;
+	CDeltaTimer* iTimer;					// The global delta timer.
+	TThreadId iTimerThreadId;
+	TDeltaTimerEntry iWatchDog;
+	TBool iWatchDogIsPending;
+	CAsyncCallBack* iFreeCB;
+	CRequestAsyncAlloc* iRequestAsyncAlloc;
+	RLibrary			iLibrary;
+public:
+	static void __DbgCheckChain(RMBuf* aMBuf, TMBufType aType, TInt aLength, TInt aSize);
+    virtual RCommsBuf* __DbgBufChain();
+	virtual RCommsBuf* __DbgBufChain(TUint aBufSize);
+	virtual void __DbgSetPoolLimit(TInt aCount);
+	virtual void __DbgSetPoolLimit(TInt aCount, TUint aBufSize);
+	virtual void __DbgSetFailAfter(TInt aCount=0);
+	virtual TUint __DbgGetBufSpace();
+	virtual TUint __DbgGetBufSpace(TUint aBufSize);
+	virtual TUint __DbgGetBufTotal();
+	virtual TUint __DbgGetBufTotal(TUint aMufSize);
+	virtual TInt __DbgGetHeapSize();
+	
+	TInt __DbgCheckBuffer(RMBuf* aBuf);
+
+private:
+	TInt iDbgFailAfter;		// fail allocation request of pool within pool chain
+
+#ifdef SYMBIAN_NETWORKING_PERFMETRICS
+	static TBool AddToPerfLog(TAny* aSelf, TDes8& aBuffer, TDes8Overflow* aOverflowHandler);
+
+	enum
+		{
+		KBucketSize = 128,	// Should be a power of 2 for better perf
+		KNumBuckets = 13
+		};
+	TUint iBuckets[KNumBuckets];
+	TUint iNumOOBs;
+#endif
+	};
+
+#endif