summaryrefslogtreecommitdiff
path: root/rts/RtsStartup.c
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2015-06-08 11:54:51 +0100
committerSimon Marlow <marlowsd@gmail.com>2015-06-08 11:59:22 +0100
commit19ec6a84d6344c2808d0d41da11956689a0e4ae9 (patch)
treee83ad4f659c4f6323b91d6e562bd1cdf7bacf765 /rts/RtsStartup.c
parent89223ce1340654455a9f3aa9cbf25f30884227fd (diff)
downloadhaskell-19ec6a84d6344c2808d0d41da11956689a0e4ae9.tar.gz
Fix for CAF retention when dynamically loading & unloading code
In a situaion where we have some statically-linked code and we want to load and unload a series of objects, we need the CAFs in the statically-linked code to be retained indefinitely, while the CAFs in the dynamically-linked code should be GC'd as normal, so that we can detect when the code is unloadable. This was wrong before - we GC'd CAFs in the static code, leading to a crash in the rare case where we use a CAF, GC it, and then load a new object that uses it again. I also did some tidy up: RtsConfig now has a field keep_cafs to indicate whether we want CAFs to be retained in static code.
Diffstat (limited to 'rts/RtsStartup.c')
-rw-r--r--rts/RtsStartup.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c
index c50bb07f75..f6544b6aba 100644
--- a/rts/RtsStartup.c
+++ b/rts/RtsStartup.c
@@ -138,12 +138,16 @@ hs_init_ghc(int *argc, char **argv[], RtsConfig rts_config)
stat_startInit();
/* Set the RTS flags to default values. */
-
initRtsFlagsDefaults();
/* Call the user hook to reset defaults, if present */
rts_config.defaultsHook();
+ /* Whether to GC CAFs */
+ if (rts_config.keep_cafs) {
+ setKeepCAFs();
+ }
+
/* Parse the flags, separating the RTS flags from the programs args */
if (argc == NULL || argv == NULL) {
// Use a default for argc & argv if either is not supplied