diff -r 000000000000 -r dfb7c4ff071f commsfwutils/commsbufs/inc/systemsharedasyncalloc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsfwutils/commsbufs/inc/systemsharedasyncalloc.h Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,114 @@ +// Copyright (c) 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: Asynchronous allocation from the system shared buffer pool +// + +#ifndef __SYSTEMSHAREDASYNCALLOC_H__ +#define __SYSTEMSHAREDASYNCALLOC_H__ + +#include +#include + +/** +Notifies the asyncronous request completion or error + +@internalTechnology +*/ +class MAsyncAllocNotifier + { + public: + virtual void OnCompletion() =0; + virtual void OnError(TInt aError) =0; + }; + +class CSystemSharedBufPool; + +/** +Asynchronous allocation from the single system shared pool + +@internalTechnology + +*/ +NONSHARABLE_CLASS(CSystemSharedPoolAsyncAlloc) : public CActive + { + friend class CSystemSharedAsyncAlloc; + public: + CSystemSharedPoolAsyncAlloc(CSystemSharedBufPool& aPool, MAsyncAllocNotifier& aNotifer); + ~CSystemSharedPoolAsyncAlloc(); + + void Activate(TInt aFreeBufs); + void Deactivate(); + private: + // From CActive + void RunL(); + TInt RunError(TInt aError); + void DoCancel(); + + private: + CSystemSharedBufPool& iPool; + MAsyncAllocNotifier& iNotifier; + }; + +class CSystemSharedBufPool; +/** +Manages the asynchronous allocation from the system shared pools. +@internalTechnology + +*/ +NONSHARABLE_CLASS(CSystemSharedAsyncAlloc) : public CActive, public MAsyncAllocNotifier + { + enum TAsyncRequestState + { + EMakeRequest = 0, + ECancelRequest, + }; + + public: + static CSystemSharedAsyncAlloc* New(const RPointerArray& aPools); + ~CSystemSharedAsyncAlloc(); + void StartRequest(CCommsBufAsyncRequest& aRequest); + void CancelRequest(CCommsBufAsyncRequest& aRequest); + + private: + CSystemSharedAsyncAlloc(); + TInt Construct(const RPointerArray& aPools); + void MakePoolAsyncRequest(); + void MakePoolRequest(); + void CancelPoolAsyncRequest(); + void CancelAllPoolRequest(); + + void ActivateSelf(); + void CompleteSelf(); + void CancelSelf(); + + // From MAsyncAllocNotifier + virtual void OnCompletion(); + virtual void OnError(TInt aError); + + // From CActive + void RunL(); + void DoCancel(); + + void CompleteAsyncAllocs(); + + + private: + RPointerArray iAsyncAllocPools; + TAsyncRequestState iRequestState; + RThread iOwnerThread; + TBool iSignalled; + RWorkerLock iAsynAllocLock; + TDblQue iAllocsPending; + }; + +#endif // __SYSTEMSHAREDASYNCALLOC_H__