diff -r 000000000000 -r dfb7c4ff071f commsfwutils/commsbufs/mbufmgrimpl/inc/MBufManager.h --- /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 +#include +#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 & 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 & 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 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