/* * ======== GateMutexPri_Instance_finalize ======== */ Void GateMutexPri_Instance_finalize(GateMutexPri_Object *obj) { Queue_Handle pendQ; pendQ = GateMutexPri_Instance_State_pendQ(obj); Queue_destruct(Queue_struct(pendQ)); }
/* * ======== Event_Instance_init ======== */ Void Event_Instance_init(Event_Object *event, const Event_Params *params) { Queue_Handle pendQ; event->postedEvents = 0; pendQ = Event_Instance_State_pendQ(event); Queue_construct(Queue_struct(pendQ), NULL); }
/* * ======== Semaphore_Instance_finalize ======== */ Void Semaphore_Instance_finalize(Semaphore_Object *sem) { Queue_Handle pendQ; pendQ = Semaphore_Instance_State_pendQ(sem); Queue_destruct(Queue_struct(pendQ)); if (Semaphore_supportsEvents && (sem->event != NULL)) { Semaphore_eventSync(sem->event, sem->eventId, 0); } }
/* * ======== GateMutexPri_Instance_init ======== */ Void GateMutexPri_Instance_init(GateMutexPri_Object *obj, const GateMutexPri_Params *params) { Queue_Handle pendQ; pendQ = GateMutexPri_Instance_State_pendQ(obj); obj->mutexCnt = 1; obj->owner = NULL; obj->ownerOrigPri = 0; Queue_construct(Queue_struct(pendQ), NULL); }
/* * ======== GIO_Instance_finalize ======== */ Void GIO_Instance_finalize(GIO_Object *obj, Int status) { Queue_Handle freeList; SyncSemThread_Handle sync; IOM_Fxns *iomFxns; iomFxns = (IOM_Fxns *)obj->fxns; /* fall through in switch below is intentional */ switch (status) { case 0: /* GIO_delete() */ if (obj->submitCount > 0) { GIO_flush(obj); } iomFxns->mdDeleteChan(obj->mdChan); /* OK to fall through */ case 4: /* mdCreateChan failed */ /* OK to fall through */ case 3: /* name not found */ Memory_free(NULL, obj->packets, sizeof(IOM_Packet) * obj->numPackets); /* OK to fall through */ case 2: /* alloc packets failed */ freeList = GIO_Instance_State_freeList(obj); Queue_destruct(Queue_struct(freeList)); if (obj->userSync == FALSE) { sync = SyncSemThread_Handle_downCast(obj->sync); SyncSemThread_delete(&sync); } /* OK to fall through */ case 1: /* Sync_create failed */ /* OK to fall through */ default: break; } }
/* * ======== Semaphore_Instance_init ======== */ Void Semaphore_Instance_init(Semaphore_Object *sem, Int count, const Semaphore_Params *params) { Queue_Handle pendQ; UInt hwiKey; pendQ = Semaphore_Instance_State_pendQ(sem); sem->mode = params->mode; sem->count = count; /* Make sure that supportsEvents is TRUE if params->event is not null */ Assert_isTrue((Semaphore_supportsEvents == TRUE) || ((Semaphore_supportsEvents == FALSE) && (params->event == NULL)), Semaphore_A_noEvents); Queue_construct(Queue_struct(pendQ), NULL); if (Semaphore_supportsEvents && (params->event != NULL)) { sem->event = params->event; sem->eventId = params->eventId; hwiKey = Hwi_disable(); if (count) { /* * In the unlikely case that a task is already * pending on the event object waiting for this * Semaphore... */ Hwi_restore(hwiKey); Semaphore_eventPost(sem->event, sem->eventId); } else { Semaphore_eventSync(sem->event, sem->eventId, 0); Hwi_restore(hwiKey); } } else { sem->event = NULL; sem->eventId = 1; } }
/* * ======== 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); }