tackled an issue in suspending and waking the last process

This commit is contained in:
hyunghwan.chung 2016-03-23 02:34:13 +00:00
parent d6ee9e5b67
commit 26630cc385

View File

@ -177,17 +177,10 @@ printf ("PROCESS %p SIZE => %ld\n", proc, (long int)STIX_OBJ_GET_SIZE(proc));
return proc; return proc;
} }
static void switch_to_process (stix_t* stix, stix_oop_process_t proc, int new_state_for_old_active) static STIX_INLINE void sleep_active_process (stix_t* stix, int state)
{ {
/* the new process must not be the currently active process */
STIX_ASSERT (stix->processor->active != proc);
/* the new process must be in the runnable state */
STIX_ASSERT (proc->state == STIX_SMOOI_TO_OOP(PROC_STATE_RUNNABLE) ||
proc->state == STIX_SMOOI_TO_OOP(PROC_STATE_WAITING));
#if defined(STIX_DEBUG_PROCESSOR) #if defined(STIX_DEBUG_PROCESSOR)
printf ("ACTUAL PROCESS SWITCHING BF...%d %p\n", (int)stix->ip, stix->active_context); printf ("PROCESS-SWITCHING: PUT ACTIVE_CONTEXT TO SLEEP..%d %p\n", (int)stix->ip, stix->active_context);
#endif #endif
#if defined(STIX_USE_PROCSTK) #if defined(STIX_USE_PROCSTK)
@ -198,11 +191,13 @@ printf ("ACTUAL PROCESS SWITCHING BF...%d %p\n", (int)stix->ip, stix->active_con
/* store the current active context to the current process. /* store the current active context to the current process.
* it is the suspended context of the process to be suspended */ * it is the suspended context of the process to be suspended */
STIX_ASSERT ((stix_oop_t)stix->processor->active != stix->_nil); STIX_ASSERT (stix->processor->active != stix->nil_process);
stix->processor->active->current_context = stix->active_context; stix->processor->active->current_context = stix->active_context;
/*stix->processor->active->state = STIX_SMOOI_TO_OOP(PROC_STATE_RUNNABLE);*/ stix->processor->active->state = STIX_SMOOI_TO_OOP(state);
stix->processor->active->state = STIX_SMOOI_TO_OOP(new_state_for_old_active); }
static STIX_INLINE void wake_new_process (stix_t* stix, stix_oop_process_t proc)
{
/* activate the given process */ /* activate the given process */
proc->state = STIX_SMOOI_TO_OOP(PROC_STATE_RUNNING); proc->state = STIX_SMOOI_TO_OOP(PROC_STATE_RUNNING);
stix->processor->active = proc; stix->processor->active = proc;
@ -217,8 +212,21 @@ printf ("ACTUAL PROCESS SWITCHING BF...%d %p\n", (int)stix->ip, stix->active_con
SWITCH_ACTIVE_CONTEXT (stix, proc->current_context); SWITCH_ACTIVE_CONTEXT (stix, proc->current_context);
#if defined(STIX_DEBUG_PROCESSOR) #if defined(STIX_DEBUG_PROCESSOR)
printf ("ACTUAL PROCESS SWITCHING AF...%d %p\n", (int)stix->ip, stix->active_context); printf ("PROCESS-SWITCHING: WAKE NEW PROCESS...%d %p\n", (int)stix->ip, stix->active_context);
#endif #endif
}
static void switch_to_process (stix_t* stix, stix_oop_process_t proc, int new_state_for_old_active)
{
/* the new process must not be the currently active process */
STIX_ASSERT (stix->processor->active != proc);
/* the new process must be in the runnable state */
STIX_ASSERT (proc->state == STIX_SMOOI_TO_OOP(PROC_STATE_RUNNABLE) ||
proc->state == STIX_SMOOI_TO_OOP(PROC_STATE_WAITING));
sleep_active_process (stix, new_state_for_old_active);
wake_new_process (stix, proc);
stix->proc_switched = 1; stix->proc_switched = 1;
} }
@ -284,7 +292,7 @@ printf ("INSERTED PROCESS %d TO PROCESSOR\n", (int)tally);
return 0; return 0;
} }
static STIX_INLINE void unchain_from_processor (stix_t* stix, stix_oop_process_t proc) static STIX_INLINE void unchain_from_processor (stix_t* stix, stix_oop_process_t proc, int state)
{ {
stix_ooi_t tally; stix_ooi_t tally;
@ -301,6 +309,7 @@ static STIX_INLINE void unchain_from_processor (stix_t* stix, stix_oop_process_t
proc->prev = (stix_oop_process_t)stix->_nil; proc->prev = (stix_oop_process_t)stix->_nil;
proc->next = (stix_oop_process_t)stix->_nil; proc->next = (stix_oop_process_t)stix->_nil;
proc->state = STIX_SMOOI_TO_OOP(state);
tally--; tally--;
if (tally == 0) stix->processor->active = stix->nil_process; if (tally == 0) stix->processor->active = stix->nil_process;
@ -360,8 +369,7 @@ static void terminate_process (stix_t* stix, stix_oop_process_t proc)
nrp = find_next_runnable_process (stix); nrp = find_next_runnable_process (stix);
unchain_from_processor (stix, proc); unchain_from_processor (stix, proc, PROC_STATE_TERMINATED);
proc->state = STIX_SMOOI_TO_OOP(PROC_STATE_TERMINATED);
proc->sp = STIX_SMOOI_TO_OOP(-1); /* invalidate the process stack */ proc->sp = STIX_SMOOI_TO_OOP(-1); /* invalidate the process stack */
proc->current_context = proc->initial_context; /* not needed but just in case */ proc->current_context = proc->initial_context; /* not needed but just in case */
@ -381,8 +389,7 @@ static void terminate_process (stix_t* stix, stix_oop_process_t proc)
} }
else else
{ {
unchain_from_processor (stix, proc); unchain_from_processor (stix, proc, PROC_STATE_TERMINATED);
proc->state = STIX_SMOOI_TO_OOP(PROC_STATE_TERMINATED);
proc->sp = STIX_SMOOI_TO_OOP(-1); /* invalidate the process stack */ proc->sp = STIX_SMOOI_TO_OOP(-1); /* invalidate the process stack */
} }
} }
@ -446,26 +453,36 @@ static void suspend_process (stix_t* stix, stix_oop_process_t proc)
nrp = find_next_runnable_process (stix); nrp = find_next_runnable_process (stix);
unchain_from_processor (stix, proc);
printf ("TO SUSPEND...%p %d\n", proc, (int)STIX_OOP_TO_SMOOI(proc->state)); printf ("TO SUSPEND...%p %d\n", proc, (int)STIX_OOP_TO_SMOOI(proc->state));
if (nrp == proc) if (nrp == proc)
{ {
/* no runnable process after suspension */ /* no runnable process after suspension */
STIX_ASSERT (stix->processor->active == stix->nil_process);
printf ("NO RUNNABLE PROCESS AFTER SUPSENDISION\n"); printf ("NO RUNNABLE PROCESS AFTER SUPSENDISION\n");
sleep_active_process (stix, PROC_STATE_RUNNABLE);
unchain_from_processor (stix, proc, PROC_STATE_SUSPENDED);
proc->state = STIX_SMOOI_TO_OOP(PROC_STATE_SUSPENDED); /* the last has been unchained from the processor and
proc->current_context = stix->active_context; * set to SUSPENDED. the active process must be the nil
* nil process */
STIX_ASSERT (stix->processor->active == stix->nil_process);
} }
else else
{ {
printf ("SWITCHING TO XXXXXXXXXXXXXXXXXXXXx\n");
/* keep the unchained process at the runnable state for
* the immediate call to switch_to_process() below */
unchain_from_processor (stix, proc, PROC_STATE_RUNNABLE);
/* unchain_from_processor() leaves the active process
* untouched unless the unchained process is the last
* process. so calling switch_to_process() which expects
* the active process to be valid is safe */
STIX_ASSERT (stix->processor->active != stix->nil_process);
switch_to_process (stix, nrp, PROC_STATE_SUSPENDED); switch_to_process (stix, nrp, PROC_STATE_SUSPENDED);
} }
} }
else else
{ {
unchain_from_processor (stix, proc); unchain_from_processor (stix, proc, PROC_STATE_SUSPENDED);
proc->state = STIX_SMOOI_TO_OOP(PROC_STATE_SUSPENDED);
} }
} }
} }
@ -2861,10 +2878,22 @@ printf ("NO MORE RUNNABLE PROCESS...\n");
} }
else else
{ {
stix_oop_process_t proc;
/* THIS PART IS JUST EXPERIMENTAL... PROPER WAITING WITH IO MULTIPLEXER IS NEEDED ... */ /* THIS PART IS JUST EXPERIMENTAL... PROPER WAITING WITH IO MULTIPLEXER IS NEEDED ... */
sleep (ft.tv_sec - now.tv_sec); sleep (ft.tv_sec - now.tv_sec);
proc = stix->sem_heap[0]->waiting_head;
signal_semaphore (stix, stix->sem_heap[0]); signal_semaphore (stix, stix->sem_heap[0]);
delete_from_sem_heap (stix, 0); delete_from_sem_heap (stix, 0);
STIX_ASSERT (proc->state == STIX_SMOOI_TO_OOP(PROC_STATE_RUNNABLE));
STIX_ASSERT (proc == stix->processor->runnable_head);
wake_new_process (stix, proc);
stix->proc_switched = 1;
goto carry_on_switching; goto carry_on_switching;
} }
} }