Remove the idle process.
[bertos.git] / bertos / kern / preempt.c
index d3d9badf98f18f688c77f873c91f81aed0ba2818..065faed88e17823eace2972fcd754927f0326f6e 100644 (file)
 
 #include "cfg/cfg_proc.h"
 
-#if CONFIG_KERN_PREEMPT
-
 #include "proc_p.h"
 #include "proc.h"
 
 #include <kern/irq.h>
 #include <kern/monitor.h>
-#include <kern/idle.h> // idle_proc
 #include <cpu/frame.h> // CPU_IDLE
 #include <cpu/irq.h>   // IRQ_DISABLE()...
 #include <cfg/log.h>
@@ -123,44 +120,24 @@ cpu_atomic_t preempt_count;
  */
 int _proc_quantum;
 
+/**
+ * Define function prototypes exported outside.
+ *
+ * Required to silent gcc "no previous prototype" warnings.
+ */
+void preempt_yield(void);
+int preempt_needPreempt(void);
+void preempt_preempt(void);
+void preempt_switch(void);
+void preempt_init(void);
+
 /**
  * Call the scheduler and eventually replace the current running process.
  */
 static void preempt_schedule(void)
 {
-       Process *old_process = current_process;
-
-       IRQ_ASSERT_DISABLED();
-
-       /* Poll on the ready queue for the first ready process */
-       LIST_ASSERT_VALID(&proc_ready_list);
-       current_process = (Process *)list_remHead(&proc_ready_list);
-       if (UNLIKELY(!current_process))
-               current_process = idle_proc;
        _proc_quantum = CONFIG_KERN_QUANTUM;
-       /*
-        * Optimization: don't switch contexts when the active process has not
-        * changed.
-        */
-       if (LIKELY(old_process != current_process))
-       {
-               cpu_stack_t *dummy;
-
-               /*
-                * Save context of old process and switch to new process. If
-                * there is no old process, we save the old stack pointer into
-                * a dummy variable that we ignore. In fact, this happens only
-                * when the old process has just exited.
-                *
-                * \todo Instead of physically clearing the process at exit
-                * time, a zombie list should be created.
-                */
-               asm_switch_context(&current_process->stack,
-                               old_process ? &old_process->stack : &dummy);
-       }
-
-       /* This RET resumes the execution on the new process */
-       LOG_INFO("resuming %p:%s\n", current_process, proc_currentName());
+       proc_schedule();
 }
 
 /**
@@ -187,8 +164,7 @@ void preempt_preempt(void)
        /* Perform the kernel preemption */
        LOG_INFO("preempting %p:%s\n", current_process, proc_currentName());
        /* We are inside a IRQ context, so ATOMIC is not needed here */
-       if (current_process != idle_proc)
-               SCHED_ENQUEUE(current_process);
+       SCHED_ENQUEUE(current_process);
        preempt_schedule();
 }
 
@@ -230,8 +206,5 @@ void preempt_yield(void)
 
 void preempt_init(void)
 {
-       idle_init();
        MOD_INIT(preempt);
 }
-
-#endif // CONFIG_KERN_PREEMPT