Fatal if we try to reinitialize the RTS
authorSimon Marlow <marlowsd@gmail.com>
Thu, 26 Jan 2017 23:13:43 +0000 (18:13 -0500)
committerBen Gamari <ben@smart-cactus.org>
Thu, 26 Jan 2017 23:13:57 +0000 (18:13 -0500)
This isn't supported, and fatalling with an error is better than
segfaulting later.

Test Plan: validate

Reviewers: JonCoens, austin, erikd, niteria, bgamari

Reviewed By: niteria, bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D3020

rts/RtsStartup.c

index 98c1dd2..9ec8af8 100644 (file)
@@ -62,6 +62,7 @@
 
 // Count of how many outstanding hs_init()s there have been.
 static int hs_init_count = 0;
+static bool rts_shutdown = false;
 
 static void flushStdHandles(void);
 
@@ -145,6 +146,10 @@ hs_init_ghc(int *argc, char **argv[], RtsConfig rts_config)
         // second and subsequent inits are ignored
         return;
     }
+    if (rts_shutdown) {
+        errorBelch("hs_init_ghc: reinitializing the RTS after shutdown is not currently supported");
+        stg_exit(1);
+    }
 
     setlocale(LC_CTYPE,"");
 
@@ -338,6 +343,7 @@ hs_exit_(bool wait_foreign)
         // ignore until it's the last one
         return;
     }
+    rts_shutdown = true;
 
     /* start timing the shutdown */
     stat_startExit();