procqueue.c


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


[INDICE CODICE]