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); } }
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); } }