summaryrefslogtreecommitdiff
path: root/rts/PrimOps.cmm
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2019-09-07 01:48:46 -0400
committerBen Gamari <ben@smart-cactus.org>2019-09-07 04:13:18 -0400
commit95844745eda80f8fe35794c81e4ac87b9d528999 (patch)
tree3b027829a84db11a2d842447dbec0de50979fb04 /rts/PrimOps.cmm
parentb55ee979d32df938eee9c4c02c189f8be267e8a1 (diff)
downloadhaskell-wip/pause-threads.tar.gz
Support for pausing other threadswip/pause-threads
Diffstat (limited to 'rts/PrimOps.cmm')
-rw-r--r--rts/PrimOps.cmm16
1 files changed, 16 insertions, 0 deletions
diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm
index d9a28d7396..5c4c4d01fc 100644
--- a/rts/PrimOps.cmm
+++ b/rts/PrimOps.cmm
@@ -1451,6 +1451,22 @@ stg_writeTVarzh (P_ tvar, /* :: TVar a */
*
* -------------------------------------------------------------------------- */
+stg_pauseThread ( P_ thread_id ) /* :: TheadId -> State# RW -> (# State# RW, MVar# () #) */
+{
+ P_ msg;
+ ALLOC_PRIM_P (SIZEOF_MessagePauseThread, stg_pauseThread, thread_id);
+ msg = Hp - SIZEOF_MessagePauseThread + WDS(1);
+
+ (P_ mvar) = call stg_newMVarzh();
+
+ SET_HDR(msg, stg_MSG_PAUSE_THREAD_info, CCCS);
+ MessagePauseThread_mvar(msg) = mvar;
+ MessagePauseThread_tso(msg) = tso;
+ ccall sendMessage(cap, StgTSO_cap(tso), msg);
+
+ return (mvar);
+}
+
stg_isEmptyMVarzh ( P_ mvar /* :: MVar a */ )
{
if (StgMVar_value(mvar) == stg_END_TSO_QUEUE_closure) {