diff -r 4122176ea935 -r 56f325a607ea kernel/eka/drivers/resourceman/resourcecontrol.cpp --- a/kernel/eka/drivers/resourceman/resourcecontrol.cpp Mon Dec 21 16:14:42 2009 +0000 +++ b/kernel/eka/drivers/resourceman/resourcecontrol.cpp Wed Dec 23 11:43:31 2009 +0000 @@ -233,14 +233,9 @@ TInt TInterface::GetResourceState(TUint aClientId, TUint aResourceId, TBool aCached, TPowerResourceCb& aCb) { - GET_CRITICAL_SECTION_COUNT TInt r; __KTRACE_OPT(KRESMANAGER, Kern::Printf(">TInterface::GetResourceState")); r = PowerResourceController->GetResourceState(aClientId, aResourceId, aCached, aCb); - if(!&aCb) //Not checking incase of asynchronous function as mutex might be held in RC thread, when this is checked. - { - LOCK_AND_CRITICAL_SECTION_COUNT_CHECK - } return r; } @@ -345,29 +340,19 @@ DPowerResourceController::~DPowerResourceController() { __KTRACE_OPT(KRESMANAGER, Kern::Printf("DPowerResourceController::~DPowerResourceController()")); - //Push Power controller ID back to Pool - SPowerResourceClient* pC = NULL; - pC = iClientList[(TUint16)(iPowerControllerId & ID_INDEX_BIT_MASK)]; - if(pC) - { - iClientCount--; //Decrement client count - LIST_PUSH(iClientPool, pC, iNextInList); - } +#ifdef RESOURCE_MANAGER_SIMULATED_PSL + iCleanList.ResetAndDestroy(); +#endif iClientList.Delete(); iUserSideClientList.Delete(); + + + #ifdef PRM_ENABLE_EXTENDED_VERSION iDynamicResourceList.Delete(); iDynamicResDependencyList.Delete(); #endif - pC = iClientPool; - while(iClientPool) //Find the starting position of array to delete - { - if(iClientPool < pC) - pC = iClientPool; - iClientPool = iClientPool->iNextInList; - } - //delete pC; - delete []pC; + SPowerResourceClientLevel *pCL = iClientLevelPool; while(iClientLevelPool) //Find the starting position of array to delete { @@ -422,8 +407,8 @@ pN->iCallback.iLevel = aState; pN->iCallback.iClientId = aClientId; pN->iCallback.iLevelOwnerId = aLevelOwnerId; - __KTRACE_OPT(KRESMANAGER, Kern::Printf("Notification ClientId = 0x%x, ResourceId = %d, state = %d, \ - Result = %d", pN->iCallback.iClientId, pN->iCallback.iResourceId, aState, aReturnCode)); + __KTRACE_OPT(KRESMANAGER, Kern::Printf("Notification ClientId = 0x%x, ResourceId = %d, state = %d, Result = %d", + pN->iCallback.iClientId, pN->iCallback.iResourceId, aState, aReturnCode)); PRM_POSTNOTIFICATION_SENT_TRACE pN->iCallback.Enque(); continue; @@ -437,8 +422,8 @@ pN->iCallback.iLevel=aState; pN->iCallback.iClientId = aClientId; pN->iCallback.iLevelOwnerId = aLevelOwnerId; - __KTRACE_OPT(KRESMANAGER, Kern::Printf("Notifications ClientId = 0x%x, ResourceId = %d, State = %d, \ - Result = %d", pN->iCallback.iClientId, pN->iCallback.iResourceId, aState, aReturnCode)); + __KTRACE_OPT(KRESMANAGER, Kern::Printf("Notifications ClientId = 0x%x, ResourceId = %d, State = %d, Result = %d", + pN->iCallback.iClientId, pN->iCallback.iResourceId, aState, aReturnCode)); PRM_POSTNOTIFICATION_SENT_TRACE pN->iCallback.Enque(); } @@ -515,7 +500,7 @@ else pC = iClientList[TUint16(aClientId & ID_INDEX_BIT_MASK)]; #endif - __KTRACE_OPT(KRESMANAGER, Kern::Printf("Request Type = %d, ClientId = 0x%x, ResourceId = %d", \ + __KTRACE_OPT(KRESMANAGER, Kern::Printf("Request Type = %d, ClientId = 0x%x, ResourceId = %d", aRequest.ReqType(), aRequest.ClientId(), aRequest.ResourceId())); if(aRequest.ReqType()==TPowerRequest::EChange) { @@ -604,7 +589,8 @@ aRequest.Level() = pR->iDefaultLevel; } } - aRequest.ReturnCode() = pR->DoRequest(aRequest); + if((aRequest.ReqType() == TPowerRequest::EGet) || (pR->iCachedLevel != aRequest.Level())) + aRequest.ReturnCode() = pR->DoRequest(aRequest); CompleteRequest(aRequest); __KTRACE_OPT(KRESMANAGER, Kern::Printf("DPowerResourceController::MsgQFunc")); DPowerResourceController* pRC=(DPowerResourceController*)aPtr; TPowerRequest* aReq=(TPowerRequest*)pRC->iMsgQ->iMessage; + DStaticPowerResource *pR = aReq->Resource(); if(aReq->ReqType() == TPowerRequest::EAllocReserve) { aReq->ReturnCode() = pRC->HandleReservationOfObjects(*aReq); @@ -704,7 +691,6 @@ else pC = pRC->iClientList[TUint16(aReq->ClientId() & ID_INDEX_BIT_MASK)]; - DStaticPowerResource *pR = aReq->Resource(); TUint aResourceId = aReq->ResourceId(); TInt r = aReq->ReturnCode(); if(aReq->ReqType()==TPowerRequest::EGet) @@ -743,6 +729,7 @@ __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::MsgQDependencyFunc")); DPowerResourceController* pRC=(DPowerResourceController*)aPtr; TPowerRequest* aReq=(TPowerRequest*)pRC->iMsgQDependency->iMessage; + DStaticPowerResource *pR = aReq->Resource(); pRC->HandleDependencyMsg(*aReq); if((aReq->ResourceId() & KIdMaskDynamic) && (aReq->ResourceCb())) { @@ -777,7 +764,6 @@ else pC = pRC->iClientList[TUint16(aReq->ClientId() & ID_INDEX_BIT_MASK)]; - DStaticPowerResource *pR = aReq->Resource(); TUint aResourceId = aReq->ResourceId(); TInt r = aReq->ReturnCode(); if(aReq->ReqType()==TPowerRequest::EGet) @@ -864,10 +850,10 @@ SPowerResourceClient * pC = NULL; // By now client pool should be created LIST_POP(iClientPool, pC, iNextInList); + TUint16 growBy = iClientList.GrowBy(); if(!pC) { UnLock(); - TUint16 growBy = iClientList.GrowBy(); // coverity[alloc_fn] SPowerResourceClient *pCL = new SPowerResourceClient[growBy]; if(!pCL) @@ -875,8 +861,9 @@ __KTRACE_OPT(KRESMANAGER, Kern::Printf("No memory to grow client pool")); Panic(ENoMemToCreatePowerControllerClient); } - if(iClientList.ReSize(growBy)) - Panic(ENoMemToCreatePowerControllerClient); +#ifdef RESOURCE_MANAGER_SIMULATED_PSL + iCleanList.Append(pCL); +#endif Lock(); for(count = 0; count < growBy-1; count++) LIST_PUSH(iClientPool, &pCL[count], iNextInList); @@ -887,7 +874,16 @@ #endif } pC->iName = (const TDesC8*)&KPowerController; - iClientList.Add(pC, iPowerControllerId); + UnLock(); + if(iClientList.Allocd()==iClientList.Count()) + { + if(iClientList.ReSize(growBy)) + { + Panic(ENoMemToCreatePowerControllerClient); + } + } + Lock(); + iClientList.Add(pC, iPowerControllerId); pC->iClientId = iPowerControllerId | CLIENT_POWER_CONTROLLER_BIT_MASK; iPowerControllerId = pC->iClientId; iClientCount++; @@ -951,8 +947,8 @@ TInt DPowerResourceController::CheckLevelAndAddClient(SPowerResourceClient* pC, TPowerRequest* aReq) { //Client level addition in state change needs to be taken care. - __KTRACE_OPT(KRESMANAGER, Kern::Printf("DPowerResourceController::CheckLevelAndAddClient, ClientId = 0x%x, \ - ResourceId = %d, ReqType = %d", pC->iClientId, aReq->ResourceId(), aReq->ReqType())); + __KTRACE_OPT(KRESMANAGER, Kern::Printf("DPowerResourceController::CheckLevelAndAddClient, ClientId = 0x%x, ResourceId = %d, ReqType = %d", + pC->iClientId, aReq->ResourceId(), aReq->ReqType())); SPowerResourceClientLevel* pSCL=NULL; //Place to hold the current client SPowerResourceClientLevel* pMCL=NULL; //Place to hold the prevailing client. @@ -1009,8 +1005,8 @@ // and add it to the client list and in resource list. if((pC->iReservedCl ==0) && !iClientLevelPoolCount) { - __KTRACE_OPT(KRESMANAGER, Kern::Printf("Client level quota exhausted and its free pool empty, \ - iReservedCl = %d, iClientLevelPoolCount = %d", pC->iReservedCl, iClientLevelPoolCount)); + __KTRACE_OPT(KRESMANAGER, Kern::Printf("Client level quota exhausted and its free pool empty, iReservedCl = %d, iClientLevelPoolCount = %d", + pC->iReservedCl, iClientLevelPoolCount)); return KErrUnderflow; } LIST_POP(iClientLevelPool, pSCL, iNextInList); @@ -1132,7 +1128,7 @@ if(((aResource->Sense() == DStaticPowerResource::ENegative) && aReq->Level()Sense() == DStaticPowerResource::EPositive) && aReq->Level()>CurrentLevel)) { - __KTRACE_OPT(KRESMANAGER, Kern::Printf("Resource is in increasing order with respect to sense and level is %d",\ + __KTRACE_OPT(KRESMANAGER, Kern::Printf("Resource is in increasing order with respect to sense and level is %d", aReq->Level())); aReq->RequiresChange()=ETrue; return KErrNone; @@ -1190,7 +1186,7 @@ TInt DPowerResourceController::InitPools(TUint16 aKClients, TUint16 aUClients, TUint16 aNClientLevels, TUint16 aNRequests) { __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::InitPools")); - __KTRACE_OPT(KRESMANAGER, Kern::Printf("aKClients = %d, aUClients = %d, aNClientLevels = %d, aNRequests = %d", \ + __KTRACE_OPT(KRESMANAGER, Kern::Printf("aKClients = %d, aUClients = %d, aNClientLevels = %d, aNRequests = %d", aKClients, aUClients, aNClientLevels, aNRequests)); __ASSERT_ALWAYS((iInitialised == EResConCreated) && !(iClientPool || iRequestPool || iClientLevelPool), Kern::Fault("Already initialized" __FILE__, __LINE__)); @@ -1267,6 +1263,9 @@ return KErrNoMemory; } } +#ifdef RESOURCE_MANAGER_SIMULATED_PSL + iCleanList.Append(pC); +#endif Lock(); TUint16 c; for(c = 0; c < iStaticResDependencyCount; c++) @@ -1275,6 +1274,9 @@ } iResourceLevelPoolCount = iStaticResDependencyCount; #else +#ifdef RESOURCE_MANAGER_SIMULATED_PSL + iCleanList.Append(pC); +#endif Lock(); TUint16 c; #endif @@ -1344,8 +1346,7 @@ */ TInt DPowerResourceController::RegisterClient(TUint& aClientId, const TDesC8& aName, TOwnerType aType) { - __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::RegisterClient, Name = %S, \ - Type = %d", &aName, aType)); + __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::RegisterClient, Name = %S, Type = %d", &aName, aType)); DThread& thread = Kern::CurrentThread(); CHECK_CONTEXT(thread) //If number of expected kernel side clients is set to 0 during initial configuration @@ -1414,25 +1415,22 @@ { //Get Next client from FreePool LIST_POP(iClientPool, pC, iNextInList); + + TUint16 growBy = iClientList.GrowBy(); if(!pC) { //Free Pool is empty, so try to grow the pool. - TUint16 growBy = iClientList.GrowBy(); __KTRACE_OPT(KRESMANAGER, Kern::Printf("Client pool exhausted so growing client Pool by %d", growBy)); // coverity[alloc_fn] - SPowerResourceClient *pCL = new SPowerResourceClient[growBy]; + SPowerResourceClient *pCL = (SPowerResourceClient*)Kern::Alloc(sizeof(SPowerResourceClient) * growBy); if(!pCL) { __KTRACE_OPT(KRESMANAGER, Kern::Printf("No memory to grow client pool")); return(KErrNoMemory); } - //Resize the container for holding client list - if(!iClientList.ReSize(growBy)) - { - __KTRACE_OPT(KRESMANAGER, Kern::Printf("No memory for client container allocation")); - delete []pCL; - return(KErrNoMemory); - } +#ifdef RESOURCE_MANAGER_SIMULATED_PSL + iCleanList.Append(pCL); +#endif Lock(); TUint16 count; for(count = 0; count < growBy-1; count++) @@ -1445,6 +1443,15 @@ pC = &pCL[count]; } pC->iClientId = 0; + if(iClientList.Allocd()==iClientList.Count()) + { + //Resize the container for holding client list + if(iClientList.ReSize(growBy)!=KErrNone) + { + __KTRACE_OPT(KRESMANAGER, Kern::Printf("No memory for client container allocation")); + return(KErrNoMemory); + } + } Lock(); iClientList.Add(pC, clientId); ++iClientCount; @@ -1454,22 +1461,18 @@ { //Get Next client from FreePool LIST_POP(iClientPool, pC, iNextInList); + TUint16 growBy = iUserSideClientList.GrowBy(); if(!pC) { //Free Pool is empty, so try to grow the pool. - TUint16 growBy = iUserSideClientList.GrowBy(); - SPowerResourceClient* pCL = new SPowerResourceClient[growBy]; + SPowerResourceClient *pCL = (SPowerResourceClient*)Kern::Alloc(sizeof(SPowerResourceClient) * growBy); if(!pCL) { return KErrNoMemory; } - //Resize the container for holding client list - if(!iUserSideClientList.ReSize(growBy)) - { - __KTRACE_OPT(KRESMANAGER, Kern::Printf("No memory for container class allocation")); - delete []pCL; - return KErrNoMemory; - } +#ifdef RESOURCE_MANAGER_SIMULATED_PSL + iCleanList.Append(pCL); +#endif Lock(); TUint16 count; for(count = 0; count < growBy - 1; count++) @@ -1485,6 +1488,15 @@ //User side clients are always thread relative as they execute in the context of proxy driver. pC->iClientId = CLIENT_THREAD_RELATIVE_BIT_MASK; //Set 31st bit; pC->iClientId|=USER_SIDE_CLIENT_BIT_MASK; + if(iUserSideClientList.Allocd()==iUserSideClientList.Count()) + { + //Resize the container for holding client list + if(iUserSideClientList.ReSize(growBy)!=KErrNone) + { + __KTRACE_OPT(KRESMANAGER, Kern::Printf("No memory for container class allocation")); + return KErrNoMemory; + } + } Lock(); iUserSideClientList.Add(pC, clientId); ++iUserSideClientCount; @@ -1522,13 +1534,11 @@ __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::ResourceStateChangeOfClientLevels")); TPowerRequest* pReq = (TPowerRequest*)&TPowerRequest::Get(); DStaticPowerResource* pR = NULL; - TInt r = KErrNone; SPowerResourceClientLevel* pCL = pC->iLevelList; SPowerResourceClientLevel* pCLL = NULL; while(pCL != NULL) { - __KTRACE_OPT(KRESMANAGER, Kern::Printf("Client 0x%x has requirement on resource %d", pCL->iClientId, \ - pCL->iResourceId)); + __KTRACE_OPT(KRESMANAGER, Kern::Printf("Client 0x%x has requirement on resource %d", pCL->iClientId, pCL->iResourceId)); #ifdef PRM_ENABLE_EXTENDED_VERSION switch((pCL->iResourceId >>RESOURCE_BIT_IN_ID_CHECK) & 0x3) { @@ -1549,10 +1559,10 @@ pR = iStaticResourceArray[pCL->iResourceId -1]; #endif #ifdef PRM_ENABLE_EXTENDED_VERSION - if((((TInt)pCL->iClientId == pR->iLevelOwnerId) || (pR->Sense() == DStaticPowerResource::ECustom)) && (!(pCL->iResourceId & KIdMaskDynamic) || + if(((pR->Sense() == DStaticPowerResource::ECustom) || ((TInt)pCL->iClientId == pR->iLevelOwnerId)) && (!(pCL->iResourceId & KIdMaskDynamic) || ((pCL->iResourceId & KIdMaskDynamic) && (((DDynamicPowerResource*)pR)->LockCount() != 0)))) #else - if(((TInt)pCL->iClientId == pR->iLevelOwnerId) || (pR->Sense() == DStaticPowerResource::ECustom)) + if((pR->Sense() == DStaticPowerResource::ECustom) || ((TInt)pCL->iClientId == pR->iLevelOwnerId)) #endif { pReq->ReqType() = TPowerRequest::ESetDefaultLevel; @@ -1562,13 +1572,13 @@ pReq->Level() = pR->iCachedLevel; pReq->ResourceCb() = NULL; pReq->ReturnCode() = KErrNone; - r = KErrNone; #ifdef PRM_INSTRUMENTATION_MACRO //Setting level to current level as correct level will be known only at the end, TInt aNewState = pR->iCachedLevel; TUint aResourceId = pReq->ResourceId(); PRM_CLIENT_CHANGE_STATE_START_TRACE #endif + TInt r = KErrNone; if(pR->LatencySet()) { #ifdef PRM_ENABLE_EXTENDED_VERSION @@ -1600,15 +1610,21 @@ pReq->ClientId() = -1; pReq->Level() = pR->iDefaultLevel; } + if((!pR->Usage()) || (pR->Usage() && pReq->RequiresChange())) { // NOTE:Not checking error here as no action can be taken based on error. - UnLock(); - r = pR->DoRequest(*pReq); - Lock(); + if(pR->iCachedLevel != pReq->Level()) + { + UnLock(); + r = pR->DoRequest(*pReq); + Lock(); + } CompleteNotifications(pReq->ClientId(), pReq->Resource(), pReq->Level(), pReq->ReturnCode(), pReq->ClientId(), EFalse); +#ifdef PRM_INSTRUMENTATION_MACRO PRM_CLIENT_CHANGE_STATE_END_TRACE +#endif pR->iLevelOwnerId = pReq->ClientId(); pR->iCachedLevel = pReq->Level(); if(pR->iIdleListEntry) @@ -1619,6 +1635,7 @@ } } } + } /* Deque from resource */ pCLL = pCL; @@ -1744,8 +1761,7 @@ */ TInt DPowerResourceController::GetClientName(TUint aClientId, TUint aTargetClientId, TDes8& aName) { - __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::GetClientName, CallingClientId = 0x%x, \ - TargetClientId = 0x%x", aClientId, aTargetClientId)); + __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::GetClientName, CallingClientId = 0x%x, TargetClientId = 0x%x", aClientId, aTargetClientId)); DThread& thread = Kern::CurrentThread(); CHECK_CONTEXT(thread) if((aName.MaxLength() - aName.Length()) < KMaxClientNameLength) @@ -1791,8 +1807,7 @@ */ TInt DPowerResourceController::GetClientId(TUint aClientId, TDesC8& aClientName, TUint& aTargetClientId) { - __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::GetClientId CallingClientId = 0x%x, \ - ClientName = %S", aClientId, &aClientName)); + __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::GetClientId CallingClientId = 0x%x, ClientName = %S", aClientId, &aClientName)); DThread& thread = Kern::CurrentThread(); CHECK_CONTEXT(thread) if(aClientName.Length() > KMaxClientNameLength) @@ -1854,8 +1869,7 @@ if((iStaticResourceArray[count]) && (!(aResourceName.Compare(*(const TDesC8*)iStaticResourceArray[count]->iName)))) { aResourceId = ++count; - __KTRACE_OPT(KRESMANAGER, Kern::Printf("iName))) { aResourceId = iStaticResDependencyArray[count]->iResourceId; - __KTRACE_OPT(KRESMANAGER, Kern::Printf("iNextInList; } - __KTRACE_OPT(KRESMANAGER, Kern::Printf("Append(buf); } aNumResources = count; - __KTRACE_OPT(KRESMANAGER, Kern::Printf("iClientList.First(); pCL != &pR->iClientList.iA; pCL=pCL->iNext) aNumClients++; - __KTRACE_OPT(KRESMANAGER, Kern::Printf("Append(TPckgC(info)); } aNumClients = c; - __KTRACE_OPT(KRESMANAGER, Kern::Printf("DPowerResourceController::ChangeResourceState")); __KTRACE_OPT(KRESMANAGER, Kern::Printf("ClientId = 0x%x, ResourceId = %d, NewState = %d", aClientId, \ aResourceId, aNewState)); + DThread& thread = Kern::CurrentThread(); CHECK_CONTEXT(thread) if(iInitialised <= EResConCreated) return KErrNotReady; - DThread& thread = Kern::CurrentThread(); if(!aResourceId) return KErrNotFound; SPowerResourceClient* pC = NULL; @@ -2466,6 +2473,11 @@ if(!pR) UNLOCK_RETURN(KErrNotFound); #endif + //Return if the resource is already in that state and client is also the same. + if((aNewState == pR->iCachedLevel) && ((TInt)aClientId == pR->iLevelOwnerId)) + UNLOCK_RETURN(KErrNone); + + PRM_CLIENT_CHANGE_STATE_START_TRACE //If long latency resource requested synchronously from DFC thread 0 Panic @@ -2723,12 +2735,12 @@ TInt& aLevelOwnerId) { __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::GetResourceState(synchronous)")); - __KTRACE_OPT(KRESMANAGER, Kern::Printf("ClientId = 0x%x, ResourceId = %d, Cached = %d", aClientId, aResourceId,\ - aCached)); + __KTRACE_OPT(KRESMANAGER, Kern::Printf("ClientId = 0x%x, ResourceId = %d, Cached = %d", aClientId, aResourceId, aCached)); + + DThread& thread = Kern::CurrentThread(); CHECK_CONTEXT(thread) if(iInitialised <= EResConCreated) return KErrNotReady; - DThread& thread = Kern::CurrentThread(); SPowerResourceClient* pC = NULL; TInt r = KErrNone; Lock(); @@ -2817,8 +2829,7 @@ ((DDynamicPowerResource*)pR)->UnLock(); #endif UnLock(); - __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::GetResourceState(synchronous), Level = %d",\ - aState)); + __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::GetResourceState(synchronous), Level = %d", aState)); if(pR->LatencyGet()) //For long latency resource btrace is done in controller thread. return r; PRM_RESOURCE_GET_STATE_END_TRACE @@ -2869,20 +2880,18 @@ TInt DPowerResourceController::GetResourceState(TUint aClientId, TUint aResourceId, TBool aCached, TPowerResourceCb& aCb) { __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::GetResourceState(asynchronous)")); - __KTRACE_OPT(KRESMANAGER, Kern::Printf("ClientId = 0x%x, ResourceId = %d, Cached = %d", aClientId, aResourceId, \ - aCached)); + __KTRACE_OPT(KRESMANAGER, Kern::Printf("ClientId = 0x%x, ResourceId = %d, Cached = %d", aClientId, aResourceId, aCached)); + + DThread& thread = Kern::CurrentThread(); CHECK_CONTEXT(thread) if(iInitialised <= EResConCreated) return KErrNotReady; - DThread& thread = Kern::CurrentThread(); SPowerResourceClient* pC = NULL; TInt r = KErrNone; Lock(); VALIDATE_CLIENT(thread); if(!aResourceId) UNLOCK_RETURN(KErrNotFound); - if(!&aCb) //Need to specify a callback for this asynchronous API - UNLOCK_RETURN(KErrArgument); #ifdef PRM_ENABLE_EXTENDED_VERSION DStaticPowerResource *pR = NULL; GET_RESOURCE_FROM_LIST(aResourceId, pR) @@ -2899,12 +2908,10 @@ if(!pR) UNLOCK_RETURN(KErrNotFound); #endif - if(&aCb) - { - aCb.iResult = KErrNone; - aCb.iResourceId = aResourceId; - aCb.iClientId = aClientId; - } + aCb.iResult = KErrNone; + aCb.iResourceId = aResourceId; + aCb.iClientId = aClientId; + PRM_RESOURCE_GET_STATE_START_TRACE if(aCached) //Call the callback directly { @@ -2985,8 +2992,7 @@ aCb.iCallback(aClientId, aResourceId, req->Level(), pR->iLevelOwnerId, r, aCb.iParam); aCb.iResult = KErrCompletion; //Mark the callback object to act properly during cancellation of this request. } - __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::GetResourceState(asynchronous), Level = %d", \ - req->Level())); + __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::GetResourceState(asynchronous), Level = %d", req->Level())); if(pR->LatencyGet()) return r; #ifdef PRM_INSTRUMENTATION_MACRO @@ -3051,13 +3057,17 @@ { __KTRACE_OPT(KRESMANAGER, Kern::Printf("aCb.iClientId = 0x%x, aClientId = 0x%x", aCb.iClientId, aClientId)); r = KErrAccessDenied; +#ifdef PRM_INSTRUMENTATION_MACRO PRM_RESOURCE_CANCEL_LONGLATENCY_OPERATION_TRACE +#endif UNLOCK_RETURN(r); } if(aCb.iResult == KErrCompletion) { r = KErrCompletion; +#ifdef PRM_INSTRUMENTATION_MACRO PRM_RESOURCE_CANCEL_LONGLATENCY_OPERATION_TRACE +#endif UNLOCK_RETURN(r); } //Search in the controller message queue for this message @@ -3075,7 +3085,9 @@ pRM->Deque(); pMsgQ->iState = TMessageBase::EFree; //Reset the state MoveRequestToFreePool(pReq); +#ifdef PRM_INSTRUMENTATION_MACRO PRM_RESOURCE_CANCEL_LONGLATENCY_OPERATION_TRACE +#endif UNLOCK_RETURN(r); } } @@ -3093,12 +3105,16 @@ pRM->Deque(); pMsgQ->iState = TMessageBase::EFree; //Reset the state MoveRequestToFreePool(pReq); +#ifdef PRM_INSTRUMENTATION_MACRO PRM_RESOURCE_CANCEL_LONGLATENCY_OPERATION_TRACE +#endif UNLOCK_RETURN(r); } } } +#ifdef PRM_INSTRUMENTATION_MACRO PRM_RESOURCE_CANCEL_LONGLATENCY_OPERATION_TRACE +#endif UNLOCK_RETURN(r); } @@ -3669,8 +3685,7 @@ TInt DPowerResourceController::RegisterResourcesForIdle(TInt aPowerControllerId, TUint aNumResources, TPtr* aBuf) { __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::RegisterResourceForIdle")); - __KTRACE_OPT(KRESMANAGER, Kern::Printf("PowerControllerId = 0x%x, NumResources = %d", aPowerControllerId, \ - aNumResources)); + __KTRACE_OPT(KRESMANAGER, Kern::Printf("PowerControllerId = 0x%x, NumResources = %d", aPowerControllerId, aNumResources)); #ifdef DEBUG_VERSION //Surrounding with macro to avoid warnings. DThread& t = Kern::CurrentThread(); CHECK_CONTEXT(t) @@ -3685,9 +3700,10 @@ return KErrArgument; GET_CRITICAL_SECTION_COUNT Lock(); - SIdleResourceInfo* pS=(SIdleResourceInfo*)aBuf; + SIdleResourceInfo* pS=(SIdleResourceInfo*)aBuf->Ptr(); DStaticPowerResource* pR=NULL; - TUint count=0, id=0; + TUint count=0; + TUint id=0; for(count=0;countiResourceId) || ((pS->iResourceId & KIdMaskResourceWithDependencies) && - (pS->iResourceId > iStaticResDependencyCount)) || (pS->iResourceId > iStaticResourceArrayEntries) - || (!iStaticResourceArray[pS->iResourceId-1])) + (pS->iResourceId > iStaticResDependencyCount)) || (!(pS->iResourceId & KIdMaskResourceWithDependencies) && + ((pS->iResourceId > iStaticResourceArrayEntries) || (!iStaticResourceArray[pS->iResourceId-1])))) { UnLock(); LOCK_AND_CRITICAL_SECTION_COUNT_CHECK @@ -3715,7 +3731,7 @@ #endif pS++; } - pS = (SIdleResourceInfo*)aBuf; + pS = (SIdleResourceInfo*)aBuf->Ptr(); for(count=0;countiResourceId; @@ -3725,10 +3741,13 @@ else #endif pR=iStaticResourceArray[id-1]; + pS->iLevelOwnerId = pR->iLevelOwnerId; + pS->iCurrentLevel = pR->iCachedLevel; pR->iIdleListEntry=pS; pS++; } - iListForIdle=(SIdleResourceInfo*)aBuf; + iListForIdle=(SIdleResourceInfo*)aBuf->Ptr(); + pS = (SIdleResourceInfo*)aBuf->Ptr(); UnLock(); LOCK_AND_CRITICAL_SECTION_COUNT_CHECK return KErrNone; @@ -3903,11 +3922,11 @@ TAny* aParam3) { __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DPowerResourceController::GetInterface")); + DThread& thread = Kern::CurrentThread(); CHECK_CONTEXT(thread) if((iInitialised != EResConStartupCompleted) && (aInterfaceId != KResManControlIoGetVersion)) return KErrNotSupported; TInt r = KErrNone; - DThread& thread = Kern::CurrentThread(); Lock(); SPowerResourceClient* pC = NULL; VALIDATE_CLIENT(thread);