/*************************************************************************
* *
* 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;
}
}