* <!--
* Copyright 2001,2004 Develer S.r.l. (http://www.develer.com/)
* Copyright 1999,2000,2001 Bernardo Innocenti <bernie@develer.com>
- * This file is part of DevLib - See devlib/README for information.
+ * This file is part of DevLib - See README.devlib for information.
* -->
*
* \brief Simple realtime multitasking scheduler.
/*#*
*#* $Log$
+ *#* Revision 1.27 2005/11/04 16:20:02 bernie
+ *#* Fix reference to README.devlib in header.
+ *#*
+ *#* Revision 1.26 2005/04/11 19:10:28 bernie
+ *#* Include top-level headers from cfg/ subdir.
+ *#*
+ *#* Revision 1.25 2005/03/15 00:20:54 bernie
+ *#* proc_schedule(): New sanity check.
+ *#*
+ *#* Revision 1.24 2005/01/08 09:20:54 bernie
+ *#* Remove unused variable.
+ *#*
+ *#* Revision 1.23 2004/12/13 12:07:06 bernie
+ *#* DISABLE_IRQSAVE/ENABLE_IRQRESTORE: Convert to IRQ_SAVE_DISABLE/IRQ_RESTORE.
+ *#*
+ *#* Revision 1.22 2004/12/13 11:51:08 bernie
+ *#* DISABLE_INTS/ENABLE_INTS: Convert to IRQ_DISABLE/IRQ_ENABLE.
+ *#*
+ *#* Revision 1.21 2004/11/28 23:20:25 bernie
+ *#* Remove obsolete INITLIST macro.
+ *#*
+ *#* Revision 1.20 2004/11/16 22:37:14 bernie
+ *#* Replace IPTR with iptr_t.
+ *#*
*#* Revision 1.19 2004/10/19 11:47:39 bernie
*#* Kill warnings when !CONFIG_PROC_MONITOR.
*#*
#include "proc_p.h"
#include "proc.h"
-#include "cpu.h"
+#include <cfg/cpu.h>
#include "event.h"
#include "hw.h"
-#include <debug.h>
-#include <arch_config.h> /* ARCH_EMUL */
-#include <macros.h> /* ABS() */
+#include <cfg/debug.h>
+#include <cfg/arch_config.h> /* ARCH_EMUL */
+#include <cfg/macros.h> /* ABS() */
#include <string.h> /* memset() */
void proc_init(void)
{
- INITLIST(&ProcReadyList);
+ LIST_INIT(&ProcReadyList);
#if CONFIG_KERN_MONITOR
monitor_init();
* \return Process structure of new created process
* if successful, NULL otherwise.
*/
-struct Process *proc_new_with_name(UNUSED(const char*, name), void (*entry)(void), IPTR data, size_t stacksize, cpustack_t *stack_base)
+struct Process *proc_new_with_name(UNUSED(const char*, name), void (*entry)(void), iptr_t data, size_t stacksize, cpustack_t *stack_base)
{
Process *proc;
- cpuflags_t flags;
size_t i;
size_t proc_size_words = ROUND2(sizeof(Process), sizeof(cpustack_t)) / sizeof(cpustack_t);
#if CONFIG_KERN_HEAP
CPU_PUSH_WORD(proc->stack, CPU_REG_INIT_VALUE(i));
/* Add to ready list */
- DISABLE_IRQSAVE(flags);
- SCHED_ENQUEUE(proc);
- ENABLE_IRQRESTORE(flags);
+ ATOMIC(SCHED_ENQUEUE(proc));
#if CONFIG_KERN_MONITOR
monitor_add(proc, name, stack_base, stacksize);
* the compiler might put them on the stack of the process
* being switched out.
*/
- static Process *old_process;
+ static struct Process *old_process;
static cpuflags_t flags;
/* Remember old process to save its context later */
old_process = CurrentProcess;
+ /* Scheduling in interrupts is a nono. */
+ ASSERT(!IRQ_RUNNING());
+
/* Poll on the ready queue for the first ready process */
- DISABLE_IRQSAVE(flags);
- while (!(CurrentProcess = (struct Process*)REMHEAD(&ProcReadyList)))
+ IRQ_SAVE_DISABLE(flags);
+ while (!(CurrentProcess = (struct Process *)REMHEAD(&ProcReadyList)))
{
/*
* Make sure we physically reenable interrupts here, no matter what
* are idle-spinning, we must allow interrupts, otherwise no
* process will ever wake up.
*
- * \todo If there was a way to code sig_wait so that it does not
+ * \todo If there was a way to write sig_wait() so that it does not
* disable interrupts while waiting, there would not be any
* reason to do this.
*/
- ENABLE_INTS;
+ IRQ_ENABLE;
SCHEDULER_IDLE;
- DISABLE_INTS;
+ IRQ_DISABLE;
}
- ENABLE_IRQRESTORE(flags);
+ IRQ_RESTORE(flags);
- /* Optimization: don't switch contexts when the active
+ /*
+ * Optimization: don't switch contexts when the active
* process has not changed.
*/
if (CurrentProcess != old_process)
{
- static cpustack_t* dummy;
+ static cpustack_t *dummy;
#if CONFIG_KERN_PREEMPTIVE
/* Reset quantum for this process */
/* Just like proc_schedule, this function must not have auto variables. */
static cpuflags_t flags;
- DISABLE_IRQSAVE(flags);
+ IRQ_SAVE_DISABLE(flags);
SCHED_ENQUEUE(CurrentProcess);
- ENABLE_IRQRESTORE(flags);
+ IRQ_RESTORE(flags);
proc_schedule();
}
/*!
* Get the pointer to the user data of the current process
*/
-IPTR proc_current_user_data(void)
+iptr_t proc_current_user_data(void)
{
return CurrentProcess->user_data;
}