/* * ======== GIO_delete ======== */ Int GIO_delete(GIO_Handle gioChan) { IOM_Packet *packet; /* flush and delete low-level device ... */ if (gioChan->fxns != NULL && gioChan->mdChan != NULL) { GIO_flush(gioChan); gioChan->fxns->mdDeleteChan(gioChan->mdChan); } /* delete semaphore or alternate sync object ... */ if (gioChan->syncObj != NULL) { GIO->SEMDELETE(gioChan->syncObj); } /* free frames ... */ packet = QUE_get(&gioChan->freeList); while (packet != (IOM_Packet *)(&gioChan->freeList)) { _GIO_rmPacket(packet); packet = QUE_get(&gioChan->freeList); } /* free GIO object. */ (Void)MEM_free(0, gioChan, sizeof(GIO_Obj)); return (IOM_COMPLETED); }
/* * ======== 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; } }