From 14002c8eba6fe03bec721bcacf4bed0b3cbca6d5 Mon Sep 17 00:00:00 2001 From: s_nakamoto Date: Wed, 8 Sep 2010 19:24:32 +0000 Subject: [PATCH] Gavin Andresen: clean shutdown on SIGTERM git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@149 1a98c847-1fd6-4fd8-948a-caf3550aa51b --- headers.h | 1 + init.cpp | 14 +++++++++++++- net.cpp | 2 ++ util.cpp | 1 + util.h | 1 + 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/headers.h b/headers.h index 682f7ab1a..31e671201 100644 --- a/headers.h +++ b/headers.h @@ -99,6 +99,7 @@ #include #include #include +#include #endif #ifdef BSD #include diff --git a/init.cpp b/init.cpp index 43a672f5a..95204ad3a 100644 --- a/init.cpp +++ b/init.cpp @@ -10,7 +10,6 @@ - ////////////////////////////////////////////////////////////////////////////// // // Shutdown @@ -57,6 +56,11 @@ void Shutdown(void* parg) } } +void HandleSIGTERM(int) +{ + fRequestShutdown = true; +} + @@ -130,6 +134,14 @@ bool AppInit2(int argc, char* argv[]) #ifndef __WXMSW__ umask(077); #endif +#ifndef __WXMSW__ + // Clean shutdown on SIGTERM + struct sigaction sa; + sa.sa_handler = HandleSIGTERM; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sigaction(SIGTERM, &sa, NULL); +#endif // // Parameters diff --git a/net.cpp b/net.cpp index d1fdd241b..1a64a82c1 100644 --- a/net.cpp +++ b/net.cpp @@ -1163,6 +1163,8 @@ void ThreadMessageHandler2(void* parg) // Wait and allow messages to bunch up vnThreadsRunning[2]--; Sleep(100); + if (fRequestShutdown) + Shutdown(NULL); vnThreadsRunning[2]++; if (fShutdown) return; diff --git a/util.cpp b/util.cpp index ef2e68344..9efa20ede 100644 --- a/util.cpp +++ b/util.cpp @@ -11,6 +11,7 @@ bool fDebug = false; bool fPrintToConsole = false; bool fPrintToDebugger = false; char pszSetDataDir[MAX_PATH] = ""; +bool fRequestShutdown = false; bool fShutdown = false; bool fDaemon = false; bool fCommandLine = false; diff --git a/util.h b/util.h index 22ace616b..42d1fe460 100644 --- a/util.h +++ b/util.h @@ -140,6 +140,7 @@ extern bool fDebug; extern bool fPrintToConsole; extern bool fPrintToDebugger; extern char pszSetDataDir[MAX_PATH]; +extern bool fRequestShutdown; extern bool fShutdown; extern bool fDaemon; extern bool fCommandLine;