diff options
Diffstat (limited to 'rts')
-rw-r--r-- | rts/Messages.c | 9 | ||||
-rw-r--r-- | rts/PrimOps.cmm | 16 | ||||
-rw-r--r-- | rts/StgMiscClosures.cmm | 13 |
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 |