16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 #ifndef SHARE_GC_Z_ZMARKTERMINATE_INLINE_HPP
25 #define SHARE_GC_Z_ZMARKTERMINATE_INLINE_HPP
26
27 #include "runtime/atomic.hpp"
28 #include "runtime/orderAccess.hpp"
29
30 inline ZMarkTerminate::ZMarkTerminate() :
31 _nworkers(0),
32 _nworking_stage0(0),
33 _nworking_stage1(0) {}
34
35 inline bool ZMarkTerminate::enter_stage(volatile uint* nworking_stage) {
36 return Atomic::sub(1u, nworking_stage) == 0;
37 }
38
39 inline void ZMarkTerminate::exit_stage(volatile uint* nworking_stage) {
40 Atomic::add(nworking_stage, 1u);
41 }
42
43 inline bool ZMarkTerminate::try_exit_stage(volatile uint* nworking_stage) {
44 uint nworking = Atomic::load(nworking_stage);
45
46 for (;;) {
47 if (nworking == 0) {
48 return false;
49 }
50
51 const uint new_nworking = nworking + 1;
52 const uint prev_nworking = Atomic::cmpxchg(new_nworking, nworking_stage, nworking);
53 if (prev_nworking == nworking) {
54 // Success
55 return true;
56 }
|
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 #ifndef SHARE_GC_Z_ZMARKTERMINATE_INLINE_HPP
25 #define SHARE_GC_Z_ZMARKTERMINATE_INLINE_HPP
26
27 #include "runtime/atomic.hpp"
28 #include "runtime/orderAccess.hpp"
29
30 inline ZMarkTerminate::ZMarkTerminate() :
31 _nworkers(0),
32 _nworking_stage0(0),
33 _nworking_stage1(0) {}
34
35 inline bool ZMarkTerminate::enter_stage(volatile uint* nworking_stage) {
36 return Atomic::sub(nworking_stage, 1u) == 0;
37 }
38
39 inline void ZMarkTerminate::exit_stage(volatile uint* nworking_stage) {
40 Atomic::add(nworking_stage, 1u);
41 }
42
43 inline bool ZMarkTerminate::try_exit_stage(volatile uint* nworking_stage) {
44 uint nworking = Atomic::load(nworking_stage);
45
46 for (;;) {
47 if (nworking == 0) {
48 return false;
49 }
50
51 const uint new_nworking = nworking + 1;
52 const uint prev_nworking = Atomic::cmpxchg(new_nworking, nworking_stage, nworking);
53 if (prev_nworking == nworking) {
54 // Success
55 return true;
56 }
|