Fixed infinite loop in scheduler.
authorMalte S. Stretz <mss@apache.org>
Sun, 4 Jan 2009 18:52:13 +0000 (18:52 +0000)
committerMalte S. Stretz <mss@apache.org>
Sun, 4 Jan 2009 18:52:13 +0000 (18:52 +0000)
src/sched.c
src/sched.h

index 2baf47c..d594f51 100644 (file)
@@ -28,16 +28,41 @@ void sched_init()
 
 /////////////////////////////////////////
 
+void sched_put(sched_func_t func)
+{
+  if (func == NULL) return;
+  g_sched_ring[g_sched_tail] = func;
+  g_sched_tail = (g_sched_tail + 1) % SCHED_QUEUE_LENGTH;
+}
+
+uint8_t sched_get(sched_func_t * func)
+{
+  *func = g_sched_ring[g_sched_head];
+  if (*func == NULL) return 0;
+
+  g_sched_ring[g_sched_head] = NULL;
+  g_sched_head = (g_sched_head + 1) % SCHED_QUEUE_LENGTH;
+  return 1;
+}
+
+/////////////////////////////////////////
+
 void sched_loop()
 {
+  sched_func_t first;
+  uint8_t      running;
   sched_func_t func;
-  int resched;
+  sched_res_t  resched;
+  
   while (1) {
     // Be atomic.
     cli();
 
-    // Peek at scheduler queue for next call.
-    while (sched_get(&func)) {
+    // Peek at scheduler queue for first call.
+    running = sched_get(&func);
+    first = func;
+    // Need a valid pointer.
+    while (running) {
       // Got something, enable interrupts, disable sleep mode.
       sei();
       sleep_disable();
@@ -49,8 +74,12 @@ void sched_loop()
       cli();
 
       // If the call wasn't successful, reschedule.
-      if (resched)
+      if (resched != SCHED_OK)
         sched_put(func);
+      
+      // Get next pointer, exit loop if done.
+      running  = sched_get(&func);
+      running &= (sched_res_t)(func == first);
     }
 
     // Wait for next interrupt.
@@ -60,22 +89,3 @@ void sched_loop()
   }
 }
 
-/////////////////////////////////////////
-
-void sched_put(sched_func_t func)
-{
-  if (func == NULL) return;
-  g_sched_ring[g_sched_tail] = func;
-  g_sched_tail = (g_sched_tail + 1) % SCHED_QUEUE_LENGTH;
-}
-
-int sched_get(sched_func_t * func)
-{
-  *func = g_sched_ring[g_sched_head];
-  if (*func == NULL) return 0;
-
-  g_sched_ring[g_sched_head] = NULL;
-  g_sched_head = (g_sched_head + 1) % SCHED_QUEUE_LENGTH;
-  return 1;
-}
-
index a48e6ff..1186002 100644 (file)
@@ -1,10 +1,14 @@
 #pragma once
 
-typedef int (*sched_func_t)(void);
+#include <inttypes.h>
+
+typedef uint8_t sched_res_t;
+#define SCHED_OK 0
+#define SCHED_RE 1
+typedef sched_res_t (*sched_func_t)(void);
 
 void sched_init(void);
 
 void sched_loop(void);
 
-void sched_put(sched_func_t   func);
-int  sched_get(sched_func_t * func);
+void sched_put(sched_func_t func);