diff --git a/rts/Schedule.c b/rts/Schedule.c index 9535bbd2311e3e1722fd8fee9ae06fbe5c540218..0f10b5170ef4b854c77428e8b67893ea4df302d0 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -835,7 +835,7 @@ schedulePushWork(Capability *cap USED_IF_THREADS, if (t->bound) { t->bound->task->cap = free_caps[i]; } - t->cap = free_caps[i]; + RELAXED_STORE(&t->cap, free_caps[i]); n--; // we have one fewer threads now i++; // move on to the next free_cap if (i == n_free_caps) i = 0; diff --git a/rts/Threads.c b/rts/Threads.c index 46a70a11a8bf3a5cb68d26fc839f01c16aa87dff..fc6544ad358a820ff2276da82c9173673721283d 100644 --- a/rts/Threads.c +++ b/rts/Threads.c @@ -272,15 +272,16 @@ tryWakeupThread (Capability *cap, StgTSO *tso) traceEventThreadWakeup (cap, tso, tso->cap->no); #if defined(THREADED_RTS) - if (tso->cap != cap) + Capability *tso_owner = RELAXED_LOAD(&tso->cap); + if (tso_owner != cap) { MessageWakeup *msg; msg = (MessageWakeup *)allocate(cap,sizeofW(MessageWakeup)); msg->tso = tso; SET_HDR(msg, &stg_MSG_TRY_WAKEUP_info, CCS_SYSTEM); - sendMessage(cap, tso->cap, (Message*)msg); + sendMessage(cap, tso_owner, (Message*)msg); debugTraceCap(DEBUG_sched, cap, "message: try wakeup thread %" - FMT_StgThreadID " on cap %d", tso->id, tso->cap->no); + FMT_StgThreadID " on cap %d", tso->id, tso_owner->no); return; } #endif