From 61f2cc45c275ce493ec7f53e6f22fb8cda89db31 Mon Sep 17 00:00:00 2001
From: Constantin Wenger <constantin.wenger@googlemail.com>
Date: Sun, 6 Nov 2011 15:17:18 +0100
Subject: [PATCH] Command-line signal handling for Windows

---
 src/porting.cpp | 37 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/src/porting.cpp b/src/porting.cpp
index f349c0ce5..f3a0ab074 100644
--- a/src/porting.cpp
+++ b/src/porting.cpp
@@ -75,10 +75,45 @@ void signal_handler_init(void)
 }
 
 #else // _WIN32
+	#include <signal.h>
+	#include <windows.h>
+	
+	BOOL WINAPI event_handler(DWORD sig)
+	{
+		switch(sig)
+		{
+		case CTRL_C_EVENT:
+		case CTRL_CLOSE_EVENT:
+		case CTRL_LOGOFF_EVENT:
+		case CTRL_SHUTDOWN_EVENT:
+
+			if(g_killed == false)
+			{
+				dstream<<DTIME<<"INFO: event_handler(): "
+						<<"Ctrl+C, Close Event, Logoff Event or Shutdown Event, shutting down."<<std::endl;
+				dstream<<DTIME<<"INFO: event_handler(): "
+						<<"Printing debug stacks"<<std::endl;
+				debug_stacks_print();
+
+				g_killed = true;
+			}
+			else
+			{
+				(void)signal(SIGINT, SIG_DFL);
+			}
 
+			break;
+		case CTRL_BREAK_EVENT:
+			break;
+		}
+		
+		return TRUE;
+	}
+	
 void signal_handler_init(void)
 {
-	// No-op
+	dstream<<"signal_handler_init()"<<std::endl;
+	SetConsoleCtrlHandler( (PHANDLER_ROUTINE)event_handler,TRUE);
 }
 
 #endif
-- 
GitLab