* System scheduler: pass CPU control to the next process in
* the ready queue.
*/
-void proc_schedule(void)
+static void proc_schedule(void)
{
- struct Process *old_process;
cpuflags_t flags;
ATOMIC(LIST_ASSERT_VALID(&ProcReadyList));
ASSERT_USER_CONTEXT();
ASSERT_IRQ_ENABLED();
- /* Remember old process to save its context later */
- old_process = CurrentProcess;
-
/* Poll on the ready queue for the first ready process */
IRQ_SAVE_DISABLE(flags);
while (!(CurrentProcess = (struct Process *)list_remHead(&ProcReadyList)))
IRQ_DISABLE;
}
IRQ_RESTORE(flags);
+}
+
+void proc_switch(void)
+{
+ /* Remember old process to save its context later */
+ const Process *old_process = CurrentProcess;
+
+ proc_schedule();
/*
* Optimization: don't switch contexts when the active
#if CONFIG_KERN_MONITOR
LOG_INFO("Switch from %p(%s) to %p(%s)\n",
- old_process, old_process ? old_process->monitor.name : "NONE",
- CurrentProcess, CurrentProcess->monitor.name);
+ old_process, proc_name(old_process),
+ CurrentProcess, proc_currentName());
#endif
/* Save context of old process and switch to new process. If there is no
void proc_yield(void)
{
ATOMIC(SCHED_ENQUEUE(CurrentProcess));
-
- proc_schedule();
+ proc_switch();
}
void idle_init(void);
-void proc_preempt(void)
+void proc_schedule(void)
{
IRQ_DISABLE;
TRACEMSG("launching %p:%s", CurrentProcess, proc_currentName());
}
-void proc_preempt_timer(UNUSED_ARG(void *, param))
+void proc_preempt(UNUSED_ARG(void *, param)
{
if (!preempt_forbid_cnt)
{
// FIXME: this still break havocs, probably because of some reentrancy issue
#if 0
SCHED_ENQUEUE(CurrentProcess);
- proc_preempt();
+ proc_schedule();
#endif
#if CONFIG_KERN_PRI
}
timer_add(&preempt_timer);
}
-void proc_schedule(void)
+void proc_switch(void)
{
ATOMIC(LIST_ASSERT_VALID(&ProcReadyList));
TRACEMSG("%p:%s", CurrentProcess, proc_currentName());
SCHED_ENQUEUE(CurrentProcess);
IRQ_ENABLE;
- proc_schedule();
+ proc_switch();
}
void proc_entry(void (*user_entry)(void))
* Copyright 1999, 2000, 2001, 2008 Bernie Innocenti <bernie@codewiz.org>
* -->
*
- * \brief Simple realtime multitasking scheduler.
- * Context switching is only done cooperatively.
+ * \brief Simple cooperative multitasking scheduler.
*
* \version $Id$
* \author Bernie Innocenti <bernie@codewiz.org>
#endif /* ARCH_EMUL */
CurrentProcess = NULL;
- proc_schedule();
+ proc_switch();
/* not reached */
}