Fixed race condition between scheduler and Ctrl-C handler thread.
authorThomas Lopatic <thomas@lopatic.de>
Wed, 23 Mar 2005 22:41:45 +0000 (22:41 +0000)
committerThomas Lopatic <thomas@lopatic.de>
Wed, 23 Mar 2005 22:41:45 +0000 (22:41 +0000)
src/main.c
src/scheduler.c

index 0438145..1877fca 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: main.c,v 1.70 2005/03/21 02:17:36 tlopatic Exp $
+ * $Id: main.c,v 1.71 2005/03/23 22:41:26 tlopatic Exp $
  */
 
 #include <unistd.h>
@@ -60,6 +60,8 @@
 int __stdcall SignalHandler(unsigned long signal);
 void ListInterfaces(void);
 void DisableIcmpRedirects(void);
+olsr_bool olsr_win32_end_request = OLSR_FALSE;
+olsr_bool olsr_win32_end_flag = OLSR_FALSE;
 #else
 static void
 olsr_shutdown(int);
@@ -436,7 +438,18 @@ olsr_shutdown(int signal)
 {
   struct interface *ifn;
 
-  OLSR_PRINTF(1, "Received signal %d - shutting down\n", (int)signal)
+  OLSR_PRINTF(1, "Received signal %d - shutting down\n", (int)signal);
+
+#ifdef WIN32
+  OLSR_PRINTF(1, "Waiting for the scheduler to stop.\n");
+
+  olsr_win32_end_request = TRUE;
+
+  while (!olsr_win32_end_flag)
+    Sleep(100);
+
+  OLSR_PRINTF(1, "Scheduler stopped.\n");
+#endif
 
   olsr_delete_all_kernel_routes();
 
index 86fc1ff..0b7b01c 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: scheduler.c,v 1.28 2005/02/27 18:39:43 kattemat Exp $
+ * $Id: scheduler.c,v 1.29 2005/03/23 22:41:45 tlopatic Exp $
  */
 
 
 #include "olsr.h"
 #include "build_msg.h"
 
+#if defined WIN32
+extern olsr_bool olsr_win32_end_request;
+extern olsr_bool olsr_win32_end_flag;
+#endif
 
 static float pollrate;
 
@@ -224,8 +228,27 @@ scheduler()
          while(nanosleep(&sleeptime_spec, &remainder_spec) < 0)
            sleeptime_spec = remainder_spec;
        }
+
+#if defined WIN32
+      // the Ctrl-C signal handler thread asks us to exit
+
+      if (olsr_win32_end_request)
+        break;
+#endif
       
     }//end for
+
+#if defined WIN32
+  // tell the Ctrl-C signal handler thread that we have exited
+
+  olsr_win32_end_flag = TRUE;
+
+  // the Ctrl-C signal handler thread will exit the process and
+  // hence also kill us
+  
+  while (1)
+    Sleep(1000);
+#endif
 }