Exemple #1
0
/*
 *  ======== Stream_Instance_init ========
 */
Int Stream_Instance_init(Stream_Object *obj, String name, UInt mode, 
    const Stream_Params *params, Error_Block *eb)
{
    List_Handle     freeList;
    
    obj->name = name;
    obj->chanParams = params->chanParams;
    obj->maxIssues = params->maxIssues;
    obj->ready = 0;
    obj->issued = 0;
    obj->mode = mode;
    obj->packetHeap = params->packetHeap;

    if (params->sync == NULL) {       
        obj->complete = 
            SyncSemThread_Handle_upCast(SyncSemThread_create(NULL, eb));
        obj->userSync = FALSE;
        if (obj->complete == NULL) {
            return (1);
        }
    }
    else {
        obj->complete = params->sync;
        obj->userSync = TRUE;
    }

    freeList = Stream_Instance_State_freeList(obj);
    List_construct(List_struct(freeList), NULL);
    
    /* allocate packets */
    obj->packets = Memory_alloc(obj->packetHeap, 
        sizeof(DriverTypes_Packet) * (obj->maxIssues), 0, eb);

    if (obj->packets == NULL) {
        return (2);
    }
   
    return (Stream_postInit(obj, eb));
}
Exemple #2
0
/*
 *  ======== GIO_Instance_init ========
 */
Int GIO_Instance_init(GIO_Object *obj, String name, UInt mode,
    const GIO_Params *params, Error_Block *eb)
{
    Int                 i, status;
    Queue_Handle        doneList;
    Queue_Handle        freeList;
    DEV_Handle          device;
    IOM_Packet          *packets;
    IOM_Fxns            *iomFxns;
    Ptr                 devp;
    
    obj->name = name;
    obj->numPackets = params->numPackets;
    obj->doneCount = 0;
    obj->freeCount = 0;
    obj->submitCount = 0;
    obj->mode = mode;
    obj->model = params->model;
    obj->timeout = params->timeout;

    if (params->sync == NULL) {       
        obj->userSync = FALSE;
        obj->sync = SyncSemThread_Handle_upCast(SyncSemThread_create(NULL, eb));
        if (obj->sync == NULL) {
            return (1);
        }
    }
    else {
        obj->sync = params->sync;
        obj->userSync = TRUE;
    }

    doneList = GIO_Instance_State_doneList(obj);
    Queue_construct(Queue_struct(doneList), NULL);
    
    freeList = GIO_Instance_State_freeList(obj);
    Queue_construct(Queue_struct(freeList), NULL);
    
    /* allocate packets */
    packets = Memory_alloc(NULL, sizeof(IOM_Packet) * (obj->numPackets), 0, eb);

    if (packets == NULL) {
        return (2);
    }

    obj->packets = packets;
    obj->freeCount = obj->numPackets;
   
    /* 
     * Split the buffer into packets and add to freeList
     */
    for (i = 0; i < obj->numPackets; i++) {
        Queue_enqueue(freeList, (Queue_Elem *)&packets[i]);
    }
    
    name = DEV_match(name, &device);    
        
    if (device == NULL) {
        /* The name was not found */
        Error_raise(eb, GIO_E_notFound, obj->name, 0);
        return (3);
    }

    obj->fxns = DEV_getFxns(device);
    iomFxns = (IOM_Fxns *)obj->fxns;       

    devp = DEV_getDevp(device);

    status = iomFxns->mdCreateChan(&obj->mdChan, devp, name, mode,
        params->chanParams, callback, obj);
  
    if (status != IOM_COMPLETED) {
        Error_raise(eb, GIO_E_createFailed, status, 0);
        return (4);
    }
    
    return (0);
}
Exemple #3
0
Int RcmClient_Instance_init(RcmClient_Object *obj, String server,
        const RcmClient_Params *params)
{
    Error_Block eb;
    MessageQ_Params mqParams;
    SyncSemThread_Params syncParams;
    SemThread_Params semParams;
    SemThread_Handle semHndl;
    List_Params listP;
    Int rval;
    Int status = RcmClient_S_SUCCESS;


    Log_print2(Diags_ENTRY, "--> %s: (obj=0x%x)", (IArg)FXNN, (IArg)obj);

    /* must initialize error block */
    Error_init(&eb);

    /* initialize instance data */
    obj->msgId = 0xFFFF;
    obj->sync = NULL;
    obj->serverMsgQ = MessageQ_INVALIDMESSAGEQ;
    obj->msgQue = NULL;
    obj->errorMsgQue = NULL;
    obj->mbxLock = NULL;
    obj->queueLock = NULL;
    obj->recipients = NULL;
    obj->newMail = NULL;

    /* create the instance gate */
    GateThread_construct(&obj->gate, NULL, &eb);

    if (Error_check(&eb)) {
        Log_error0(FXNN": could not create gate object");
        status = RcmClient_E_FAIL;
        goto leave;
    }

    /* create a synchronizer for the message queue */
    SyncSemThread_Params_init(&syncParams);
    obj->sync = SyncSemThread_create(&syncParams, &eb);

    if (Error_check(&eb)) {
        status = RcmClient_E_FAIL;
        goto leave;
    }

    /* create the message queue for return messages */
    MessageQ_Params_init(&mqParams);
    obj->msgQue = MessageQ_create(NULL, &mqParams);

    if (obj->msgQue == NULL) {
        Log_error0(FXNN": could not create return message queue");
        status = RcmClient_E_MSGQCREATEFAILED;
        goto leave;
    }

    /* create the message queue for error messages */
    MessageQ_Params_init(&mqParams);
    obj->errorMsgQue = MessageQ_create(NULL, &mqParams);

    if (NULL == obj->errorMsgQue) {
        Log_error0(FXNN": could not create error message queue");
        status = RcmClient_E_MSGQCREATEFAILED;
        goto leave;
    }

    /* locate server message queue */
    rval = MessageQ_open(server, (MessageQ_QueueId *)(&obj->serverMsgQ));

    if (MessageQ_E_NOTFOUND == rval) {
        Log_error1(FXNN": given server not found, server=0x%x", (IArg)server);
        status = RcmClient_E_SERVERNOTFOUND;
        goto leave;
    }
    else if (status < 0) {
        Log_error1(FXNN": could not open server message queue, server=0x%x",
            (IArg)server);
        status = RcmClient_E_MSGQOPENFAILED;
        goto leave;
    }

    /* create callback server */
    if ((obj->cbNotify = params->callbackNotification)) {
        /* TODO create callback server thread */
        /* make sure to free resources acquired by thread */
        Error_raise(&eb, Error_E_generic, "Not Implemented", 0);
        goto leave;
    }

    /* register the heapId used for message allocation */
    if ((obj->heapId = params->heapId) == RcmClient_INVALIDHEAPID) {
        Log_error0(FXNN": must specify a heap id in create params");
        status = RcmClient_E_INVALIDHEAPID;
        goto leave;
    }

    /* create the mailbox lock */
    SemThread_Params_init(&semParams);
    semHndl = SemThread_create(1, &semParams, &eb);
    if (Error_check(&eb)) {
        status = RcmClient_E_FAIL;
        goto leave;
    }
    obj->mbxLock = SemThread_Handle_upCast(semHndl);

    /* create the message queue lock */
    SemThread_Params_init(&semParams);
    semHndl = SemThread_create(1, &semParams, &eb);
    if (Error_check(&eb)) {
        status = RcmClient_E_FAIL;
        goto leave;
    }
    obj->queueLock = SemThread_Handle_upCast(semHndl);

    /* create the return message recipient list */
#if defined(RCM_ti_ipc)
    List_Params_init(&listP);
    obj->recipients = List_create(&listP, &eb);

    if (Error_check(&eb)) {
        Log_error0(FXNN": could not create list object");
        status = RcmClient_E_LISTCREATEFAILED;
        goto leave;
    }
#elif defined(RCM_ti_syslink)
    List_Params_init(&listP);
    obj->recipients = List_create(&listP, NULL);

    if (NULL == obj->recipients) {
        Log_error0(FXNN": could not create list object");
        status = RcmClient_E_LISTCREATEFAILED;
        goto leave;
    }
#endif

    /* create list of undelivered messages (new mail) */
#if defined(RCM_ti_ipc)
    List_Params_init(&listP);
    obj->newMail = List_create(&listP, &eb);

    if (Error_check(&eb)) {
        Log_error0(FXNN": could not create list object");
        status = RcmClient_E_LISTCREATEFAILED;
        goto leave;
    }
#elif defined(RCM_ti_syslink)
    List_Params_init(&listP);
    obj->newMail = List_create(&listP, NULL);

    if (NULL == obj->newMail) {
        Log_error0(FXNN": could not create list object");
        status = RcmClient_E_LISTCREATEFAILED;
        goto leave;
    }
#endif

leave:
    Log_print2(Diags_EXIT, "<-- %s: %d", (IArg)FXNN, (IArg)status);
    return(status);
}