StgTSO_sp(tso) = StgTSO_sp(tso) + WDS(3); \
lval = W_[StgTSO_sp(tso) - WDS(1)];
-/*
- * Only in threaded mode: we have to be careful when manipulating another thread's TSO,
- * because the scheduler might also be manipulating it.
- */
-#if defined(RTS_SUPPORTS_THREADS)
-#define ACQUIRE_SCHED_LOCK foreign "C" ACQUIRE_LOCK(sched_mutex "ptr");
-#define RELEASE_SCHED_LOCK foreign "C" RELEASE_LOCK(sched_mutex "ptr");
-#else
-#define ACQUIRE_SCHED_LOCK
-#define RELEASE_SCHED_LOCK
-#endif
-
takeMVarzh_fast
{
W_ mvar, val, info, tso;
if (StgMVar_head(mvar) != stg_END_TSO_QUEUE_closure)
{
- ACQUIRE_SCHED_LOCK;
-
/* There are putMVar(s) waiting...
* wake up the first thread on the queue
*/
#if defined(GRAN) || defined(PAR)
/* ToDo: check 2nd arg (mvar) is right */
- "ptr" tso = foreign "C" unblockOneLocked(StgMVar_head(mvar),mvar);
+ "ptr" tso = foreign "C" unblockOne(StgMVar_head(mvar),mvar);
StgMVar_head(mvar) = tso;
#else
- "ptr" tso = foreign "C" unblockOneLocked(StgMVar_head(mvar) "ptr");
+ "ptr" tso = foreign "C" unblockOne(StgMVar_head(mvar) "ptr");
StgMVar_head(mvar) = tso;
#endif
- RELEASE_SCHED_LOCK;
-
if (StgMVar_head(mvar) == stg_END_TSO_QUEUE_closure) {
StgMVar_tail(mvar) = stg_END_TSO_QUEUE_closure;
}
if (StgMVar_head(mvar) != stg_END_TSO_QUEUE_closure) {
- ACQUIRE_SCHED_LOCK;
-
/* There are putMVar(s) waiting...
* wake up the first thread on the queue
*/
#if defined(GRAN) || defined(PAR)
/* ToDo: check 2nd arg (mvar) is right */
- "ptr" tso = foreign "C" unblockOneLocked(StgMVar_head(mvar) "ptr", mvar "ptr");
+ "ptr" tso = foreign "C" unblockOne(StgMVar_head(mvar) "ptr", mvar "ptr");
StgMVar_head(mvar) = tso;
#else
- "ptr" tso = foreign "C" unblockOneLocked(StgMVar_head(mvar) "ptr");
+ "ptr" tso = foreign "C" unblockOne(StgMVar_head(mvar) "ptr");
StgMVar_head(mvar) = tso;
#endif
- RELEASE_SCHED_LOCK;
-
if (StgMVar_head(mvar) == stg_END_TSO_QUEUE_closure) {
StgMVar_tail(mvar) = stg_END_TSO_QUEUE_closure;
}
if (StgMVar_head(mvar) != stg_END_TSO_QUEUE_closure) {
- ACQUIRE_SCHED_LOCK;
-
/* There are takeMVar(s) waiting: wake up the first one
*/
ASSERT(StgTSO_why_blocked(StgMVar_head(mvar)) == BlockedOnMVar::I16);
#if defined(GRAN) || defined(PAR)
/* ToDo: check 2nd arg (mvar) is right */
- "ptr" tso = foreign "C" unblockOneLocked(StgMVar_head(mvar) "ptr",mvar "ptr");
+ "ptr" tso = foreign "C" unblockOne(StgMVar_head(mvar) "ptr",mvar "ptr");
StgMVar_head(mvar) = tso;
#else
- "ptr" tso = foreign "C" unblockOneLocked(StgMVar_head(mvar) "ptr");
+ "ptr" tso = foreign "C" unblockOne(StgMVar_head(mvar) "ptr");
StgMVar_head(mvar) = tso;
#endif
- RELEASE_SCHED_LOCK;
-
if (StgMVar_head(mvar) == stg_END_TSO_QUEUE_closure) {
StgMVar_tail(mvar) = stg_END_TSO_QUEUE_closure;
}
if (StgMVar_head(mvar) != stg_END_TSO_QUEUE_closure) {
- ACQUIRE_SCHED_LOCK;
-
/* There are takeMVar(s) waiting: wake up the first one
*/
ASSERT(StgTSO_why_blocked(StgMVar_head(mvar)) == BlockedOnMVar::I16);
#if defined(GRAN) || defined(PAR)
/* ToDo: check 2nd arg (mvar) is right */
- "ptr" tso = foreign "C" unblockOneLocked(StgMVar_head(mvar) "ptr",mvar "ptr");
+ "ptr" tso = foreign "C" unblockOne(StgMVar_head(mvar) "ptr",mvar "ptr");
StgMVar_head(mvar) = tso;
#else
- "ptr" tso = foreign "C" unblockOneLocked(StgMVar_head(mvar) "ptr");
+ "ptr" tso = foreign "C" unblockOne(StgMVar_head(mvar) "ptr");
StgMVar_head(mvar) = tso;
#endif
- RELEASE_SCHED_LOCK;
-
if (StgMVar_head(mvar) == stg_END_TSO_QUEUE_closure) {
StgMVar_tail(mvar) = stg_END_TSO_QUEUE_closure;
}