msgqueue.c


/*************************************************************************
*                                                                        *
*   Modulo per la gestione di code di messaggi basato sul modulo queue.c *
*                                                                        *
*   realizzato dal Gruppo 17 di Lab2 Anno Accademico 1995/96             *
*                                                                        *
*   Lorenzo     Claudio       Valerio    Riccardo    Emiliano            *
*   Coronati    Lanconelli    Paolini    Solmi       Trentini            *
*                                                                        *
**************************************************************************/

/*
 * NOTA: le seguenti funzioni sono state realizzate come macro per motivi
 * di efficienza (vedi msgqueue.e):
 * headMessage()
 * insertMessage()
 * ins1Message()
 * removeMessage()
*/

#include "../h/types.h"
#include "../h/const.h"
#include "../h/msgqueue.h"
#include "../h/queue.e"

/* tabella dei messaggi e puntatore alla lista dei messaggi liberi */
HIDDEN  msg_t msgTable[MAXMSG], *msgfp;

void
initMessage()
{
    msgfp = (msg_t *) initQueue(msgTable, MAXMSG, sizeof(msg_t));
}

msg_t *
allocMessage()
{
    return (msg_t *) AllocQueue(&msgfp);
}

void
freeMessage(p)
msg_t *p;
{
    freeQueue(p, &msgfp);
}

msg_t *
keyMessage(tp, s)
msg_t **tp;
thr_t *s;
{
    register  msg_t *p, *prevp = *tp;

    if (prevp == NULL)
        return NULL;
    else
    {
        /*
         * Se la coda non e' vuota, scandisce alla ricerca del
         * messaggio il cui mittente e' s
         */
        while ((p = prevp->m_next) != *tp && p->m_sender != s)
            prevp = p;

        /* trovato: estraggo e restituisco il messaggio */
        if (p->m_sender == s)
        {
            /* controllo se unico nodo della lista */
            if (prevp == p)
                *tp = NULL;
            else
            {
                /* controllo se si rimuove il msg di coda */
                if (p == *tp)
                    *tp = prevp;
                prevp->m_next = p->m_next;
            }
            return p;
        } else
            return NULL;
    }
}


[INDICE CODICE]