diff options
author | Simon Marlow <marlowsd@gmail.com> | 2009-08-19 12:32:08 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2009-08-19 12:32:08 +0000 |
commit | 3a886477def20cfaaacb87a784917b5c6a3238b0 (patch) | |
tree | b9ca7a107159719a5b4fd5ec20486798d934a26f /rts/RtsAPI.c | |
parent | 2aea029422dc06f50aab82b35e5b3b0a42641ded (diff) | |
download | haskell-3a886477def20cfaaacb87a784917b5c6a3238b0.tar.gz |
Detect C finalizer callbacks in rts_lock() instead of schedule()
Otherwise, finalizer callbacks cause a deadlock in the threaded RTS
(including GHCi)
Diffstat (limited to 'rts/RtsAPI.c')
-rw-r--r-- | rts/RtsAPI.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/rts/RtsAPI.c b/rts/RtsAPI.c index 3eecab14d4..54d1e75672 100644 --- a/rts/RtsAPI.c +++ b/rts/RtsAPI.c @@ -16,6 +16,7 @@ #include "Schedule.h" #include "Capability.h" #include "Stable.h" +#include "Weak.h" /* ---------------------------------------------------------------------------- Building Haskell objects from C datatypes. @@ -537,6 +538,14 @@ rts_lock (void) Capability *cap; Task *task; + if (running_finalizers) { + errorBelch("error: a C finalizer called back into Haskell.\n" + " This was previously allowed, but is disallowed in GHC 6.10.2 and later.\n" + " To create finalizers that may call back into Haskll, use\n" + " Foreign.Concurrent.newForeignPtr instead of Foreign.newForeignPtr."); + stg_exit(EXIT_FAILURE); + } + task = newBoundTask(); cap = NULL; |