Listing 6

This scheduler treats LEVEL1 as the highest level of priority.
IDLE tests greater than all other levels.

struct actions {
   int priority;
   void (*action)();
   char * arg;
   struct actions *nxtptr;
   } ready [MAX_WAIT], next;

main ()
{
...
/* initiate interrupt handlers */
while (TRUE){
  clevel = IDLE;
  do_loop();
  }
}

void do_loop()
{

scheduler:

   if (clevel == LEVEL2) return;
   else if ((clevel > LEVEL2) && (getnext(LEVEL2) != EMPTY)){
       push (clevel);
       clevel == LEVEL2; /*should be locked */
       (*next.action)(next.arg);
       clevel=pop();     /*lock*/
       goto scheduler;
       }
   else if ((clevel > LEVEL3) && (getnext(LEVEL3) != EMPTY)){
       push (clevel);
       clevel == LEVEL3; /*lock*/
       (*next.action)(next.arg);
       clevel=pop();     /*lock*/
       goto scheduler;
       }
   else return;
}