diff -r 597aaf25e343 -r e7d2d738d3c2 userlibandfileserver/fileserver/sfile/sf_request.cpp --- a/userlibandfileserver/fileserver/sfile/sf_request.cpp Fri Mar 12 15:50:11 2010 +0200 +++ b/userlibandfileserver/fileserver/sfile/sf_request.cpp Mon Mar 15 12:45:50 2010 +0200 @@ -27,81 +27,25 @@ CFsClientMessageRequest* RequestAllocator::iFreeHead; CFsClientMessageRequest* RequestAllocator::iCloseHead; -TInt RequestAllocator::iAllocNum; -TInt RequestAllocator::iAllocNumOperation; -TMsgOperation* RequestAllocator::iFreeHeadSupOp; - -#if defined(_USE_CONTROLIO) || defined(_DEBUG) || defined(_DEBUG_RELEASE) -TInt RequestAllocator::iAllocated; -#endif +TInt RequestAllocator::iRequestCount; +TInt RequestAllocator::iFreeCount; +TInt RequestAllocator::iRequestCountPeak; RFastLock RequestAllocator::iCacheLock; -void RequestAllocator::Initialise() - { - iFreeHead=NULL; - iCloseHead=NULL; - iAllocNum=0; -#if defined(_USE_CONTROLIO) || defined(_DEBUG) || defined(_DEBUG_RELEASE) - iAllocated=0; -#endif - iAllocNumOperation=0; - iFreeHeadSupOp=NULL; - } +TMsgOperation* OperationAllocator::iFreeHead; +TInt OperationAllocator::iRequestCount; +TInt OperationAllocator::iFreeCount; +TInt OperationAllocator::iRequestCountPeak; +RFastLock OperationAllocator::iCacheLock; -TInt RequestAllocator::AllocRequest(TInt aNum) -// -// Allocates a group of request objects -// - { - TInt i; - if(iAllocNum < KMaxRequestAllocated) - { - __CACHE_PRINT(_L("RequestAllocator::AllocRequest() Not reached the limit")); - CFsClientMessageRequest* list; - CFsClientMessageRequest* start; - list = new CFsClientMessageRequest[KAllocReqBlock]; - start = list; - if(!list) - return KErrNoMemory; - - // Make sure the constructors are called for every element in the array - // - some compilers don't do this - for(TInt j=0; jiNext = list; - } - list->iNext = iFreeHead; - iFreeHead = start; - return KErrNone; - } - else - { - __CACHE_PRINT1(_L("RequestAllocator::AllocRequest() Limit exceeded Count = %d"),aNum); - CFsClientMessageRequest* request; - for(i=0;iSetAllocated(); - request->iNext=iFreeHead; - iFreeHead=request; - } - return KErrNone; - } +TInt RequestAllocator::Initialise() + { + iFreeHead = NULL; + iCloseHead = NULL; + iRequestCount = 0; + iFreeCount = 0; + iRequestCountPeak = 0; + return iCacheLock.CreateLocal(); } void RequestAllocator::FreeRequest(CFsClientMessageRequest* aRequest) @@ -109,28 +53,28 @@ //free request // { - __CACHE_PRINT1(_L("PLUGIN: RequestAllocator::FreeRequest for %x"), aRequest); - if(aRequest->IsAllocated()) + __CACHE_PRINT1(_L("RequestAllocator::FreeRequest for %x"), aRequest); + ASSERT(aRequest != NULL); + iCacheLock.Wait(); + if (iFreeCount >= KFreeCountMax) { - __CACHE_PRINT(_L("RequestAllocator::FreeRequest() Allocated request")); - delete(aRequest); -#if defined(_USE_CONTROLIO) || defined(_DEBUG) || defined(_DEBUG_RELEASE) - iAllocated--; -#endif - return; + delete aRequest; + ASSERT(iRequestCount > 0); + iRequestCount--; } - - __CACHE_PRINT(_L("RequestAllocator::FreeRequest() returning to free list")); - iCacheLock.Wait(); - aRequest->iNext = iFreeHead; - iFreeHead=aRequest; - aRequest->SetSubstedDrive(NULL); + else + { + aRequest->SetSubstedDrive(NULL); + aRequest->iNext = iFreeHead; + iFreeHead=aRequest; + iFreeCount++; + } iCacheLock.Signal(); } void RequestAllocator::OpenSubFailed(CSessionFs* aSession) // -// Move requst from closed list to free list +// Move request from closed list to free list // { __ASSERT_DEBUG(iCloseHead!=NULL,Fault(ERequestAllocatorOpenSubFailed)); // On arriving here Close Queue is supposed to be empty @@ -142,34 +86,39 @@ iCacheLock.Wait(); CFsClientMessageRequest* rp = iCloseHead; iCloseHead = rp->iNext; + iCacheLock.Signal(); // dec the number of closed requests owned by this session aSession->CloseRequestCountDec(); - rp->iNext = NULL; - if(rp->IsAllocated()) + __CACHE_PRINT1(_L("RequestAllocator::OpenSubFailed() IsAllocated %d"), rp->IsAllocated()); + FreeRequest(rp); + } + +CFsClientMessageRequest* RequestAllocator::GetRequest() +// +// Get request from the free queue +// + { + CFsClientMessageRequest* request; + if (iFreeHead == NULL) { - __CACHE_PRINT(_L("RequestAllocator::OpenSubFailed() Allocated request")); - delete(rp); -#if defined(_USE_CONTROLIO) || defined(_DEBUG) || defined(_DEBUG_RELEASE) - iAllocated--; -#endif + request = new CFsClientMessageRequest; + if (request) + { + iRequestCount++; + iRequestCountPeak = Max(iRequestCountPeak, iRequestCount); + } } else { - __CACHE_PRINT(_L("RequestAllocator::OpenSubFailed()")); - if(iFreeHead) - { - rp->iNext = iFreeHead; - } - else - { - rp->iNext = NULL; - } - - iFreeHead = rp; + request = iFreeHead; + iFreeHead = iFreeHead->iNext; + request->iNext = NULL; + iFreeCount--; + ASSERT(iFreeCount >= 0); } - iCacheLock.Signal(); + return request; } TInt RequestAllocator::GetMessageRequest(const TOperation& aOperation,const RMessage2& aMessage,CFsClientMessageRequest* &aRequest) @@ -181,27 +130,20 @@ { __CACHE_PRINT(_L("++RequestAllocator::GetMessageRequest() Open sub-sess")); iCacheLock.Wait(); - if(iFreeHead == NULL || iFreeHead->iNext == NULL) - { - if(AllocRequest(2)!= KErrNone) - { - iCacheLock.Signal(); - return KErrNoMemory; - } - } - aRequest= iFreeHead; //get our request from free head - iFreeHead = iFreeHead->iNext->iNext; //set next but one as new free head read for next - aRequest->iNext->iNext = NULL; //seperate our request and close from free list - CFsClientMessageRequest* CRp = aRequest->iNext; - aRequest->iNext = NULL; - if(iCloseHead) + aRequest = GetRequest(); + CFsClientMessageRequest* closeRequest = GetRequest(); + + if (aRequest == NULL || closeRequest == NULL) { - CRp->iNext = iCloseHead; //set second one as a reserved (tail) close request - iCloseHead = CRp; + delete aRequest; + delete closeRequest; + iCacheLock.Signal(); + return KErrNoMemory; } - else - iCloseHead = CRp; + + closeRequest->iNext = iCloseHead; //set second one as a reserved (tail) close request + iCloseHead = closeRequest; ((CSessionFs*) aMessage.Session())->CloseRequestCountInc(); } @@ -272,6 +214,7 @@ } iCacheLock.Wait(); + ASSERT(iCloseHead); aRequest = iCloseHead; iCloseHead = aRequest->iNext; ((CSessionFs*) aMessage.Session())->CloseRequestCountDec(); @@ -289,17 +232,12 @@ { __CACHE_PRINT(_L("++RequestAllocator::GetMessageRequest() ")); iCacheLock.Wait(); - if(!iFreeHead) + aRequest = GetRequest(); + if (aRequest == NULL) { - if(AllocRequest(1) != KErrNone) - { - iCacheLock.Signal(); - return KErrNoMemory; - } + iCacheLock.Signal(); + return KErrNoMemory; } - aRequest = iFreeHead; - iFreeHead = aRequest->iNext; - aRequest->iNext= NULL; } aRequest->Init(); @@ -322,126 +260,103 @@ #if defined(_USE_CONTROLIO) || defined(_DEBUG) || defined(_DEBUG_RELEASE) TInt RequestAllocator::CloseCount() {TInt count=0; + iCacheLock.Wait(); + CFsClientMessageRequest* list=iCloseHead; while(list!=NULL) { count++; list=list->iNext; } + + iCacheLock.Signal(); return(count); } TInt RequestAllocator::FreeCount() { TInt count=0; + iCacheLock.Wait(); CFsClientMessageRequest* list=iFreeHead; while(list!=NULL) { count++; list=list->iNext; } - return(count);} + ASSERT(count == iFreeCount); + iCacheLock.Signal(); + return(count); + } #endif -TInt RequestAllocator::AllocOperation() -// -// Allocates a group of TMsgOperation objects +TInt OperationAllocator::Initialise() + { + iFreeHead = NULL; + iRequestCount = 0; + iFreeCount = 0; + return iCacheLock.CreateLocal(); + } + +void OperationAllocator::FreeOperation(TMsgOperation* aOperation) // -// Must be called with iCacheLock held +// free Operation +// { - TInt i; - if(iAllocNumOperation < KMaxOperationAllocated) + __CACHE_PRINT1(_L("RequestAllocator::FreeOperation() returning %x to free list"), aOperation); + ASSERT(aOperation != NULL); + iCacheLock.Wait(); + if (iFreeCount >= KFreeCountMax) { - __CACHE_PRINT(_L("RequestAllocator::AllocOperation() Not reached the limit")); - TMsgOperation* list; - TMsgOperation* start; - list = new TMsgOperation[KAllocReqBlock]; - start = list; - if(!list) - return KErrNoMemory; - - for(TInt j=0; jiIsAllocated = EFalse; - } - - iAllocNumOperation += KAllocReqBlock; - TMsgOperation* last; - for(i=1;iiNext = list; - } - list->iNext = iFreeHeadSupOp; - iFreeHeadSupOp = start; - return KErrNone; + delete aOperation; + ASSERT(iRequestCount > 0); + iRequestCount--; } else { - __CACHE_PRINT(_L("RequestAllocator::AllocOperation() Limit exceeded")); - TMsgOperation* request; + aOperation->iNext = iFreeHead; + iFreeHead = aOperation; + iFreeCount++; + } - request=new TMsgOperation; - if(!request) - return KErrNoMemory; -#if defined(_USE_CONTROLIO) || defined(_DEBUG) || defined(_DEBUG_RELEASE) - iAllocated++; -#endif - request->iIsAllocated = ETrue; - request->iNext=iFreeHeadSupOp; - iFreeHeadSupOp=request; + iCacheLock.Signal(); + } - return KErrNone; - } - } -TInt RequestAllocator::GetOperation(TMsgOperation* &aOperation) +TInt OperationAllocator::GetOperation(TMsgOperation* &aOperation) // // tries to get a pre allocated subop from the cache. Failing that allocates one individualy // { __CACHE_PRINT(_L("RequestAllocator::GetOperation() ")); + iCacheLock.Wait(); - if(!iFreeHeadSupOp) + + TInt r = KErrNone; + if (iFreeHead == NULL) { - if(AllocOperation() != KErrNone) + aOperation = new TMsgOperation; + if (aOperation == NULL) + r = KErrNoMemory; + else { - iCacheLock.Signal(); - return KErrNoMemory; + iRequestCount++; + iRequestCountPeak = Max(iRequestCountPeak, iRequestCount); } } - aOperation = iFreeHeadSupOp; - iFreeHeadSupOp = aOperation->iNext; - aOperation->iNext = aOperation->iPrev = NULL; + else + { + aOperation = iFreeHead; + iFreeHead = iFreeHead->iNext; + iFreeCount--; + ASSERT(iFreeCount >= 0); + } + + if (aOperation) + aOperation->iNext = aOperation->iPrev = NULL; iCacheLock.Signal(); - return KErrNone; + return r; } -void RequestAllocator::FreeOperation(TMsgOperation* aOperation) -// -// free Operation -// - { - if(aOperation->iIsAllocated) - { - __CACHE_PRINT(_L("RequestAllocator::FreeOperation() Allocated subop")); - delete(aOperation); -#if defined(_USE_CONTROLIO) || defined(_DEBUG) || defined(_DEBUG_RELEASE) - iAllocated--; -#endif - return; - } - - __CACHE_PRINT(_L("RequestAllocator::FreeOperation() returning to free list")); - iCacheLock.Wait(); - aOperation->iNext = iFreeHeadSupOp; // NB backward link only used when request in in use - iFreeHeadSupOp = aOperation; - - iCacheLock.Signal(); - } - CFsRequest::CFsRequest() // @@ -1821,7 +1736,7 @@ TInt CFsMessageRequest::PushOperation(TFsRequestFunc aCallback, TInt aNextState, TInt aFunction) { TMsgOperation* nextOperation; - TInt r = RequestAllocator::GetOperation(nextOperation); + TInt r = OperationAllocator::GetOperation(nextOperation); if (r != KErrNone) return r; @@ -1949,7 +1864,7 @@ SetOperationFunc(iCurrentOperation->iFunction); } - RequestAllocator::FreeOperation(currentOperation); + OperationAllocator::FreeOperation(currentOperation); } TMsgOperation& CFsMessageRequest::CurrentOperation()