fatal-signal: Handle SIGINT for Windows.
authorGurucharan Shetty <gshetty@nicira.com>
Wed, 26 Feb 2014 17:37:19 +0000 (09:37 -0800)
committerGurucharan Shetty <gshetty@nicira.com>
Wed, 26 Feb 2014 20:40:11 +0000 (12:40 -0800)
Ctrl+C signals are a special case for Windows and can
be handled by registering a handle through
SetConsoleCtrlHandler() routine. This is only useful
when we run it directly on console and not as services in
the background.

Once we get a Ctrl+C signal, we call the cleanup functions
and then exit.

One thing to know here is that MinGW terminal handles
Ctrl+C signal differently (and looks a little buggy. I see
it exiting the handler midway with some sort of timeout).
So this implementation is only useful when run on Windows
terminal. Since we only use MinGW for compilation and
eventually to run unit tests, it should be okay. (The unit
tests would ideally use windows services and not expect
Ctrl+C)

Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
lib/fatal-signal.c

index 1e63d48..6b3dd20 100644 (file)
@@ -66,6 +66,9 @@ static struct ovs_mutex mutex;
 
 static void atexit_handler(void);
 static void call_hooks(int sig_nr);
+#ifdef _WIN32
+static BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType);
+#endif
 
 /* Initializes the fatal signal handling module.  Calling this function is
  * optional, because calling any other function in the module will also
@@ -91,6 +94,9 @@ fatal_signal_init(void)
             char *msg_buf = ovs_lasterror_to_string();
             VLOG_FATAL("Failed to create a event (%s).", msg_buf);
         }
+
+        /* Register a function to handle Ctrl+C. */
+        SetConsoleCtrlHandler(ConsoleHandlerRoutine, true);
 #endif
 
         for (i = 0; i < ARRAY_SIZE(fatal_signals); i++) {
@@ -235,6 +241,15 @@ call_hooks(int sig_nr)
         }
     }
 }
+
+#ifdef _WIN32
+BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType)
+{
+    stored_sig_nr = SIGINT;
+    SetEvent(wevent);
+    return true;
+}
+#endif
 \f
 /* Files to delete on exit. */
 static struct sset files = SSET_INITIALIZER(&files);