#include <cpu/types.h>
#include <cpu/attr.h>
#include <cfg/debug.h>
+#include <cfg/module.h>
#include <cfg/arch_config.h> /* ARCH_EMUL */
#include <cfg/macros.h> /* ABS() */
#endif
}
+MOD_DEFINE(proc);
void proc_init(void)
{
/* Make sure the assembly routine is up-to-date with us */
ASSERT(asm_switch_version() == 1);
+ MOD_INIT(proc);
}
*/
void proc_schedule(void)
{
- /* This function must not have any "auto" variables, otherwise
- * the compiler might put them on the stack of the process
- * being switched out.
- */
- static struct Process *old_process;
- static cpuflags_t flags;
+ struct Process *old_process;
+ cpuflags_t flags;
/* Remember old process to save its context later */
old_process = CurrentProcess;
* are idle-spinning, we must allow interrupts, otherwise no
* process will ever wake up.
*
+ * During idle-spinning, can occur an interrupt, it may be able to
+ * modify \p ProcReadyList. To ensure that compiler reload this
+ * variable every while cycle we call CPU_MEMORY_BARRIER.
+ * The memory barrier ensure that all variables used in this context
+ * are reloaded.
* \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.
*/
IRQ_ENABLE;
CPU_IDLE;
+ MEMORY_BARRIER;
IRQ_DISABLE;
}
IRQ_RESTORE(flags);
*/
if (CurrentProcess != old_process)
{
- static cpustack_t *dummy;
+ cpustack_t *dummy;
#if CONFIG_KERN_PREEMPTIVE
/* Reset quantum for this process */
*/
void proc_switch(void)
{
- /* Just like proc_schedule, this function must not have auto variables. */
- static cpuflags_t flags;
+ cpuflags_t flags;
IRQ_SAVE_DISABLE(flags);
SCHED_ENQUEUE(CurrentProcess);