Пример #1
0
/*
 *  ======== GateMutexPri_Instance_finalize ========
 */
Void GateMutexPri_Instance_finalize(GateMutexPri_Object *obj)
{
    Queue_Handle pendQ;

    pendQ = GateMutexPri_Instance_State_pendQ(obj);
    Queue_destruct(Queue_struct(pendQ));
}
Пример #2
0
/*
 *  ======== 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);
}
Пример #3
0
/*
 *  ======== 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);
    }
}
Пример #4
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);
}
Пример #5
0
/*
 *  ======== 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;
    }
}
Пример #6
0
/*
 *  ======== 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;
    }
}
Пример #7
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);
}