ser_resync(): New function.
[bertos.git] / kern / proc.c
index 3971df00bb54907424748e89878b691151851de0..e0c2ba27858af55069edcde9211e6c90268815ee 100755 (executable)
 
 /*
  * $Log$
+ * 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
@@ -47,7 +53,7 @@
 
 #include <string.h> /* memset() */
 
-/*! CPU dependent context switching routines 
+/*! CPU dependent context switching routines
  *  \note This function *MUST* preserve also the status of the interrupts.
  */
 extern void asm_switch_context(cpustack_t **new_sp, cpustack_t **save_sp);
@@ -90,8 +96,9 @@ static void monitor_init(void)
        INITLIST(&MonitorProcs);
 }
 
-static void monitor_add(Process* proc, cpustack_t* stack_base, size_t stack_size)
+static void monitor_add(Process* proc, const char* name, cpustack_t* stack_base, size_t stack_size)
 {
+       proc->monitor.name = name;
        proc->monitor.stack_base = stack_base;
        proc->monitor.stack_size = stack_size;
 
@@ -142,13 +149,25 @@ size_t monitor_check_stack(cpustack_t* stack_base, size_t stack_size)
 void monitor_debug_stacks(void)
 {
        struct Process* p;
+       int i;
+
+       if (ISLISTEMPTY(&MonitorProcs))
+       {
+               kprintf("No stacks registered in the monitor\n");
+               return;
+       }
+
+       kprintf("%-24s    %-6s%-8s%-8s%-8s\n", "Process name", "TCB", "SPbase", "SPsize", "SPfree");
+       for (i=0;i<56;i++)
+               kprintf("-");
+       kprintf("\n");
 
        for (p = MONITOR_NODE_TO_PROCESS(MonitorProcs.head);
                 p->monitor.link.succ;
                 p = MONITOR_NODE_TO_PROCESS(p->monitor.link.succ))
        {
                size_t free = monitor_check_stack(p->monitor.stack_base, p->monitor.stack_size);
-               kprintf("TCB: %x  sp_base: %x  sp_size: %x  sp_free: %x\n", (uint16_t)p, (uint16_t)p->monitor.stack_base, (uint16_t)p->monitor.stack_size, (uint16_t)free);
+               kprintf("%-24s    %04x    %04x    %4x    %4x\n", p->monitor.name, (uint16_t)p, (uint16_t)p->monitor.stack_base, (uint16_t)p->monitor.stack_size, (uint16_t)free);
        }
 }
 
@@ -157,6 +176,9 @@ void monitor_debug_stacks(void)
 
 static void proc_init_struct(Process* proc)
 {
+       /* Avoid warning for unused argument */
+       (void)proc;
+
 #if CONFIG_KERN_SIGNALS
        proc->sig_recv = 0;
 #endif
@@ -166,6 +188,7 @@ static void proc_init_struct(Process* proc)
 #endif
 }
 
+
 void proc_init(void)
 {
        INITLIST(&ProcReadyList);
@@ -192,7 +215,7 @@ void proc_init(void)
  * \return Process structure of new created process
  *         if successful, NULL otherwise.
  */
-Process *proc_new(void (*entry)(void), size_t stacksize, cpustack_t *stack_base)
+struct Process *proc_new_with_name(UNUSED(const char*, name), void (*entry)(void), IPTR data, size_t stacksize, cpustack_t *stack_base)
 {
        Process *proc;
        cpuflags_t flags;
@@ -251,6 +274,7 @@ Process *proc_new(void (*entry)(void), size_t stacksize, cpustack_t *stack_base)
        }
 
        proc_init_struct(proc);
+       proc->user_data = data;
 
 #if CONFIG_KERN_HEAP
        proc->stack_base = stack_base;
@@ -273,7 +297,7 @@ Process *proc_new(void (*entry)(void), size_t stacksize, cpustack_t *stack_base)
        ENABLE_IRQRESTORE(flags);
 
 #if CONFIG_KERN_MONITOR
-       monitor_add(proc, stack_base, stacksize);
+       monitor_add(proc, name, stack_base, stacksize);
 #endif
 
        return proc;
@@ -409,6 +433,13 @@ struct Process *proc_current(void)
        return CurrentProcess;
 }
 
+/*!
+ * Get the pointer to the user data of the current process
+ */
+IPTR proc_current_user_data(void)
+{
+       return CurrentProcess->user_data;
+}
 
 #if 0 /* Simple testcase for the scheduler */
 
@@ -446,8 +477,8 @@ static cpustack_t proc_test_stack2[CONFIG_KERN_DEFSTACKSIZE/sizeof(cpustack_t)];
  */
 void NORETURN proc_test(void)
 {
-       proc_new(proc_test_thread1, sizeof(proc_test_stack1), proc_test_stack1);
-       proc_new(proc_test_thread2, sizeof(proc_test_stack2), proc_test_stack2);
+       proc_new(proc_test_thread1, NULL, sizeof(proc_test_stack1), proc_test_stack1);
+       proc_new(proc_test_thread2, NULL, sizeof(proc_test_stack2), proc_test_stack2);
        kputs("Created tasks\n");
 
        kputs("stack1:\n");