From 3a886477def20cfaaacb87a784917b5c6a3238b0 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Wed, 19 Aug 2009 12:32:08 +0000 Subject: [PATCH] Detect C finalizer callbacks in rts_lock() instead of schedule() Otherwise, finalizer callbacks cause a deadlock in the threaded RTS (including GHCi) --- rts/RtsAPI.c | 9 +++++++++ rts/Schedule.c | 8 -------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/rts/RtsAPI.c b/rts/RtsAPI.c index 3eecab1..54d1e75 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; diff --git a/rts/Schedule.c b/rts/Schedule.c index dd33f6f..70601c3 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -252,14 +252,6 @@ schedule (Capability *initialCapability, Task *task) "### NEW SCHEDULER LOOP (task: %p, cap: %p)", task, initialCapability); - 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); - } - schedulePreLoop(); // ----------------------------------------------------------- -- 1.7.10.4