RM Blocking functionality when no callback provided is working
authorJustin Sobota <jsobota@ti.com>
Tue, 5 Mar 2013 00:17:34 +0000 (19:17 -0500)
committerJustin Sobota <jsobota@ti.com>
Tue, 5 Mar 2013 00:17:34 +0000 (19:17 -0500)
test/rm_osal.c
test/rm_test.c

index 1216bcf9759ebb48852cf2a549d54a4668a8fca7..99bcc0f32f40b28a1fb1fb91ce94f91bb835c423 100644 (file)
@@ -48,8 +48,8 @@
 #include <xdc/runtime/Error.h>
 #include <xdc/runtime/System.h>
 
 #include <xdc/runtime/Error.h>
 #include <xdc/runtime/System.h>
 
-/* IPC Includes */
-#include <ti/ipc/GateMP.h>
+/* BIOS Includes */
+#include <ti/sysbios/gates/GateMutex.h>
 
 /**********************************************************************
  ****************************** Defines *******************************
 
 /**********************************************************************
  ****************************** Defines *******************************
@@ -62,7 +62,7 @@
 uint32_t rmMallocCounter = 0;
 uint32_t rmFreeCounter   = 0;
 
 uint32_t rmMallocCounter = 0;
 uint32_t rmFreeCounter   = 0;
 
-GateMP_Handle rmInternalGateHandle;
+GateMutex_Handle rmInternalGateHandle;
 
 /**********************************************************************
  *************************** OSAL Functions **************************
 
 /**********************************************************************
  *************************** OSAL Functions **************************
@@ -98,26 +98,24 @@ void Osal_rmFree (void *ptr, uint32_t size)
 
 void Osal_rmLocalGateInit (void)
 {
 
 void Osal_rmLocalGateInit (void)
 {
-    GateMP_Params gateParams;
-
-    /* Create a GateMP object to be use as a resource lock */
-    GateMP_Params_init(&gateParams);
-    gateParams.name = RM_INTERNAL_GATE_NAME;    
-    /* Local protection for multiple threads, uses a BIOS GateMutexPri */
-    gateParams.localProtect = GateMP_LocalProtect_THREAD;
-    /* No remote protection because we're not going between cores */
-    gateParams.remoteProtect = GateMP_RemoteProtect_NONE;
-    rmInternalGateHandle = GateMP_create(&gateParams);
+    Error_Block eb;
+    GateMutex_Params gateParams;
+
+    /* Create a GateMutex object to be use as a resource lock */
+    GateMutex_Params_init(&gateParams);  
+    rmInternalGateHandle = GateMutex_create(&gateParams, &eb);
+    /* Immediately take the gate so that calls from within RM will block */
+    GateMutex_enter(rmInternalGateHandle);
 }
 
 uint32_t Osal_rmLocalGateEnter (void)
 {
 }
 
 uint32_t Osal_rmLocalGateEnter (void)
 {
-    return ((uint32_t)GateMP_enter(rmInternalGateHandle));
+    return ((uint32_t)GateMutex_enter(rmInternalGateHandle));
 }
 
 void Osal_rmLocalGateLeave (uint32_t localGateKey)
 {
 }
 
 void Osal_rmLocalGateLeave (uint32_t localGateKey)
 {
-    GateMP_leave(rmInternalGateHandle, (IArg)localGateKey);
+    GateMutex_leave(rmInternalGateHandle, (IArg)localGateKey);
 }
 
 /* FUNCTION PURPOSE: Prints a variable list
 }
 
 /* FUNCTION PURPOSE: Prints a variable list
index 173a5f2cf6e41d471ed385c8746598f37efa44b6..1e12b99028e5358825727c23b042b32a8fe472d9 100644 (file)
@@ -407,6 +407,13 @@ void rmCleanupTsk(UArg arg0, UArg arg1)
     int32_t result;
     
     /* Delete the RM test tasks */
     int32_t result;
     
     /* Delete the RM test tasks */
+    System_printf("Core %d: Deleting RM startup task...\n", coreNum);
+    if (rmStartupTskHandle) {
+       Task_delete(&rmStartupTskHandle);
+       /* Set the task handle to be NULL so that the delete only occurs once */
+       rmStartupTskHandle = NULL;
+    }  
+    
     if (coreNum == 0) {
         if (rmServerTskHandle) {
             System_printf("Core %d: Deleting RM server task...\n", coreNum);
     if (coreNum == 0) {
         if (rmServerTskHandle) {
             System_printf("Core %d: Deleting RM server task...\n", coreNum);
@@ -486,14 +493,6 @@ void rmServerTsk(UArg arg0, UArg arg1)
     Rm_ServiceReqInfo  requestInfo;
     Rm_ServiceRespInfo responseInfo;
     Task_Params        taskParams;
     Rm_ServiceReqInfo  requestInfo;
     Rm_ServiceRespInfo responseInfo;
     Task_Params        taskParams;
-       
-    /* Delete the RM startup task */
-    System_printf("Core %d: Deleting RM startup task...\n", coreNum);
-    if (rmStartupTskHandle) {
-        Task_delete(&rmStartupTskHandle);
-        /* Set the task handle to be NULL so that the delete only occurs once */
-        rmStartupTskHandle = NULL;
-    }
 
     Rm_printInstanceStatus(rmServerHandle);
 
 
     Rm_printInstanceStatus(rmServerHandle);
 
@@ -762,14 +761,6 @@ void rmClientTsk(UArg arg0, UArg arg1)
     Rm_ServiceRespInfo responseInfo;    
     Task_Params        taskParams;
     uint32_t           i, j;
     Rm_ServiceRespInfo responseInfo;    
     Task_Params        taskParams;
     uint32_t           i, j;
-       
-    /* Delete the RM startup task */
-    System_printf("Core %d: Deleting RM startup task...\n", coreNum);
-    if (rmStartupTskHandle) {
-       Task_delete(&rmStartupTskHandle);
-       /* Set the task handle to be NULL so that the delete only occurs once */
-       rmStartupTskHandle = NULL;
-    }
 
     Rm_printInstanceStatus(rmCdHandle);
     Rm_printInstanceStatus(rmClientHandle);
 
     Rm_printInstanceStatus(rmCdHandle);
     Rm_printInstanceStatus(rmClientHandle);
@@ -970,7 +961,7 @@ void rmClientTsk(UArg arg0, UArg arg1)
     /* Allocate a resource without providing a callback function.  RM should block and not return until the result
      * is returned by the server. */
     setRmRequest(&requestInfo, Rm_service_RESOURCE_ALLOCATE_INIT, resourceNameGpQ, 
     /* Allocate a resource without providing a callback function.  RM should block and not return until the result
      * is returned by the server. */
     setRmRequest(&requestInfo, Rm_service_RESOURCE_ALLOCATE_INIT, resourceNameGpQ, 
-                 7000, 1, 0, NULL, TRUE, &responseInfo);     
+                 7000, 1, 0, NULL, FALSE, &responseInfo);     
     rmClientServiceHandle->Rm_serviceHandler(rmClientServiceHandle->rmHandle, &requestInfo, &responseInfo);   
     System_printf("Core %d : %s init allocation (without callback specified) of %s %d - %d : ", coreNum,
                                                                                                 rmClientName,
     rmClientServiceHandle->Rm_serviceHandler(rmClientServiceHandle->rmHandle, &requestInfo, &responseInfo);   
     System_printf("Core %d : %s init allocation (without callback specified) of %s %d - %d : ", coreNum,
                                                                                                 rmClientName,
@@ -1048,6 +1039,12 @@ void rmStartupTsk(UArg arg0, UArg arg1)
         rmTransportMap[i].transportHandle = NULL;
     }
 
         rmTransportMap[i].transportHandle = NULL;
     }
 
+    /* Create the gate internal to RM for service requests not specifying a callback function
+     * and needing a blocking operation to complete.
+     *
+     * Must be created from a different task than the test tasks to allow proper blocking. */
+    Osal_rmLocalGateInit();  
+
     if (coreNum == 0) {
         GateMP_Params_init(&gateParams);
         gateParams.name = RM_TASK_GATE_NAME;
     if (coreNum == 0) {
         GateMP_Params_init(&gateParams);
         gateParams.name = RM_TASK_GATE_NAME;
@@ -1267,10 +1264,6 @@ void rmStartupTsk(UArg arg0, UArg arg1)
         System_printf("Core %d: Registered RM Client <=> RM CD transport with RM Client instance\n", coreNum);
     }
 
         System_printf("Core %d: Registered RM Client <=> RM CD transport with RM Client instance\n", coreNum);
     }
 
-    /* Create the gate internal to RM for service requests not specifying a callback function
-     * and needing a blocking operation to complete */
-    Osal_rmLocalGateInit();
-
     /* Create the RM receive task.  Assign higher priority than the test tasks so that
      * when they spin waiting for messages from other RM instances the receive task is
      * executed. */
     /* Create the RM receive task.  Assign higher priority than the test tasks so that
      * when they spin waiting for messages from other RM instances the receive task is
      * executed. */