StgTSO_block_info(CurrentTSO) = mvar;
StgMVar_tail(mvar) = CurrentTSO;
+ R1 = mvar;
jump stg_block_takemvar;
}
tso = StgMVar_head(mvar);
PerformPut(tso,StgMVar_value(mvar));
- if (StgTSO_flags(tso) & TSO_DIRTY == 0) {
+ if (TO_W_(StgTSO_flags(tso)) & TSO_DIRTY == 0) {
foreign "C" dirty_TSO(MyCapability() "ptr", tso "ptr") [];
}
/* actually perform the putMVar for the thread that we just woke up */
tso = StgMVar_head(mvar);
PerformPut(tso,StgMVar_value(mvar));
- if (StgTSO_flags(tso) & TSO_DIRTY == 0) {
+ if (TO_W_(StgTSO_flags(tso)) & TSO_DIRTY == 0) {
foreign "C" dirty_TSO(MyCapability() "ptr", tso "ptr") [];
}
putMVarzh_fast
{
- W_ mvar, info, tso;
+ W_ mvar, val, info, tso;
/* args: R1 = MVar, R2 = value */
mvar = R1;
+ val = R2;
#if defined(THREADED_RTS)
- ("ptr" info) = foreign "C" lockClosure(mvar "ptr") [R2];
+ ("ptr" info) = foreign "C" lockClosure(mvar "ptr") [];
#else
info = GET_INFO(mvar);
#endif
StgTSO_block_info(CurrentTSO) = mvar;
StgMVar_tail(mvar) = CurrentTSO;
+ R1 = mvar;
+ R2 = val;
jump stg_block_putmvar;
}
/* actually perform the takeMVar */
tso = StgMVar_head(mvar);
PerformTake(tso, R2);
- if (StgTSO_flags(tso) & TSO_DIRTY == 0) {
+ if (TO_W_(StgTSO_flags(tso)) & TSO_DIRTY == 0) {
foreign "C" dirty_TSO(MyCapability() "ptr", tso "ptr") [];
}
/* actually perform the takeMVar */
tso = StgMVar_head(mvar);
PerformTake(tso, R2);
- if (StgTSO_flags(tso) & TSO_DIRTY == 0) {
+ if (TO_W_(StgTSO_flags(tso)) & TSO_DIRTY == 0) {
foreign "C" dirty_TSO(MyCapability() "ptr", tso "ptr") [];
}