summaryrefslogtreecommitdiff
path: root/rts/PrimOps.cmm
diff options
context:
space:
mode:
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) {