rts_checkSchedStatus: exit the thread, not the process, when Interrupted
authorSimon Marlow <marlowsd@gmail.com>
Wed, 6 Mar 2013 10:28:59 +0000 (10:28 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 10 May 2013 08:02:03 +0000 (09:02 +0100)
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.

rts/RtsAPI.c

index ec19b16..720b732 100644 (file)
@@ -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);