diff -r 000000000000 -r dfb7c4ff071f commsfwutils/commsbufs/src/commsbufasyncreqinternal.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsfwutils/commsbufs/src/commsbufasyncreqinternal.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,97 @@ +// 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: +// + +#include "es_commsbuf_internal.h" +#include +#include "commsbufasyncreqinternal.h" +#include "commsbufpondintf.h" + +EXPORT_C CCommsBufAsyncRequest::CCommsBufAsyncRequest(TCommsBufAllocator& aAllocator) +:iAllocator(aAllocator) + { + iLink.iPrev = &iLink; + iLink.iNext = &iLink; + } + +EXPORT_C CCommsBufAsyncRequest::~CCommsBufAsyncRequest() + { + + } + +void CCommsBufAsyncRequest::Alloc(RCommsBufChain& aChain, TInt aSize, TInt aMinSize, TInt aMaxSize, TRequestStatus& aStatus) + { + iSize = aSize; + iMinSize = aMinSize; + iMaxSize = aMaxSize; + iChain = &aChain; + iStatusPtr = &aStatus; + *iStatusPtr = KRequestPending; + // Try to satify the request syncronously + TInt err = aChain.Alloc(iSize, iAllocator); + if (err==KErrNone) + { +#ifdef __CFLOG_ACTIVE + __CFLOG_2(KSubsysMBufMgr, KSubsysMBufMgrAsyncAlloc, _L8("RMBufAsyncRequest %x:\tAlloc(aLength %d) request satisfied immediately"), this, aLength); +#endif + User::RequestComplete(iStatusPtr, KErrNone); + return; + } + + // Sync alloc failed, so setup the async alloc request + TThreadId id = RThread().Id(); + TInt ret = iThread.Open(id); + if(ret == KErrNone) + { +#ifdef __CFLOG_ACTIVE + __CFLOG_2(KSubsysMBufMgr, KSubsysMBufMgrAsyncAlloc, _L8("RCommsBufAsyncRequest %x:\tAlloc(aLength %d) starting request"), this, aSize); +#endif + iAllocator.iPond.StartRequest(*this); + } + else + { +#ifdef __CFLOG_ACTIVE + __CFLOG_3(KSubsysMBufMgr, KSubsysMBufMgrAsyncAlloc, _L8("RCommsBufAsyncRequest %x:\tAlloc(aLength %d) failed with %d"), this, aSize, ret); +#endif + } + } + +void CCommsBufAsyncRequest::Cancel() + { + iAllocator.iPond.CancelRequest(*this); + } + +EXPORT_C void CCommsBufAsyncRequest::Complete(TInt aCode) + { +#ifdef __CFLOG_ACTIVE + __CFLOG_2(KSubsysMBufMgr, KSubsysMBufMgrAsyncAlloc, _L8("RCommsBufAsyncRequest %x:\tComplete(aCode %d)"), this, aCode); +#endif + iLink.Deque(); + if (aCode==KErrNone) + { + // In future we may have another smarter way of doing this. + // Currently RCommsBufQ is internal + RCommsBufChain chain(iBufQ.First()); + iChain->Assign(chain); + iBufQ.Init(); + } + else + { + iBufQ.Free(); + } + + iThread.RequestComplete(iStatusPtr, aCode); + iThread.Close(); + } +