]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - keystone-rtos/rm-lld.git/commitdiff
Added number of current owners for resource to response information and started clean...
authorJustin Sobota <jsobota@ti.com>
Tue, 19 Mar 2013 22:40:34 +0000 (18:40 -0400)
committerJustin Sobota <jsobota@ti.com>
Tue, 19 Mar 2013 22:40:34 +0000 (18:40 -0400)
include/rm_internal.h
rm_services.h
src/rm_allocator.c
src/rm_services.c

index f9af2bdf56a8654b4c4c19cd912dd1ea5835e212..73adccc9420ee791e057914b086516e36922d2b1 100644 (file)
@@ -98,6 +98,9 @@ typedef struct {
     uint32_t length;
     /* Resource alignment */
     int32_t  alignment;
+    /* Resource owner count - number of instances that are in the
+     * resource's owner list */
+    int32_t  ownerCount;
     /* NameServer name tied to resource */
     char     nameServerName[RM_NAME_MAX_CHARS];
 } Rm_ResourceInfo;
index 2968a97891184b955a91f104e756fea1cf141eaf..07a72cf650276b6bff975f2cfec14a31c6123f96 100644 (file)
@@ -101,6 +101,10 @@ typedef struct {
     /** The resource length starting at base allocated, freed, or mapped to
      *  NameServer name. */
     uint32_t  resourceLength;
+    /** Current number of owners for the returned resource.  A value greater
+     *  than one means the resource is being shared.  This value is only valid
+     *  if the serviceState is RM_SERVICE_APPROVED or RM_SERVICE_APPROVED_STATIC. */
+    int32_t   resourceNumOwners;
 } Rm_ServiceRespInfo;
 
 /** 
index c8dd87d45f93697ebd1bcf81e9e99fd5480588cc..c6fe328c974d11b0194b5873e641fbc86470e274 100644 (file)
@@ -74,10 +74,10 @@ static Rm_Allocator *allocatorAdd(Rm_Handle rmHandle, const char *resourceName)
     Rm_Allocator *allocators   = rmInst->u.server.allocators;
     Rm_Allocator *newAllocator = NULL;
 
-    newAllocator = Rm_osalMalloc(sizeof(Rm_Allocator));
+    newAllocator = Rm_osalMalloc(sizeof(*allocators));
 
     if (newAllocator) {
-        memset((void *)newAllocator, 0, sizeof(Rm_Allocator));
+        memset((void *)newAllocator, 0, sizeof(*newAllocator));
         strncpy(newAllocator->resourceName, resourceName, RM_NAME_MAX_CHARS);
         newAllocator->allocatorRootEntry = NULL;
         newAllocator->nextAllocator = NULL;  
@@ -111,7 +111,7 @@ static int32_t allocatorCreate(Rm_Handle rmHandle, const char *resourceName, Rm_
     Rm_ResourceNode *treeNode = NULL;
 
     allocator = allocatorAdd(rmHandle, resourceName);
-    treeRoot = Rm_osalMalloc(sizeof(Rm_ResourceTree));
+    treeRoot = Rm_osalMalloc(sizeof(*treeRoot));
     RB_INIT(treeRoot);
 
     while (range != NULL) {
@@ -168,8 +168,8 @@ static int32_t allocatorDelete(Rm_Handle rmHandle, const char *resourceName)
                RB_REMOVE(_Rm_AllocatorResourceTree, treeRoot, nextNode);
             rmResourceNodeFree(node);
         }
-        Rm_osalFree((void *)treeRoot, sizeof(Rm_ResourceTree));        
-        Rm_osalFree((void *)allocator, sizeof(Rm_Allocator));
+        Rm_osalFree((void *)treeRoot, sizeof(*treeRoot));        
+        Rm_osalFree((void *)allocator, sizeof(*allocator));
     }
     else {
         retVal = RM_ERROR_RES_ALLOCATOR_DOES_NOT_EXIST;
@@ -188,7 +188,7 @@ static void allocatorResNodeOwnerAdd(Rm_Handle rmHandle, Rm_ResourceNode *node,
     Rm_Owner *ownerList = node->ownerList;
     Rm_Owner *newOwner = NULL;
 
-    newOwner = Rm_osalMalloc(sizeof(Rm_Owner));
+    newOwner = Rm_osalMalloc(sizeof(*newOwner));
 
     if (newOwner) {
         newOwner->instNameNode = serviceInstNode;
@@ -229,7 +229,7 @@ static int allocatorResNodeOwnerCompare(Rm_Handle rmHandle, Rm_ResourceNode *nod
 
     if (rmInst->instType == Rm_instType_SHARED_SERVER) {
         while(node2Owners) {
-            Rm_osalBeginMemAccess((void *)node2Owners, sizeof(Rm_Owner));
+            Rm_osalBeginMemAccess((void *)node2Owners, sizeof(*node2Owners));
             node2Owners = node2Owners->nextOwner;
         }
         node2Owners = node2->ownerList;
@@ -294,7 +294,7 @@ static void allocatorResNodeOwnerDelete(Rm_Handle rmHandle, Rm_ResourceNode *nod
     node->allocationCount--;
     owner->instNameNode->allocRefCount--;
     RM_SS_OBJ_WB(owner->instNameNode, Rm_PolicyValidInstNode);
-    Rm_osalFree((void *)owner, sizeof(Rm_Owner));
+    Rm_osalFree((void *)owner, sizeof(*owner));
 }
 
 /* FUNCTION PURPOSE: Copies the owners of a resource node
@@ -314,7 +314,7 @@ static void allocatorResNodeOwnerCopy(Rm_Handle rmHandle, Rm_ResourceNode *dstNo
 
     while (srcOwnerList) {
         RM_SS_OBJ_INV(srcOwnerList, Rm_Owner);
-        dstNewOwner = Rm_osalMalloc(sizeof(Rm_Owner));
+        dstNewOwner = Rm_osalMalloc(sizeof(*dstNewOwner));
         dstNewOwner->instNameNode = srcOwnerList->instNameNode;
         dstNewOwner->nextOwner = NULL;
         RM_SS_OBJ_WB(dstNewOwner, Rm_Owner);
@@ -348,7 +348,7 @@ static void allocatorResNodeOwnerClear(Rm_Handle rmHandle, Rm_ResourceNode *node
         node->allocationCount--;
         owner->instNameNode->allocRefCount--;
         RM_SS_OBJ_WB(owner->instNameNode, Rm_PolicyValidInstNode);
-        Rm_osalFree((void *)owner, sizeof(Rm_Owner));
+        Rm_osalFree((void *)owner, sizeof(*owner));
         owner = nextOwner;
     }
 }
@@ -412,12 +412,12 @@ static int32_t allocatorPreAllocate(Rm_Handle rmHandle, Rm_Allocator *allocator,
         opInfo->resourceInfo->alignment = 1;
     }    
 
-    memset((void *)&findNode, 0, sizeof(Rm_ResourceNode));
+    memset((void *)&findNode, 0, sizeof(findNode));
     findNode.base = opInfo->resourceInfo->base;
     findNode.length = opInfo->resourceInfo->length;
 
     /* Configure policy checking structure */
-    memset((void *)&policyCheckCfg, 0, sizeof(Rm_PolicyCheckCfg));
+    memset((void *)&policyCheckCfg, 0, sizeof(policyCheckCfg));
     if (RM_policy_GET_PERM(opInfo->allocType, RM_POLICY_PERM_INIT_SHIFT)) {
         policyCheckType = Rm_policyCheck_INIT;
     }
@@ -528,13 +528,13 @@ static int32_t allocatorAllocate(Rm_Handle rmHandle, Rm_Allocator *allocator, in
     uint32_t            matchingEnd;  
     int32_t             retVal = RM_SERVICE_PROCESSING;
 
-    memset((void *)&findNode, 0, sizeof(Rm_ResourceNode));
+    memset((void *)&findNode, 0, sizeof(findNode));
     findNode.base = opInfo->resourceInfo->base;
     findNode.length = opInfo->resourceInfo->length;
     matchingNode = RB_FIND(_Rm_AllocatorResourceTree, allocator->allocatorRootEntry, &findNode);
 
     /* Prepare privilege checks */
-    memset((void *)&policyCheckCfg, 0, sizeof(Rm_PolicyCheckCfg));
+    memset((void *)&policyCheckCfg, 0, sizeof(policyCheckCfg));
     if (RM_policy_GET_PERM(opInfo->allocType, RM_POLICY_PERM_INIT_SHIFT)) {
         policyCheckType = Rm_policyCheck_INIT;
     }
@@ -748,6 +748,8 @@ static int32_t allocatorAllocate(Rm_Handle rmHandle, Rm_Allocator *allocator, in
                         RB_INSERT(_Rm_AllocatorResourceTree, allocator->allocatorRootEntry, matchingNode);
                     }
                 }
+                /* Return number of instances that own the resource */
+                opInfo->resourceInfo->ownerCount = matchingNode->allocationCount;
                 retVal = RM_SERVICE_APPROVED;
             }
         }
@@ -786,7 +788,7 @@ static int32_t allocatorFree(Rm_Handle rmHandle, Rm_Allocator *allocator, Rm_All
     uint32_t         matchingEnd;
     int32_t          retVal;
 
-    memset((void *)&findNode, 0, sizeof(Rm_ResourceNode));
+    memset((void *)&findNode, 0, sizeof(findNode));
     findNode.base = opInfo->resourceInfo->base;
     findNode.length = opInfo->resourceInfo->length;
     matchingNode = RB_FIND(_Rm_AllocatorResourceTree, allocator->allocatorRootEntry, &findNode);
@@ -945,7 +947,8 @@ static int32_t allocatorFree(Rm_Handle rmHandle, Rm_Allocator *allocator, Rm_All
                         allocatorResNodeOwnerAdd(rmHandle, matchingNode, opInfo->serviceSrcInstNode);
                         RB_INSERT(_Rm_AllocatorResourceTree, allocator->allocatorRootEntry, matchingNode);
                     }
-
+                    /* Return number of instances that own the resource */
+                    opInfo->resourceInfo->ownerCount = matchingNode->allocationCount;
                     retVal = RM_SERVICE_APPROVED;
                 }
                 else {
@@ -1038,8 +1041,8 @@ static int32_t allocatorFindLinuxResource(Rm_Handle rmHandle, const char *resour
     Rm_LinuxValueRange *linuxValueRange;
     int32_t             retVal = RM_OK; 
 
-    memset((void *) &opInfo, 0, sizeof(Rm_AllocatorOpInfo));
-    memset((void *) &resourceInfo, 0, sizeof(Rm_ResourceInfo));
+    memset((void *)&opInfo, 0, sizeof(opInfo));
+    memset((void *)&resourceInfo, 0, sizeof(resourceInfo));
 
     strncpy(resourceInfo.name, resourceName, RM_NAME_MAX_CHARS);
     opInfo.policy = rmInst->u.server.globalPolicy;
@@ -1165,7 +1168,7 @@ static int32_t allocatorExtractGrlResProps(Rm_Handle rmHandle, const char *resou
                     rmNameServerTreeInv(rmInst->u.server.nameServer);
                 }                  
                 while (nsAssignments) {
-                    memset((void *)&nameServerObjCfg, 0, sizeof(Rm_NameServerObjCfg));
+                    memset((void *)&nameServerObjCfg, 0, sizeof(nameServerObjCfg));
                     nameServerObjCfg.nameServerTree = rmInst->u.server.nameServer;
                     nameServerObjCfg.nodeCfg.objName = nsAssignments->nsName;
                     nameServerObjCfg.nodeCfg.resourceName = (char *)resourceName;
@@ -1279,7 +1282,7 @@ int32_t rmAllocatorInitializeResources(Rm_Handle rmHandle, void *globalResourceD
 
     /* Parse the Global Resource List, creating an allocator for each specified resource node */
     while ((nodeOffset >= RM_DTB_UTIL_STARTING_NODE_OFFSET) && (nodeDepth >= RM_DTB_UTIL_STARTING_DEPTH)) {
-        memset((void *)&resProperties, 0, sizeof(Rm_ResourceProperties));
+        memset((void *)&resProperties, 0, sizeof(resProperties));
         /* Get properties of resource node */
         propOffset = fdt_first_property_offset(globalResourceDtb, nodeOffset);
         while (propOffset >= RM_DTB_UTIL_STARTING_NODE_OFFSET) {
@@ -1369,8 +1372,8 @@ void rmAllocatorDeleteResources(Rm_Handle rmHandle)
             rmResourceNodeFree(resNode);
         }        
 
-        Rm_osalFree((void *)resTree, sizeof(Rm_ResourceTree));
-        Rm_osalFree((void *)allocatorList, sizeof(Rm_Allocator));
+        Rm_osalFree((void *)resTree, sizeof(*resTree));
+        Rm_osalFree((void *)allocatorList, sizeof(*allocatorList));
         allocatorList = nextAllocator;
     }
     rmInst->u.server.allocators = NULL;
index a2f691d328db7dc7e16db9eaf1bcf97e2d15c10b..58ce2d4d93c3e6e4a405103f1db0d35165bc620d 100644 (file)
@@ -137,7 +137,7 @@ void Rm_serviceHandler (void *rmHandle, const Rm_ServiceReqInfo *serviceRequest,
         /* Process received transaction */
         rmProcessRouter(rmInst, transaction);
             
-        memset((void *)serviceResponse, 0, sizeof(Rm_ServiceRespInfo));
+        memset((void *)serviceResponse, 0, sizeof(*serviceResponse));
 
         if ((rmInst->instType == Rm_instType_SHARED_SERVER) && 
             (transaction->state == RM_SERVICE_PROCESSING)) {
@@ -167,6 +167,7 @@ void Rm_serviceHandler (void *rmHandle, const Rm_ServiceReqInfo *serviceRequest,
                 strncpy(serviceResponse->resourceName, transaction->resourceInfo.name, RM_NAME_MAX_CHARS);
                 serviceResponse->resourceBase = transaction->resourceInfo.base;
                 serviceResponse->resourceLength = transaction->resourceInfo.length;
+                serviceResponse->resourceNumOwners = transaction->resourceInfo.ownerCount;
             }
 
             /* Transactions still processing not deleted from queue including static transactions which will be 
@@ -201,7 +202,7 @@ Rm_ServiceHandle *Rm_serviceOpenHandle(Rm_Handle rmHandle, int32_t *result)
 
     serviceHandle = rmInst->serviceHandle;
     if (serviceHandle == NULL) {
-        serviceHandle = Rm_osalMalloc(sizeof(Rm_ServiceHandle));
+        serviceHandle = Rm_osalMalloc(sizeof(*serviceHandle));
         if (serviceHandle) {
             serviceHandle->rmHandle = rmHandle;
             serviceHandle->Rm_serviceHandler = Rm_serviceHandler;
@@ -229,7 +230,7 @@ int32_t Rm_serviceCloseHandle(Rm_ServiceHandle *rmServiceHandle)
     RM_SS_INST_INV_ENTER_CS(key);
 
     if (rmInst->serviceHandle) {
-        Rm_osalFree((void *)rmServiceHandle, sizeof(Rm_ServiceHandle));
+        Rm_osalFree((void *)rmServiceHandle, sizeof(*rmServiceHandle));
         rmInst->serviceHandle = NULL;
     }
     else {