X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=kern%2Fproc.c;h=a9e956243a2677267449f74241541f87f0e55862;hb=4ac43159891e8090defc821852e2753d7508bf5f;hp=a17c02d20fc37727c01eace3c45a3bc4cbb36d95;hpb=9ba9dcf2a59a952609e19154e11de3e2478cbf42;p=bertos.git diff --git a/kern/proc.c b/kern/proc.c index a17c02d2..a9e95624 100644 --- a/kern/proc.c +++ b/kern/proc.c @@ -40,110 +40,16 @@ * \author Stefano Fedrigo */ -/*#* - *#* $Log$ - *#* Revision 1.32 2006/09/20 14:19:23 marco - *#* Restored test. - *#* - *#* Revision 1.31 2006/07/19 12:56:27 bernie - *#* Convert to new Doxygen style. - *#* - *#* Revision 1.30 2006/03/27 04:49:23 bernie - *#* CPU_IDLE(): Fix for new emulator. - *#* - *#* Revision 1.29 2006/02/24 01:17:05 bernie - *#* Update for new emulator. - *#* - *#* Revision 1.28 2006/02/21 16:06:55 bernie - *#* Cleanup/update process scheduling. - *#* - *#* 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. - *#* - *#* Revision 1.18 2004/10/19 08:54:43 bernie - *#* Initialize forbid_cnt; Formatting/comments fixes. - *#* - *#* Revision 1.17 2004/10/19 08:47:13 bernie - *#* proc_rename(), proc_forbid(), proc_permit(): New functions. - *#* - *#* Revision 1.16 2004/10/03 20:39:28 bernie - *#* Import changes from sc/firmware. - *#* - *#* Revision 1.15 2004/09/20 03:29:39 bernie - *#* C++ fixes. - *#* - *#* Revision 1.14 2004/09/14 21:06:44 bernie - *#* Use debug.h instead of kdebug.h. - *#* - *#* Revision 1.13 2004/08/29 21:58:53 bernie - *#* Include macros.h explicityl. - *#* - *#* Revision 1.11 2004/08/24 16:09:08 bernie - *#* Add missing header. - *#* - *#* Revision 1.10 2004/08/24 16:07:01 bernie - *#* Use kputs()/kputchar() when possible. - *#* - *#* Revision 1.9 2004/08/24 14:26:57 bernie - *#* monitor_debug_stacks(): Conditionally compile on CONFIG_KERN_MONITOR. - *#* - *#* Revision 1.8 2004/08/14 19:37:57 rasky - *#* Merge da SC: macros.h, pool.h, BIT_CHANGE, nome dei processi, etc. - *#* - *#* Revision 1.7 2004/08/02 20:20:29 aleph - *#* Merge from project_ks - *#* - *#* Revision 1.6 2004/07/30 14:24:16 rasky - *#* Task switching con salvataggio perfetto stato di interrupt (SR) - *#* Kernel monitor per dump informazioni su stack dei processi - *#* - *#* Revision 1.5 2004/07/14 14:18:09 rasky - *#* Merge da SC: Rimosso timer dentro il task, che è uno spreco di memoria per troppi task - *#* - *#* Revision 1.4 2004/07/13 19:21:28 aleph - *#* Avoid warning for unused arg when compiled without some CONFIG_KERN_xx options - *#* - *#* Revision 1.3 2004/06/06 18:37:57 bernie - *#* Rename event macros to look like regular functions. - *#* - *#* Revision 1.2 2004/06/03 11:27:09 bernie - *#* Add dual-license information. - *#* - *#* Revision 1.1 2004/05/23 17:27:00 bernie - *#* Import kern/ subdirectory. - *#* - *#*/ #include "proc_p.h" #include "proc.h" //#include "hw.h" #include -#include +#include +#include +#include #include +#include #include /* ARCH_EMUL */ #include /* ABS() */ @@ -204,6 +110,7 @@ static void proc_init_struct(Process *proc) #endif } +MOD_DEFINE(proc); void proc_init(void) { @@ -222,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); } @@ -244,14 +152,14 @@ struct Process *proc_new_with_name(UNUSED(const char *, name), void (*entry)(voi /* Ignore stack provided by caller and use the large enough default instead. */ stack_base = (cpustack_t *)LIST_HEAD(&StackFreeList); REMOVE(LIST_HEAD(&StackFreeList)); - stacksize = CONFIG_KERN_DEFSTACKSIZE; + stacksize = CONFIG_PROC_DEFSTACKSIZE; #elif CONFIG_KERN_HEAP /* Did the caller provide a stack for us? */ if (!stack_base) { /* Did the caller specify the desired stack size? */ if (!stacksize) - stacksize = CONFIG_KERN_DEFSTACKSIZE + sizeof(Process); + stacksize = CONFIG_PROC_DEFSTACKSIZE + sizeof(Process); /* Allocate stack dinamically */ if (!(stack_base = heap_alloc(stacksize))) @@ -335,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; @@ -360,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); @@ -376,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 */ @@ -423,7 +333,7 @@ void proc_exit(void) #warning This is wrong /* Reinsert process stack in free list */ ADDHEAD(&StackFreeList, (Node *)(CurrentProcess->stack - - (CONFIG_KERN_DEFSTACKSIZE / sizeof(cpustack_t)))); + - (CONFIG_PROC_DEFSTACKSIZE / sizeof(cpustack_t)))); /* * NOTE: At this point the first two words of what used @@ -443,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);