--- /dev/null 2018-04-03 12:55:20.301839954 +0200 +++ new/src/hotspot/share/gc/z/zRootsIterator.hpp 2018-06-08 19:46:40.196588396 +0200 @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2015, 2018, 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_Z_ZROOTSITERATOR_HPP +#define SHARE_GC_Z_ZROOTSITERATOR_HPP + +#include "gc/shared/oopStorageParState.hpp" +#include "memory/allocation.hpp" +#include "memory/iterator.hpp" +#include "utilities/globalDefinitions.hpp" + +typedef OopStorage::ParState ZOopStorageIterator; +typedef OopStorage::ParState ZConcurrentOopStorageIterator; + +template +class ZSerialOopsDo { +private: + T* const _iter; + volatile bool _claimed; + +public: + ZSerialOopsDo(T* iter); + void oops_do(OopClosure* cl); +}; + +template +class ZParallelOopsDo { +private: + T* const _iter; + volatile bool _completed; + +public: + ZParallelOopsDo(T* iter); + void oops_do(OopClosure* cl); +}; + +template +class ZSerialWeakOopsDo { +private: + T* const _iter; + volatile bool _claimed; + +public: + ZSerialWeakOopsDo(T* iter); + void weak_oops_do(BoolObjectClosure* is_alive, OopClosure* cl); +}; + +template +class ZParallelWeakOopsDo { +private: + T* const _iter; + volatile bool _completed; + +public: + ZParallelWeakOopsDo(T* iter); + void weak_oops_do(BoolObjectClosure* is_alive, OopClosure* cl); +}; + +class ZRootsIterator { +private: + ZOopStorageIterator _vm_weak_handles_iter; + ZOopStorageIterator _jni_handles_iter; + ZOopStorageIterator _jni_weak_handles_iter; + ZOopStorageIterator _string_table_iter; + + void do_universe(OopClosure* cl); + void do_vm_weak_handles(OopClosure* cl); + void do_jni_handles(OopClosure* cl); + void do_jni_weak_handles(OopClosure* cl); + void do_object_synchronizer(OopClosure* cl); + void do_management(OopClosure* cl); + void do_jvmti_export(OopClosure* cl); + void do_jvmti_weak_export(OopClosure* cl); + void do_jfr_weak(OopClosure* cl); + void do_system_dictionary(OopClosure* cl); + void do_class_loader_data_graph(OopClosure* cl); + void do_threads(OopClosure* cl); + void do_code_cache(OopClosure* cl); + void do_string_table(OopClosure* cl); + + ZSerialOopsDo _universe; + ZSerialOopsDo _object_synchronizer; + ZSerialOopsDo _management; + ZSerialOopsDo _jvmti_export; + ZSerialOopsDo _jvmti_weak_export; + ZSerialOopsDo _jfr_weak; + ZSerialOopsDo _system_dictionary; + ZParallelOopsDo _vm_weak_handles; + ZParallelOopsDo _jni_handles; + ZParallelOopsDo _jni_weak_handles; + ZParallelOopsDo _class_loader_data_graph; + ZParallelOopsDo _threads; + ZParallelOopsDo _code_cache; + ZParallelOopsDo _string_table; + +public: + ZRootsIterator(); + ~ZRootsIterator(); + + void oops_do(OopClosure* cl, bool visit_jvmti_weak_export = false); +}; + +class ZWeakRootsIterator { +private: + ZOopStorageIterator _vm_weak_handles_iter; + ZOopStorageIterator _jni_weak_handles_iter; + ZOopStorageIterator _string_table_iter; + + void do_vm_weak_handles(BoolObjectClosure* is_alive, OopClosure* cl); + void do_jni_weak_handles(BoolObjectClosure* is_alive, OopClosure* cl); + void do_jvmti_weak_export(BoolObjectClosure* is_alive, OopClosure* cl); + void do_jfr_weak(BoolObjectClosure* is_alive, OopClosure* cl); + void do_symbol_table(BoolObjectClosure* is_alive, OopClosure* cl); + void do_string_table(BoolObjectClosure* is_alive, OopClosure* cl); + + ZSerialWeakOopsDo _jvmti_weak_export; + ZSerialWeakOopsDo _jfr_weak; + ZParallelWeakOopsDo _vm_weak_handles; + ZParallelWeakOopsDo _jni_weak_handles; + ZParallelWeakOopsDo _symbol_table; + ZParallelWeakOopsDo _string_table; + +public: + ZWeakRootsIterator(); + ~ZWeakRootsIterator(); + + void weak_oops_do(BoolObjectClosure* is_alive, OopClosure* cl); + void oops_do(OopClosure* cl); +}; + +class ZConcurrentWeakRootsIterator { +private: + ZConcurrentOopStorageIterator _vm_weak_handles_iter; + ZConcurrentOopStorageIterator _jni_weak_handles_iter; + ZConcurrentOopStorageIterator _string_table_iter; + + void do_vm_weak_handles(OopClosure* cl); + void do_jni_weak_handles(OopClosure* cl); + void do_string_table(OopClosure* cl); + + ZParallelOopsDo _vm_weak_handles; + ZParallelOopsDo _jni_weak_handles; + ZParallelOopsDo _string_table; + +public: + ZConcurrentWeakRootsIterator(); + + void oops_do(OopClosure* cl); +}; + +class ZThreadRootsIterator { +private: + void do_threads(OopClosure* cl); + + ZParallelOopsDo _threads; + +public: + ZThreadRootsIterator(); + ~ZThreadRootsIterator(); + + void oops_do(OopClosure* cl); +}; + +#endif // SHARE_GC_Z_ZROOTSITERATOR_HPP