/*************************************************************************
* *
* Modulo di gestione della coda di processi pronti *
* *
* realizzato dal Gruppo 17 di Lab2 Anno Accademico 1995/96 *
* *
* Lorenzo Claudio Valerio Riccardo Emiliano *
* Coronati Lanconelli Paolini Solmi Trentini *
* *
**************************************************************************/
/*
* non utilizziamo le procedure di gestione delle code generiche perche'
* la sruttura processo puo' essere linkata contemporaneamente in due
* liste (coda pronti e la lista dei processi fratelli all'interno
* dell'albero
*/
#include "../h/const.h"
#include "../h/types.h"
#include "../h/proctree.h"
#include "../h/globals.e"
/* Rimuove il primo processo dalla coda pronti */
proc_t *
remRdyQueue()
{
register proc_t *proc = NULL;
if (ready_queue != NULL)
{
if ((proc = ready_queue->p_nextready) == ready_queue)
ready_queue = NULL;
else
ready_queue->p_nextready = proc->p_nextready;
}
#ifdef NUC_DEBUG
proc->p_nextready = NULL;
#endif
return proc;
}
/*
* rimuove il processo proc dalla coda pronti
* e' implementata nello stesso modo di outQueue()
*/
proc_t *
outRdyQueue(proc)
register proc_t *proc;
{
register proc_t *prevp = ready_queue;
if (prevp != NULL)
{
while (prevp->p_nextready != proc && prevp->p_nextready != ready_queue)
prevp = prevp->p_nextready;
if (prevp->p_nextready == proc)
{
if (prevp == prevp->p_nextready)
ready_queue = NULL;
else
{
if (proc == ready_queue)
ready_queue = prevp;
prevp->p_nextready = proc->p_nextready;
}
prevp = proc;
}
else
prevp = NULL;
}
#ifdef NUC_DEBUG
proc->p_nextready = NULL;
#endif
return prevp;
}
thr_t *
outWaitThread(tp, thread)
register thr_t **tp, *thread;
{
register thr_t *prevp = *tp;
if (prevp != NULL)
{
while (prevp->t_nextwait != thread && prevp->t_nextwait != *tp)
prevp = prevp->t_nextwait;
if (prevp->t_nextwait == thread)
{
if (prevp == prevp->t_nextwait)
*tp = NULL;
else
{
if (thread == *tp)
*tp = prevp;
prevp->t_nextwait = thread->t_nextwait;
}
prevp = thread;
}
else
prevp = NULL;
}
#ifdef NUC_DEBUG
thread->t_nextwait = NULL;
#endif
return prevp;
}