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