summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
Diffstat (limited to 'rts')
-rw-r--r--rts/Messages.c9
-rw-r--r--rts/PrimOps.cmm16
-rw-r--r--rts/StgMiscClosures.cmm13
3 files changed, 38 insertions, 0 deletions
diff --git a/rts/Messages.c b/rts/Messages.c
index d878db5eda..fa3db268cd 100644
--- a/rts/Messages.c
+++ b/rts/Messages.c
@@ -77,6 +77,15 @@ loop:
(W_)tso->id);
tryWakeupThread(cap, tso);
}
+ else if (i == &stg_MSG_PAUSE_THREAD_info)
+ {
+ MessagePauseThread *t = (MessagePauseThread *)m;
+ StgStack *stack = t->tso->stackobj;
+ stack->sp += sizeofW(StgPauseThread);
+ StgPauseThread *frame = (StgPauseThread *) stack->sp;
+ frame->mvar = t->mvar;
+ frame->header.info = &stg_pause_thread_info;
+ }
else if (i == &stg_MSG_THROWTO_info)
{
MessageThrowTo *t = (MessageThrowTo *)m;
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) {
diff --git a/rts/StgMiscClosures.cmm b/rts/StgMiscClosures.cmm
index 03ea91fcb6..7ed617ce30 100644
--- a/rts/StgMiscClosures.cmm
+++ b/rts/StgMiscClosures.cmm
@@ -68,6 +68,16 @@ INFO_TABLE_RET (stg_restore_cccs_eval, RET_SMALL, W_ info_ptr, W_ cccs)
jump stg_ap_0_fast(ret);
}
+INFO_TABLE_RET (stg_pause_thread, RET_SMALL)
+ /* explicit stack */
+{
+ P_ mvar;
+ mvar = Sp(1);
+ Sp_adj(2);
+ R1 = mvar;
+ jump stg_takeMVarzh [R1];
+}
+
/* ----------------------------------------------------------------------------
Support for the bytecode interpreter.
------------------------------------------------------------------------- */
@@ -582,6 +592,9 @@ INFO_TABLE_CONSTR(stg_MSG_BLACKHOLE,3,0,0,PRIM,"MSG_BLACKHOLE","MSG_BLACKHOLE")
INFO_TABLE_CONSTR(stg_MSG_NULL,1,0,0,PRIM,"MSG_NULL","MSG_NULL")
{ foreign "C" barf("MSG_NULL object (%p) entered!", R1) never returns; }
+INFO_TABLE_CONSTR(stg_MSG_PAUSE_THREAD,1,0,0,PRIM,"MSG_PAUSE_THREAD","MSG_PAUSE_THREAD")
+{ foreign "C" barf("MSG_PAUSE_THREAD object (%p) entered!", R1) never returns; }
+
/* ----------------------------------------------------------------------------
END_TSO_QUEUE