static UInt32 createService(Char * name, UInt32 * endpt) { Int i; Int status = 0; struct ServiceDef *sd; RcmServer_Handle rcmSrvHandle; for (i = 0; i < ServiceMgr_NUMSERVICETYPES; i++) { if (!strcmp(name, serviceDefs[i].name)) { sd = &serviceDefs[i]; break; } } if (i >= ServiceMgr_NUMSERVICETYPES) { System_printf("createService: unrecognized service name: %s\n", name); return OMX_NOTSUPP; } /* Create the RcmServer instance. */ #if 0 System_printf("createService: Calling RcmServer_create with name = %s\n" "priority = %d\n" "osPriority = %d\n" "rcmServerParams.fxns.length = %d\n", sd->name, sd->rcmServerParams.priority, sd->rcmServerParams.osPriority, sd->rcmServerParams.fxns.length); #endif status = RcmServer_create(sd->name, &sd->rcmServerParams, &rcmSrvHandle); if (status < 0) { System_printf("createService: RcmServer_create() returned error %d\n", status); return OMX_FAIL; } /* Get endpoint allowing clients to send messages to this new server: */ *endpt = RcmServer_getLocalAddress(rcmSrvHandle); /* Store Server's endpoint with handle so we can cleanup on disconnect: */ if (!storeTuple(*endpt, (UInt32)rcmSrvHandle)) { System_printf("createService: Limit reached on max instances!\n"); RcmServer_delete(&rcmSrvHandle); return OMX_FAIL; } /* start the server */ RcmServer_start(rcmSrvHandle); System_printf("createService: new OMX Service at endpoint: %d\n", *endpt); return OMX_SUCCESS; }
/* * ======== MemMgr_createDaemon ======== */ MemMgr_Daemon_Handle MemMgr_createDaemon(String name) { Error_Block ebObj; Error_Block *eb = &ebObj; RcmServer_Params rcmServer_Params; MemMgr_Daemon_Object *obj = NULL; UInt32 unused; Int status = 0; Error_init(eb); /* allocate the daemon object */ obj = (MemMgr_Daemon_Object *)Memory_alloc(NULL, sizeof(MemMgr_Daemon_Object), sizeof(Int), eb); if (Error_check(eb)) { goto leave; } obj->hRcmServer = NULL; /* create the RcmServer instance */ RcmServer_Params_init(&rcmServer_Params); status = RcmServer_create(name, &rcmServer_Params, &obj->hRcmServer); if (status < 0) { goto leave; } /* install the function pointers */ status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_PageSize_skel", MemMgr_PageSize_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_Alloc_skel", MemMgr_Alloc_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_Free_skel", MemMgr_Free_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_Map_skel", MemMgr_Map_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_UnMap_skel", MemMgr_UnMap_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_Is1DBlock_skel", MemMgr_Is1DBlock_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_Is2DBlock_skel", MemMgr_Is2DBlock_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_IsMapped_skel", MemMgr_IsMapped_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_GetStride_skel", MemMgr_GetStride_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "TilerMem_GetStride_skel", TilerMem_GetStride_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "TilerMem_VirtToPhys_skel", TilerMem_VirtToPhys_skel, &unused); if (status < 0) goto leave; /* start the server */ RcmServer_start(obj->hRcmServer); /* pause to let server thread get going */ usleep(20000); /* 0.02 sec */ leave: if (Error_check(eb)) { Error_raise(eb, Error_E_generic, "MemMgr_createDeamon failed", 0); if (obj != NULL) { Memory_free(NULL, (Ptr)obj, sizeof(MemMgr_Daemon_Object)); obj = NULL; } } return((MemMgr_Daemon_Handle)obj); }
/* * ======== RcmServerThreadFxn ======== * RCM server test thread function */ Void RcmServerThreadFxn (Void *arg) { RcmServer_Params rcmServerParams; UInt fxnIdx; Char * rcmServerName = RCMSERVER_NAME; Int status = 0; /* Rcm server module init */ Osal_printf ("RcmServerThreadFxn: RCM Server module init.\n"); RcmServer_init (); /* Rcm server module params init*/ Osal_printf ("RcmServerThreadFxn: RCM Server module params init.\n"); status = RcmServer_Params_init (&rcmServerParams); if (status < 0) { Osal_printf ("RcmServerThreadFxn: Error in RCM Server instance params " "init \n"); goto exit; } Osal_printf ("RcmServerThreadFxn: RCM Server instance params init " "passed \n"); /* Create the RcmServer instance */ Osal_printf ("RcmServerThreadFxn: Creating RcmServer instance %s.\n", rcmServerName); status = RcmServer_create (rcmServerName, &rcmServerParams, &rcmServerHandle); if (status < 0) { Osal_printf ("RcmServerThreadFxn: Error in RCM Server create.\n"); goto exit; } Osal_printf ("RcmServerThreadFxn: RCM Server Create passed \n"); sem_init (&serverThreadSync, 0, 0); /* Register the remote functions */ Osal_printf ("RcmServerThreadFxn: Registering remote function - " "fxnDouble\n"); status = RcmServer_addSymbol (rcmServerHandle, "fxnDouble", fxnDouble, &fxnIdx); if ((status < 0) || (fxnIdx == 0xFFFFFFFF)) { Osal_printf ("RcmServerThreadFxn: Add symbol failed.\n"); goto exit; } Osal_printf ("RcmServerThreadFxn: Registering remote function - " "fxnExit\n"); status = RcmServer_addSymbol (rcmServerHandle, "fxnExit", fxnExit, &fxnIdx); if ((status < 0) || (fxnIdx == 0xFFFFFFFF)) { Osal_printf ("RcmServerThreadFxn: Add symbol failed.\n"); goto exit; } Osal_printf ("RcmServerThreadFxn: Start RCM server thread \n"); RcmServer_start (rcmServerHandle); Osal_printf ("RcmServerThreadFxn: RCM Server start passed \n"); sem_wait (&serverThreadSync); sem_post (&mainThreadWait); exit: Osal_printf ("RcmServerThreadFxn: Leaving RCM server test thread " "function \n"); return; }
/* * ======== Server_setup ======== * * 1. create semaphore object * 2. register notify callback * 3. wait until remote core has also registered notify callback * 4. create local & shared resources * 5. send resource ready event * 6. wait for remote resource ready event * 7. open remote resources * 8. handshake the ready event */ Int Server_setup(Void) { Int status; UInt32 event; Semaphore_Params semParams; RcmServer_Params rcmServerP; Log_print0(Diags_ENTRY | Diags_INFO, "--> Server_setup:"); /* * 1. create semaphore object */ Semaphore_Params_init(&semParams); semParams.mode = Semaphore_Mode_COUNTING; Semaphore_construct(&Module.semS, 0, &semParams); Module.semH = Semaphore_handle(&Module.semS); /* * 2. register notify callback */ status = Notify_registerEventSingle(Module.hostProcId, Module.lineId, Module.eventId, Server_notifyCB, (UArg)&Module); if (status < 0) { goto leave; } /* * 3. wait until remote core has also registered notify callback */ do { status = Notify_sendEvent(Module.hostProcId, Module.lineId, Module.eventId, App_CMD_NOP, TRUE); if (status == Notify_E_EVTNOTREGISTERED) { Task_sleep(200); /* ticks */ } } while (status == Notify_E_EVTNOTREGISTERED); if (status < 0) { goto leave; } /* * 4. create local & shared resources (to be opened by remote processor) */ /* * 5. send resource ready event */ status = Notify_sendEvent(Module.hostProcId, Module.lineId, Module.eventId, App_CMD_RESRDY, TRUE); if (status < 0) { goto leave; } /* * 6. wait for remote resource ready event */ do { event = Server_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_RESRDY); /* * 7. open remote resources */ /* open the rcm heap */ status = HeapBufMP_open(Global_RcmClientHeapName, &Module.heapH); if (status < 0) { Log_error1("Server_setup: HeapBufMP_open() returned error %d", (IArg)status); goto leave; } /* register the rcm heap with MessageQ */ status = MessageQ_registerHeap((Ptr)(Module.heapH), Global_RcmClientHeapId); if (status < 0) { Log_error1("Server_setup: MessageQ_restierHeap() returned error %d", (IArg)status); goto leave; } /* initialize RcmServer create params */ RcmServer_Params_init(&rcmServerP); rcmServerP.fxns.length = Server_fxnTab.length; rcmServerP.fxns.elem = Server_fxnTab.elem; /* create the RcmServer instance */ status = RcmServer_create(Global_RcmServerName, &rcmServerP, &Module.rcmServerH); if (status < 0) { Log_error1("Server_setup: RcmServer_create() returned error %d", (IArg)status); goto leave; } /* start the server */ RcmServer_start(Module.rcmServerH); /* * 8. handshake the ready event */ status = Notify_sendEvent(Module.hostProcId, Module.lineId, Module.eventId, App_CMD_READY, TRUE); if (status < 0) { goto leave; } do { event = Server_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_READY); leave: Log_print1(Diags_EXIT, "<-- Server_setup: %d", (IArg)status); return(status); }