# HG changeset patch # User dholmes # Date 1375964968 14400 # Node ID f5bed20f2492b138a53f21c1e0d6b927f28ace46 # Parent 22a5aff0df0b1333d5b48a1b7e970119dabc6065# Parent cd25d3be91c548a77139c0b76f924a92290bf082 Merge diff -r 22a5aff0df0b -r f5bed20f2492 src/share/vm/utilities/taskqueue.hpp --- a/src/share/vm/utilities/taskqueue.hpp Tue Aug 06 14:28:48 2013 +0400 +++ b/src/share/vm/utilities/taskqueue.hpp Thu Aug 08 08:29:28 2013 -0400 @@ -395,7 +395,13 @@ template bool GenericTaskQueue::pop_global(E& t) { Age oldAge = _age.get(); - uint localBot = _bottom; + // Architectures with weak memory model require a barrier here + // to guarantee that bottom is not older than age, + // which is crucial for the correctness of the algorithm. +#if !(defined SPARC || defined IA32 || defined AMD64) + OrderAccess::fence(); +#endif + uint localBot = OrderAccess::load_acquire((volatile juint*)&_bottom); uint n_elems = size(localBot, oldAge.top()); if (n_elems == 0) { return false; @@ -644,7 +650,7 @@ template inline bool GenericTaskQueue::push(E t) { uint localBot = _bottom; - assert((localBot >= 0) && (localBot < N), "_bottom out of range."); + assert(localBot < N, "_bottom out of range."); idx_t top = _age.top(); uint dirty_n_elems = dirty_size(localBot, top); assert(dirty_n_elems < N, "n_elems out of range.");