--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/drivers/resource_extend.h Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,198 @@
+// 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\include\drivers\resource_extend.h
+//
+// WARNING: This file contains some APIs which are internal and are subject
+// to change without notice. Such APIs should therefore not be used
+// outside the Kernel and Hardware Services package.
+//
+
+#ifndef __RESOURCE_EXTEND_H__
+#define __RESOURCE_EXTEND_H__
+
+#include <drivers/resource.h>
+
+#define ADD_DEPENDENCY_NODE(aNode, aDependencyList) \
+ { \
+ SNode* pDL = aDependencyList; \
+ SNode* prev = NULL; \
+ if(pDL == NULL) \
+ { \
+ aDependencyList = aNode; \
+ aNode->iNext = NULL; \
+ } \
+ else \
+ { \
+ while(pDL != NULL) \
+ { \
+ if(aNode->iPriority == pDL->iPriority) \
+ return KErrAlreadyExists; \
+ if(aNode->iPriority < pDL->iPriority) \
+ { \
+ if(prev == NULL) /*Add it to the head */ \
+ { \
+ aDependencyList = aNode; \
+ aNode->iNext = pDL; \
+ break; \
+ } \
+ prev->iNext = aNode; \
+ aNode->iNext = pDL; \
+ break; \
+ } \
+ if(pDL->iNext == NULL) /* Add it to the end */ \
+ { \
+ pDL->iNext = aNode; \
+ aNode->iNext = NULL; \
+ break; \
+ } \
+ prev = pDL; \
+ pDL = pDL->iNext; \
+ } \
+ } \
+ }
+
+//Check whether the priority already exists
+#define CHECK_IF_PRIORITY_ALREADY_EXISTS(aDependencyList, aPriority) \
+ { \
+ for(SNode* node = aDependencyList; node != NULL; node = node->iNext) \
+ { \
+ if(node->iPriority == aPriority) \
+ return KErrAlreadyExists; \
+ } \
+ }
+
+
+static const TUint KIdMaskStaticWithDependencies = 0x00010000;
+static const TUint KIdMaskDynamic = 0x00020000;
+static const TUint KIdMaskDynamicWithDependencies = 0x00030000;
+static const TUint KIdMaskResourceWithDependencies = 0x00010000;
+static const TInt KDynamicResourceDeRegistering = -2;
+
+struct SNode;
+struct SPowerResourceClientLevel;
+
+//Various stages of resource dependency state change operation.
+enum TPropagation
+ {
+ EChangeStart,
+ ECheckChangeAllowed,
+ ERequestStateChange,
+ EIssueNotifications
+ };
+
+//Return value of translate dependency state function. This is implemented by PSL for each resource.
+enum TChangePropagationStatus {EChange, ENoChange, EChangeNotAccepted};
+
+/**
+@publishedPartner
+@prototype 9.5
+class to represent dynamic resources
+*/
+class DDynamicPowerResource : public DStaticPowerResource
+ {
+public:
+ IMPORT_C DDynamicPowerResource(const TDesC8& aName, TInt aDefaultLevel);
+ IMPORT_C ~DDynamicPowerResource();
+public:
+ TBool InUse(); //Used by RC on deregistration to see if another client is having requirement on this resource
+ inline void Lock() {++iCount;} //Resource is locked whenever operation is scheduled in RC thread.
+ inline void UnLock() {--iCount;}
+ inline TUint LockCount() { return iCount;}
+protected:
+ TUint iCount;
+ TUint iOwnerId; //Stores the ID of the client that registers the resource
+ friend class DPowerResourceController;
+ };
+
+/**
+@publishedPartner
+@prototype 9.5
+*/
+typedef TBool (*TDependencyCustomFunction) (TInt& /*aClientId*/,
+ const TDesC8& /*aClientName*/,
+ TUint /*aResourceId*/,
+ TCustomOperation /*aCustomOperation*/,
+ TInt& /*aLevel*/,
+ TAny* /*aLevelList*/,
+ TAny* /*aResourceLevelList */,
+ TAny* /*aReserved*/); // For future use
+
+/**
+@publishedPartner
+@prototype 9.5
+class to represent static resource with dependency
+*/
+class DStaticPowerResourceD : public DStaticPowerResource
+ {
+public:
+ DStaticPowerResourceD(const TDesC8& aName, TInt aDefaultLevel);
+ TInt AddNode(SNode* aNode);
+ virtual TInt HandleChangePropagation(TPowerRequest aRequest, TPropagation aProp, TUint aOriginatorId, const TDesC8& aOriginatorName);
+ virtual TChangePropagationStatus TranslateDependentState(TInt aDepId, TInt aDepState, TInt& aResState) = 0;
+public:
+ SPowerResourceClientLevel* iResourceClientList; //To capture the dependent resource requirement on this resource
+ TDependencyCustomFunction iDepCustomFunction;
+private:
+ SNode* iDependencyList; //Dependency resource list
+ friend class DPowerResourceController;
+ };
+
+/**
+@publishedPartner
+@prototype 9.5
+class to represent dynamic resource with dependency
+*/
+class DDynamicPowerResourceD : public DDynamicPowerResource
+ {
+public:
+ IMPORT_C DDynamicPowerResourceD(const TDesC8& aName, TInt aDefaultLevel);
+ IMPORT_C ~DDynamicPowerResourceD();
+ IMPORT_C virtual TInt HandleChangePropagation(TPowerRequest aRequest, TPropagation aProp, TUint aOriginatorId, const TDesC8& aOriginatorName);
+ virtual TChangePropagationStatus TranslateDependentState(TInt aDepId, TInt aDepState, TInt& aResState) = 0;
+public:
+ SPowerResourceClientLevel* iResourceClientList; //To capture the dependent resource requirement on this resource
+ TDependencyCustomFunction iDepCustomFunction;
+private:
+ SNode* iDependencyList; //Dependency resource list
+ friend class DPowerResourceController;
+ };
+
+/**
+@publishedPartner
+@prototype 9.5
+structure to represent resource dependency information. This is used when registering resource dependency
+*/
+struct SResourceDependencyInfo
+ {
+ TUint iResourceId;
+ TUint8 iDependencyPriority;
+ };
+
+/**
+@publishedPartner
+@prototype 9.5
+structure to encapsulate dependent resource information.
+*/
+struct SNode
+ {
+ DStaticPowerResourceD* iResource;
+ TInt iPropagatedLevel;
+ TUint8 iRequiresChange;
+ TUint8 iVisited;
+ TUint8 iPriority;
+ TUint8 iSpare;
+ SNode* iNext;
+ };
+
+#endif