/* * ======== 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)); }
/* * ======== 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); }