X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=kern%2Fproc.c;h=a9e956243a2677267449f74241541f87f0e55862;hb=2535cb94ec2183791128f8bbd109ca69a960cf78;hp=f86e1ad9113c16805b66e6c90170b6d388315392;hpb=a38f52e713ae8e7c6acdd0062ac8fb4e3e59186a;p=bertos.git diff --git a/kern/proc.c b/kern/proc.c index f86e1ad9..a9e95624 100644 --- a/kern/proc.c +++ b/kern/proc.c @@ -49,6 +49,7 @@ #include #include #include +#include #include /* ARCH_EMUL */ #include /* ABS() */ @@ -109,6 +110,7 @@ static void proc_init_struct(Process *proc) #endif } +MOD_DEFINE(proc); void proc_init(void) { @@ -127,6 +129,7 @@ void proc_init(void) /* Make sure the assembly routine is up-to-date with us */ ASSERT(asm_switch_version() == 1); + MOD_INIT(proc); } @@ -240,12 +243,8 @@ void proc_rename(struct Process *proc, const char *name) */ 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; @@ -265,12 +264,18 @@ void proc_schedule(void) * 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); @@ -281,7 +286,7 @@ void proc_schedule(void) */ if (CurrentProcess != old_process) { - static cpustack_t *dummy; + cpustack_t *dummy; #if CONFIG_KERN_PREEMPTIVE /* Reset quantum for this process */ @@ -348,8 +353,7 @@ void proc_exit(void) */ 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);