diff options
-rw-r--r-- | rts/WSDeque.c | 9 | ||||
-rw-r--r-- | testsuite/tests/rts/testwsdeque.c | 9 |
2 files changed, 12 insertions, 6 deletions
diff --git a/rts/WSDeque.c b/rts/WSDeque.c index b9393b1839..60b8948149 100644 --- a/rts/WSDeque.c +++ b/rts/WSDeque.c @@ -194,14 +194,17 @@ stealWSDeque_ (WSDeque *q) // concurrent popWSQueue() operation. if ((long)b - (long)t <= 0 ) { return NULL; /* already looks empty, abort */ - } - + } + // NB. the load of q->bottom must be ordered before the load of + // q->elements[t & q-> moduloSize]. See comment "KG:..." below + // and Ticket #13633. + load_load_barrier(); /* now access array, see pushBottom() */ stolen = q->elements[t & q->moduloSize]; /* now decide whether we have won */ if ( !(CASTOP(&(q->top),t,t+1)) ) { - /* lost the race, someon else has changed top in the meantime */ + /* lost the race, someone else has changed top in the meantime */ return NULL; } /* else: OK, top has been incremented by the cas call */ diff --git a/testsuite/tests/rts/testwsdeque.c b/testsuite/tests/rts/testwsdeque.c index 3f17f321cd..0a2a64d78e 100644 --- a/testsuite/tests/rts/testwsdeque.c +++ b/testsuite/tests/rts/testwsdeque.c @@ -50,14 +50,17 @@ myStealWSDeque_ (WSDeque *q, uint32_t n) // concurrent popWSQueue() operation. if ((long)b - (long)t <= 0 ) { return NULL; /* already looks empty, abort */ - } - + } + // NB. the load of q->bottom must be ordered before the load of + // q->elements[t & q-> moduloSize]. See comment "KG:..." below + // and Ticket #13633. + load_load_barrier(); /* now access array, see pushBottom() */ stolen = q->elements[t & q->moduloSize]; /* now decide whether we have won */ if ( !(CASTOP(&(q->top),t,t+1)) ) { - /* lost the race, someon else has changed top in the meantime */ + /* lost the race, someone else has changed top in the meantime */ return NULL; } /* else: OK, top has been incremented by the cas call */ |