/*
 *  ======== Adaptor_sendToHost ========
 *  Do not free the packet in case of failure since
 *  the service might want to resend or do something with the data.
 */
Bool Adaptor_sendToHost(UIAPacket_Hdr *packet)
{
    Bool status;

    if (UIAPacket_getHdrType(packet) == UIAPacket_HdrType_Msg) {
        status = ServiceMgr_transportFxns.sendFxn(
                     Adaptor_module->transportMsgHandle, &packet);
        if (status == TRUE) {
            Adaptor_module->numMsgPacketsSent++;

            /* Free the packet */
            Adaptor_freePacket(packet);
        }
        else {
            Adaptor_module->numMsgPacketsFailed++;
        }
    }
    else {
        status = ServiceMgr_transportFxns.sendFxn(
                     Adaptor_module->transportEventHandle, &packet);
        if (status == TRUE) {
            Adaptor_module->numEventPacketsSent++;

            /* Free the packet */
            Adaptor_freePacket(packet);
        }
        else {
            Adaptor_module->numEventPacketsFailed++;
        }
    }
    return (status);
}
Exemplo n.º 2
0
/*
 *  ======== UIAPacket_getLength ========
 */
Int32 UIAPacket_getLength(UIAPacket_Hdr *pHdr)
{
    if (UIAPacket_getHdrType(pHdr) == UIAPacket_HdrType_Msg) {
        return (UIAPacket_getMsgLength(pHdr));
    }
    else {
        return (UIAPacket_getEventLength(pHdr));
    }
}
/*
 *  ======== Adaptor_rxTaskFxn ========
 *  Task that receives incoming messages from the host.
 *  These messages are then sent to the transfer agent.
 */
Void Adaptor_rxTaskFxn(UArg arg, UArg unused)
{
    Int status;
    Adaptor_Entry *entry;
    UIAPacket_Hdr *packet;

    /* Make sure the transport is set to go */
    if (ServiceMgr_transportFxns.startFxn != NULL) {
        Adaptor_module->transportMsgHandle =
            ServiceMgr_transportFxns.startFxn(UIAPacket_HdrType_Msg);
    }

    /*
     *  Loop to receive msgs from the instrumentation host
     */
    while (TRUE) {

        /* Grab a free incomingMsg buffer */
        packet = Adaptor_getFreePacket(UIAPacket_HdrType_Msg,
                                       BIOS_WAIT_FOREVER);

        /* Receive the packet. */
        status = ServiceMgr_transportFxns.recvFxn(
                     Adaptor_module->transportMsgHandle, &packet,
                     ServiceMgr_maxCtrlPacketSize);

        /* Put onto router's message queue */
        if ((status > 0) &&
            (UIAPacket_getHdrType(packet) == UIAPacket_HdrType_Msg)) {

            /* The Queue elem is just above the packet */
            entry = (Adaptor_Entry *)((UInt)packet - sizeof(Queue_Elem));

            Queue_put(Adaptor_module->incomingQ, (Queue_Elem *)entry);
            Event_post(Adaptor_module->event, Event_Id_01);
        }
        else {
            /* Return the packet */
            Adaptor_freePacket(packet);

            /* Reset the transport with a stop/start */
            if (ServiceMgr_transportFxns.stopFxn != NULL) {
                ServiceMgr_transportFxns.stopFxn(
                    Adaptor_module->transportMsgHandle);
            }

            if (ServiceMgr_transportFxns.startFxn != NULL) {
                Adaptor_module->transportMsgHandle =
                    ServiceMgr_transportFxns.startFxn(UIAPacket_HdrType_Msg);
            }
        }
    }
}
/*
 *  ======== Adaptor_freePacket ========
 *  Function called by a service to "free" a packet.
 */
Void Adaptor_freePacket(UIAPacket_Hdr *packet)
{
    Queue_Elem *elem;
    UIAPacket_HdrType type = UIAPacket_getHdrType(packet);

    elem = (Queue_Elem *)((UInt)packet - sizeof(Queue_Elem));

    /* Determine the type of header to place on the correct queue */
    if (type == UIAPacket_HdrType_EventPkt) {
        Queue_put(Adaptor_module->freeEventQ, elem);
        Semaphore_post(Adaptor_module->freeEventSem);
    }
    else {
        Queue_put(Adaptor_module->freeMsgQ, elem);
        Semaphore_post(Adaptor_module->freeMsgSem);
    }
}