X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FSTM.c;h=9d93972e94d057ece5407151d87428e5a03bb444;hb=77b7c34fa24860c91f56250defa91b2d1a7a1c00;hp=c271a25d3cf6bbfe0c2ccd6729a7e7956bf1fe76;hpb=067ec969bb0bdc4c88582e53b040fa2925cbcc56;p=ghc-hetmet.git diff --git a/rts/STM.c b/rts/STM.c index c271a25..9d93972 100644 --- a/rts/STM.c +++ b/rts/STM.c @@ -388,10 +388,18 @@ static void unpark_tso(Capability *cap, StgTSO *tso) { static void unpark_waiters_on(Capability *cap, StgTVar *s) { StgTVarWatchQueue *q; + StgTVarWatchQueue *trail; TRACE("unpark_waiters_on tvar=%p", s); - for (q = s -> first_watch_queue_entry; - q != END_STM_WATCH_QUEUE; + // unblock TSOs in reverse order, to be a bit fairer (#2319) + for (q = s -> first_watch_queue_entry, trail = q; + q != END_STM_WATCH_QUEUE; q = q -> next_queue_entry) { + trail = q; + } + q = trail; + for (; + q != END_STM_WATCH_QUEUE; + q = q -> prev_queue_entry) { if (watcher_is_tso(q)) { unpark_tso(cap, (StgTSO *)(q -> closure)); }