monitor: Correct preemptive locking
[bertos.git] / bertos / kern / proc.c
index a9e956243a2677267449f74241541f87f0e55862..32e3afe8a2f50b317af65291fa9f0d86fcc3f7b2 100644 (file)
@@ -27,7 +27,7 @@
  * the GNU General Public License.
  *
  * Copyright 2001,2004 Develer S.r.l. (http://www.develer.com/)
- * Copyright 1999,2000,2001 Bernardo Innocenti <bernie@develer.com>
+ * Copyright 1999,2000,2001 Bernie Innocenti <bernie@codewiz.org>
  *
  * -->
  *
  *
  * \version $Id$
  *
- * \author Bernardo Innocenti <bernie@develer.com>
+ * \author Bernie Innocenti <bernie@codewiz.org>
  * \author Stefano Fedrigo <aleph@develer.com>
  */
 
 
 #include "proc_p.h"
 #include "proc.h"
-//#include "hw.h"
-#include <mware/event.h>
+
+#include "cfg/cfg_arch.h"  /* ARCH_EMUL */
+#include <cfg/debug.h>
+#include <cfg/module.h>
+#include <cfg/macros.h>       /* ABS() */
+
 #include <cpu/irq.h>
 #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() */
 
-#include <string.h> /* memset() */
+#include <mware/event.h>
+
+#include <string.h>           /* memset() */
 
 /**
  * CPU dependent context switching routines.
@@ -139,30 +141,30 @@ void proc_init(void)
  * \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_t 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 stack_size, cpustack_t *stack_base)
 {
        Process *proc;
        size_t i;
-       size_t proc_size_words = ROUND2(sizeof(Process), sizeof(cpustack_t)) / sizeof(cpustack_t);
+       const size_t PROC_SIZE_WORDS = ROUND2(sizeof(Process), sizeof(cpustack_t)) / sizeof(cpustack_t);
 #if CONFIG_KERN_HEAP
        bool free_stack = false;
 #endif
 
 #if (ARCH & ARCH_EMUL)
        /* 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_PROC_DEFSTACKSIZE;
+       stack_base = (cpustack_t *)list_remHead(&StackFreeList);
+
+       stack_size = 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_PROC_DEFSTACKSIZE + sizeof(Process);
+               if (!stack_size)
+                       stack_size = CONFIG_PROC_DEFSTACKSIZE + sizeof(Process);
 
                /* Allocate stack dinamically */
-               if (!(stack_base = heap_alloc(stacksize)))
+               if (!(stack_base = heap_alloc(stack_size)))
                        return NULL;
 
                free_stack = true;
@@ -170,25 +172,25 @@ struct Process *proc_new_with_name(UNUSED(const char *, name), void (*entry)(voi
 #else
        /* Stack must have been provided by the user */
        ASSERT(stack_base);
-       ASSERT(stacksize);
+       ASSERT(stack_size);
 #endif
 
 #if CONFIG_KERN_MONITOR
        /* Fill-in the stack with a special marker to help debugging */
-       memset(stack_base, CONFIG_KERN_STACKFILLCODE, stacksize / sizeof(cpustack_t));
+       memset(stack_base, CONFIG_KERN_STACKFILLCODE, stack_size / sizeof(cpustack_t));
 #endif
 
        /* Initialize the process control block */
        if (CPU_STACK_GROWS_UPWARD)
        {
                proc = (Process*)stack_base;
-               proc->stack = stack_base + proc_size_words;
+               proc->stack = stack_base + PROC_SIZE_WORDS;
                if (CPU_SP_ON_EMPTY_SLOT)
                        proc->stack++;
        }
        else
        {
-               proc = (Process*)(stack_base + stacksize / sizeof(cpustack_t) - proc_size_words);
+               proc = (Process*)(stack_base + stack_size / sizeof(cpustack_t) - PROC_SIZE_WORDS);
                proc->stack = (cpustack_t*)proc;
                if (CPU_SP_ON_EMPTY_SLOT)
                        proc->stack--;
@@ -197,11 +199,13 @@ struct Process *proc_new_with_name(UNUSED(const char *, name), void (*entry)(voi
        proc_init_struct(proc);
        proc->user_data = data;
 
-#if CONFIG_KERN_HEAP
+#if CONFIG_KERN_HEAP | CONFIG_KERN_MONITOR | (ARCH & ARCH_EMUL)
        proc->stack_base = stack_base;
        proc->stack_size = stack_size;
+       #if CONFIG_KERN_HEAP
        if (free_stack)
                proc->flags |= PF_FREESTACK;
+       #endif
 #endif
 
        /* Initialize process stack frame */
@@ -216,7 +220,7 @@ struct Process *proc_new_with_name(UNUSED(const char *, name), void (*entry)(voi
        ATOMIC(SCHED_ENQUEUE(proc));
 
 #if CONFIG_KERN_MONITOR
-       monitor_add(proc, name, stack_base, stacksize);
+       monitor_add(proc, name);
 #endif
 
        return proc;
@@ -264,7 +268,7 @@ 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
+                * During idle-spinning, an interrupt can occur and it may
                 * 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