Exemplo n.º 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));
}
Exemplo n.º 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);
}