Try harder not to restart the application when stopping.
authorIain Patterson <me@iain.cx>
Thu, 31 Oct 2013 13:23:55 +0000 (13:23 +0000)
committerIain Patterson <me@iain.cx>
Thu, 31 Oct 2013 13:25:19 +0000 (13:25 +0000)
Try even harder to avoid race conditions whereby one thread reacts to an
application exit and performs a restart even after another thread has
committed to handling a stop control.

Thanks Runner Mei.

service.cpp

index 1e78c3c..ac90ecb 100644 (file)
@@ -11,6 +11,7 @@ char exe[EXE_LENGTH];
 char flags[CMD_LENGTH];\r
 char dir[MAX_PATH];\r
 bool stopping;\r
+bool allow_restart;\r
 unsigned long throttle_delay;\r
 unsigned long stop_method;\r
 HANDLE throttle_timer;\r
@@ -359,6 +360,7 @@ unsigned long WINAPI service_control_handler(unsigned long control, unsigned lon
 /* Start the service */\r
 int start_service() {\r
   stopping = false;\r
+  allow_restart = true;\r
 \r
   if (process_handle) return 0;\r
 \r
@@ -416,6 +418,9 @@ int start_service() {
 \r
 /* Stop the service */\r
 int stop_service(unsigned long exitcode, bool graceful, bool default_action) {\r
+  allow_restart = false;\r
+  if (wait_handle) UnregisterWait(wait_handle);\r
+\r
   if (default_action && ! exitcode && ! graceful) {\r
     log_event(EVENTLOG_INFORMATION_TYPE, NSSM_EVENT_GRACEFUL_SUICIDE, service_name, exe, exit_action_strings[NSSM_EXIT_UNCLEAN], exit_action_strings[NSSM_EXIT_UNCLEAN], exit_action_strings[NSSM_EXIT_UNCLEAN], exit_action_strings[NSSM_EXIT_REALLY] ,0);\r
     graceful = true;\r
@@ -490,6 +495,7 @@ void CALLBACK end_service(void *arg, unsigned char why) {
     this is a controlled shutdown, and don't take any restart action.\r
   */\r
   if (why) return;\r
+  if (! allow_restart) return;\r
 \r
   /* What action should we take? */\r
   int action = NSSM_EXIT_RESTART;\r