Add some missing getStablePtr()s for CAFs that the RTS refers to
authorSimon Marlow <marlowsd@gmail.com>
Fri, 22 Jan 2010 14:36:58 +0000 (14:36 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 22 Jan 2010 14:36:58 +0000 (14:36 +0000)
A recent patch ("Refactor CoreArity a bit") changed the arity of
GHC.Conc.runSparks such that it became a CAF, and the RTS was not
explicitly retaining it, which led to a crash when the CAF got GC'd.
While fixing this I found a couple of other closures that the RTS
refers to which weren't getting the correct CAF treatment.

rts/Prelude.h
rts/RtsStartup.c

index ecb5f85..cbe7e3e 100644 (file)
@@ -88,6 +88,8 @@ PRELUDE_INFO(base_GHCziStable_StablePtr_con_info);
 #define mainIO_closure            (&ZCMain_main_closure)
 
 #define runSparks_closure         DLL_IMPORT_DATA_REF(base_GHCziConc_runSparks_closure)
+#define ensureIOManagerIsRunning_closure DLL_IMPORT_DATA_REF(base_GHCziConc_ensureIOManagerIsRunning_closure)
+#define runHandlers_closure       DLL_IMPORT_DATA_REF(base_GHCziConc_runHandlers_closure)
 
 #define stackOverflow_closure     DLL_IMPORT_DATA_REF(base_GHCziIOziException_stackOverflow_closure)
 #define heapOverflow_closure      DLL_IMPORT_DATA_REF(base_GHCziIOziException_heapOverflow_closure)
index 6a01e85..f0b2598 100644 (file)
@@ -171,13 +171,20 @@ hs_init(int *argc, char **argv[])
      */
     getStablePtr((StgPtr)runIO_closure);
     getStablePtr((StgPtr)runNonIO_closure);
+
+    getStablePtr((StgPtr)runFinalizerBatch_closure);
+
     getStablePtr((StgPtr)stackOverflow_closure);
     getStablePtr((StgPtr)heapOverflow_closure);
-    getStablePtr((StgPtr)runFinalizerBatch_closure);
     getStablePtr((StgPtr)unpackCString_closure);
     getStablePtr((StgPtr)blockedIndefinitelyOnMVar_closure);
     getStablePtr((StgPtr)nonTermination_closure);
     getStablePtr((StgPtr)blockedIndefinitelyOnSTM_closure);
+    getStablePtr((StgPtr)nestedAtomically_closure);
+
+    getStablePtr((StgPtr)runSparks_closure);
+    getStablePtr((StgPtr)ensureIOManagerIsRunning_closure);
+    getStablePtr((StgPtr)runHandlers_closure);
 
     /* initialise the shared Typeable store */
     initGlobalStore();