kernel/eka/drivers/resourceman/resource_extend.cpp
changeset 0 a41df078684a
child 31 56f325a607ea
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/drivers/resourceman/resource_extend.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,152 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// e32\drivers\resourceman\resource_extend.cpp
+// 
+//
+
+#include <drivers/resourcecontrol.h>
+
+/**
+    @publishedPartner
+    @prototype 9.5
+    Constructor for static resource with dependency
+    This sets the passed resource name and default level.
+	This also sets the corresponding bit to identify that it is static resource with dependencies.
+    @param aName The name for the resource to be set.
+	@param aDefaultLevel Default level of the resource. 
+    */
+DStaticPowerResourceD::DStaticPowerResourceD(const TDesC8& aName, TInt aDefaultLevel) :
+                                                           DStaticPowerResource(aName, aDefaultLevel)
+	{
+    __KTRACE_OPT(KRESMANAGER, Kern::Printf(">DStaticPowerResourceD::DStaticPowerResourceD"));
+	iResourceId |= KIdMaskStaticWithDependencies;
+	}
+
+/**
+    @publishedPartner
+    @prototype 9.5
+    Constructor for dynamic resource
+    This sets the passed resource name and default level and also sets the corresponding bit to identify 
+	that it is dynamic resource with no dependencies.
+    @param aName The name for the resource to be set.
+	@param aDefaultLevel Default level of the resource. 
+    */
+EXPORT_C DDynamicPowerResource::DDynamicPowerResource(const TDesC8& aName, TInt aDefaultLevel) : 
+	                                                       DStaticPowerResource(aName, aDefaultLevel)
+	{
+	//Set the corresponding to identify that it is dynamic resource with no dependencies
+	__KTRACE_OPT(KRESMANAGER, Kern::Printf(">DDynamicPowerResource::DDynamicPowerResource"));
+	iResourceId |= KIdMaskDynamic;
+	}
+
+/**
+    @publishedPartner
+    @prototype 9.5
+    Destructor for dynamic resource
+	Panics if the resource is still registered with PRM.
+    */
+EXPORT_C DDynamicPowerResource::~DDynamicPowerResource()
+	{
+	__KTRACE_OPT(KRESMANAGER, Kern::Printf(">DDynamocPowerResource::~DDynamicPowerResource"));
+	if(LockCount()) //Lock count is expected to be 0
+		DPowerResourceController::Panic(DPowerResourceController::EDynamicResourceStillRegistered);	
+	}
+
+/**
+    @publishedPartner
+    @prototype 9.5
+    Constructor for dynamic resource with dependencies
+    This sets the passed resource name and default level and also sets the corresponding bit to identify 
+	that it is dynamic resource with dependencies.
+    @param aName The name for the resource to be set.
+	@param aDefaultLevel Default level of the resource. 
+    */
+EXPORT_C DDynamicPowerResourceD::DDynamicPowerResourceD(const TDesC8& aName, TInt aDefaultLevel) : 
+	                                                   DDynamicPowerResource(aName, aDefaultLevel)
+	{
+	//Set the corresponding to identify that it is dynamic resource with no dependencies
+	__KTRACE_OPT(KRESMANAGER, Kern::Printf(">DDynamicPowerResourceD::DDynamicPowerResourceD"));
+	iResourceId |= KIdMaskDynamicWithDependencies;
+	}
+
+/**
+    @publishedPartner
+    @prototype 9.5
+    Destructor for dynamic resource with dependencies
+	Panics if the resource is still registered with PRM.
+    */
+EXPORT_C DDynamicPowerResourceD::~DDynamicPowerResourceD()
+	{
+	__KTRACE_OPT(KRESMANAGER, Kern::Printf(">DDynamocPowerResource::~DDynamicPowerResource"));
+	if(LockCount()) //Lock count is expected to be 0
+		DPowerResourceController::Panic(DPowerResourceController::EDynamicResourceStillRegistered);	
+	}
+
+/**
+    @internalComponent
+    @prototype 9.5
+    This function is called in response to PowerResourceManager::ControlIO(..) with 
+	KResManControlIoDeregisterDynamicResource and returns ETrue if this resource has a 
+	'client level' from another client in its 'client level' list.
+    */
+TBool DDynamicPowerResource::InUse()
+	{
+	SPowerResourceClientLevel* pRCL = NULL;
+	for(SDblQueLink* pRC = iClientList.First(); pRC != &iClientList.iA; pRC = pRC->iNext)
+		{
+		pRCL = (SPowerResourceClientLevel*)pRC;
+		if(pRCL->iClientId != iOwnerId)
+			return ETrue;
+		}
+	return EFalse;
+	}
+
+/**
+    @publishedPartner
+    @prototype 9.5
+    This function is used to establish the resource's dependency list for static resource and 
+	will be used by PSL to establish dependency between static resources.
+	Panics, if the passed priority is already in use
+    */
+TInt DStaticPowerResourceD::AddNode(SNode* aNode)
+	{
+	ADD_DEPENDENCY_NODE(aNode, iDependencyList)
+	return KErrNone;
+	}
+
+/**
+	@publishedPartner
+	@prototype 9.5
+	This function takes care of resource state change of dynamic dependency resource.
+	This propagates the change to all of its dependents.
+	*/
+EXPORT_C TInt DDynamicPowerResourceD::HandleChangePropagation(TPowerRequest aRequest, TPropagation aProp, TUint aOriginatorId, const TDesC8& aOriginatorName)
+	{
+	static TUint16 clientLevelCount = 0;
+	DDynamicPowerResourceD* pDR = (DDynamicPowerResourceD*)aRequest.Resource();
+	TInt result = KErrNone;
+	TInt resState = 0;
+	TPowerRequest depRequest;
+	depRequest.ReqType() = TPowerRequest::EChange;
+	depRequest.ResourceCb() = NULL;
+	depRequest.ReturnCode() = KErrNone;
+	depRequest.RequiresChange() = EFalse;
+	static DPowerResourceController* pRC = TInterface::GetPowerResourceController();
+	DDynamicPowerResourceD* pDepRes = NULL;
+	TBool traceEnabled = EFalse;
+#ifdef PRM_INSTRUMENTATION_MACRO
+	traceEnabled = ETrue;
+#endif
+	HANDLE_CHANGE_PROPAGATION(pRC, DDynamicPowerResourceD*, traceEnabled, aOriginatorId, aOriginatorName)
+	}