/* * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. * */ #ifndef SHARE_GC_PARALLEL_PSROOTTYPE_INLINE_HPP #define SHARE_GC_PARALLEL_PSROOTTYPE_INLINE_HPP #include "memory/allocation.hpp" #include "runtime/atomic.hpp" #include "utilities/globalDefinitions.hpp" namespace Parallel { namespace RootType { enum Value { universe, jni_handles, //"threads" are handled in parallel as a special case object_synchronizer, system_dictionary, class_loader_data, management, jvmti, code_cache, JVMCI_ONLY(jvmci COMMA) sentinel }; }} // namespace Parallel::RootType template class EnumClaimer : StackObj { volatile uint _counter; uint _to_exclusive; public: EnumClaimer(T to_exclusive) : _counter(0), _to_exclusive(to_exclusive) { STATIC_ASSERT(sizeof(T) <= sizeof _counter); assert(_to_exclusive <= 20, "arbitrary (please change if needed), but we want to guard against /sparse/ bit-field like enumerations"); } ~EnumClaimer() { assert(_counter >= _to_exclusive, "not all enumerations were claimed"); } bool try_claim(T& enum_reference) { uint claimed = Atomic::add(1u, &_counter) - 1; // -1 is so that we start with zero if (claimed < _to_exclusive) { enum_reference = reinterpret_cast(claimed); return true; } else { return false; } } }; #endif /* SHARE_GC_PARALLEL_PSROOTTYPE_INLINE_HPP */