scheduler.c


/*************************************************************************
*                                                                        *
*   Modulo di implementazione dello scheduler                            *
*                                                                        *
*   realizzato dal Gruppo 17 di Lab2 Anno Accademico 1995/96             *
*                                                                        *
*   Lorenzo     Claudio       Valerio    Riccardo    Emiliano            *
*   Coronati    Lanconelli    Paolini    Solmi       Trentini            *
*                                                                        *
**************************************************************************/

#include "../h/const.h"
#include "../h/types.h"
#include "../h/nucconst.h"

#include "../h/globals.e"
#include "../h/procqueue.e"
#include "../h/thrqueue.e"
#include "../h/ssi.e"
/* #include "../h/scheduler.e" */

#ifdef  NUC_PROFILE
int sched_count;
#endif

void
schedule()
{
    /*
     * run_proc puo` essere NULL solamente se prima della schedule si era
     * in stato di attesa oppure si era terminato il processo corrente
     */
    if (run_proc != NULL)
        run_proc->p_cputime += TIMESLICE - time_left + 40;

#ifdef  NUC_PROFILE
    else if (run_thread == &wait_thread)
    {
        STCK(&time_now);
        wait_time += time_now - wait_start;
    }
    sched_count++;
#endif

    /* controllo che ci sia almeno un processo da schedulare */
    if (!EMPTYQUEUE(ready_queue))
    {
        /*
         * sposta il primo processo in fondo alla coda pronti e
         * aggiorna il processo in esecuzione al primo della coda
         */
        NEXTRDYQUEUE();

        /*
         * fa lo stesso, ma questa volta per la coda dei thread
         * pronti all'interno del processo da eseguire
         */
        NEXTRDYTHREAD(run_proc->p_readyqueue);

        time_left = TIMESLICE;
    }
    else
    {
        /*
         * controllo per deadlock: se tutti i processi sono in
         * attesa, e nessuno e` in attesa di I/O allora e` deadlock
         */
        if (no_wait > 0)
        {
            /*
             * manda in esecuzione il thread vuoto che e` in
             * stato di Wait
             */

#ifdef  NUC_PROFILE
            STCK(&wait_start);
#endif
            run_proc = NULL;
            run_thread = &wait_thread;

            time_left = INFINITE;
        }
        else
            shutdown("Deadlock");
    }
}


[INDICE CODICE]