summaryrefslogtreecommitdiff
path: root/rts/RtsAPI.c
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2013-03-06 10:28:59 +0000
committerSimon Marlow <marlowsd@gmail.com>2013-05-10 09:02:03 +0100
commit674cf902fb2cd8a4e30b3287d707d10b6efaf24d (patch)
tree3de9dd109f10b1b8774dec6596f57c3253d1e36c /rts/RtsAPI.c
parentdca18dc7bc679a2fe2ed82e1b63129056bd58933 (diff)
downloadhaskell-674cf902fb2cd8a4e30b3287d707d10b6efaf24d.tar.gz
rts_checkSchedStatus: exit the thread, not the process, when Interrupted
This means that when the process is shutting down, if we have calls to foreign exports in progress, they get forcibly terminated as before, but now they only shut down the calling thread rather than the whole process (with -threaded). This came up in a discussion started by Akio Takano on ghc-users.
Diffstat (limited to 'rts/RtsAPI.c')
-rw-r--r--rts/RtsAPI.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/rts/RtsAPI.c b/rts/RtsAPI.c
index ec19b169b6..720b732323 100644
--- a/rts/RtsAPI.c
+++ b/rts/RtsAPI.c
@@ -522,7 +522,16 @@ rts_checkSchedStatus (char* site, Capability *cap)
stg_exit(EXIT_FAILURE);
case Interrupted:
errorBelch("%s: interrupted", site);
- stg_exit(EXIT_FAILURE);
+#ifdef THREADED_RTS
+ // The RTS is shutting down, and the process will probably
+ // soon exit. We don't want to preempt the shutdown
+ // by exiting the whole process here, so we just terminate the
+ // current thread. Don't forget to release the cap first though.
+ rts_unlock(cap);
+ shutdownThread();
+#else
+ stg_exit(EXIT_FAILURE);
+#endif
default:
errorBelch("%s: Return code (%d) not ok",(site),(rc));
stg_exit(EXIT_FAILURE);