示例#1
0
void scheduler()
{

	//readyq = new_dllist();

	if(dll_empty(readyq))
	{
		//printf("empty ready q\n");
		current = NULL;
		noop();
	}


	//takes the first PCB off the readyq and calls run_user_code() on its registers
	else
	{
		// pop off and delete from readyq
		printf("non-empty q\n");
		current = (PCB *) jval_v(dll_val(dll_first(readyq)));
		printf("non-empty q\n");
		dll_delete_node(dll_first(readyq));
		printf("non-empty q\n");
		run_user_code(current->registers);
	}
}
示例#2
0
void scheduler() {

  // Init no longer has children. Needs to close.
  if (jrb_empty(init->children)) {
    SYSHalt();
  }

  if(dll_empty(readyQ)) {
    noop_flag = 1;
    noop();
  } else {
    PCB *process;
    Dllist node;
    Jval registers;
    
    noop_flag = 0;
    process = (PCB *) malloc(sizeof(PCB));
    node = dll_first(readyQ);       // Get next node in queue
    dll_delete_node(node);          // Node in memory. Delete off readyQ
    
    // Get registers from node
    registers = dll_val(node);
    process = (PCB *)jval_v(registers);
    
    // Update current process
    currentProcess = process;
    User_Base = process->base;
    User_Limit = process->limit;
    
    run_user_code(process->registers);
  }
}