コード例 #1
0
ファイル: ServiceMgr.c プロジェクト: robclark/sysbios-rpmsg
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;
}
コード例 #2
0
/*
 *  ======== 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);
}
コード例 #3
0
/*
 *  ======== 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;
}
コード例 #4
0
/*
 *  ======== 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);
}