added waiting for active API threads on program exit
authorHolger Schemel <info@artsoft.org>
Sat, 30 Oct 2021 18:17:18 +0000 (20:17 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Oct 2021 18:17:18 +0000 (20:17 +0200)
src/init.c

index 8c0f26e3ede53fd49e6feccfa6ed995f635d7e54..8c6c7e12e1d6d7010cb9fdfea0e03a15dba24c9c 100644 (file)
@@ -6351,8 +6351,44 @@ void OpenAll(void)
 #endif
 }
 
+static boolean WaitForApiThreads(void)
+{
+  unsigned int thread_delay = 0;
+  unsigned int thread_delay_value = 10000;
+
+  if (program.api_thread_count == 0)
+    return TRUE;
+
+  // deactivate global animations (not accessible in game state "loading")
+  setup.toons = FALSE;
+
+  // set game state to "loading" to be able to show busy animation
+  SetGameStatus(GAME_MODE_LOADING);
+
+  ResetDelayCounter(&thread_delay);
+
+  // wait for threads to finish (and fail on timeout)
+  while (program.api_thread_count > 0)
+  {
+    if (DelayReached(&thread_delay, thread_delay_value))
+    {
+      Error("failed waiting for threads - TIMEOUT");
+
+      return FALSE;
+    }
+
+    UPDATE_BUSY_STATE();
+
+    Delay(20);
+  }
+
+  return TRUE;
+}
+
 void CloseAllAndExit(int exit_value)
 {
+  WaitForApiThreads();
+
   StopSounds();
   FreeAllSounds();
   FreeAllMusic();