--- old/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp 2019-06-18 13:08:45.414209569 -0400 +++ new/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp 2019-06-18 13:08:45.081209191 -0400 @@ -61,6 +61,98 @@ void oops_do(OopClosure* cl, uint worker_id); }; +class ShenandoahWeakSerialRoot { + typedef void (*WeakOopsDo)(BoolObjectClosure*, OopClosure*); +private: + volatile bool _claimed; + const WeakOopsDo _weak_oops_do; + const ShenandoahPhaseTimings::GCParPhases _phase; + +public: + ShenandoahWeakSerialRoot(WeakOopsDo oops_do, ShenandoahPhaseTimings::GCParPhases); + void weak_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id); +}; + +#if INCLUDE_JVMTI +class ShenandoahJVMTIWeakRoot : public ShenandoahWeakSerialRoot { +public: + ShenandoahJVMTIWeakRoot(); +}; +#endif // INCLUDE_JVMTI + +#if INCLUDE_JFR +class ShenandoahJFRWeakRoot : public ShenandoahWeakSerialRoot { +public: + ShenandoahJFRWeakRoot(); +}; +#endif // INCLUDE_JFR + +class ShenandoahSerialWeakRoots { +private: + JVMTI_ONLY(ShenandoahJVMTIWeakRoot _jvmti_weak_roots;) + JFR_ONLY(ShenandoahJFRWeakRoot _jfr_weak_roots;) +public: + void weak_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id); + void weak_oops_do(OopClosure* cl, uint worker_id); +}; + +template +class ShenandoahWeakRoot { +private: + OopStorage::ParState _itr; + const ShenandoahPhaseTimings::GCParPhases _phase; +public: + ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::GCParPhases phase); + + template + void oops_do(Closure* cl, uint worker_id); +}; + +template <> +class ShenandoahWeakRoot { +private: + OopStorage::ParState _itr; + const ShenandoahPhaseTimings::GCParPhases _phase; + +public: + ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::GCParPhases phase); + + template + void weak_oops_do(IsAliveClosure* is_alive, KeepAliveClosure* keep_alive, uint worker_id); +}; + +template +class ShenandoahWeakRoots { +private: + ShenandoahWeakRoot _jni_roots; + ShenandoahWeakRoot _string_table_roots; + ShenandoahWeakRoot _resolved_method_table_roots; + ShenandoahWeakRoot _vm_roots; + +public: + ShenandoahWeakRoots(); + + template + void oops_do(Closure* cl, uint worker_id = 0); +}; + +template <> +class ShenandoahWeakRoots { +private: + ShenandoahWeakRoot<> _jni_roots; + ShenandoahWeakRoot<> _string_table_roots; + ShenandoahWeakRoot<> _resolved_method_table_roots; + ShenandoahWeakRoot<> _vm_roots; +public: + ShenandoahWeakRoots(); + + template + void oops_do(Closure* cl, uint worker_id = 0); + + template + void weak_oops_do(IsAliveClosure* is_alive, KeepAliveClosure* keep_alive, uint worker_id); +}; + template class ShenandoahJNIHandleRoots { private: @@ -84,18 +176,6 @@ void threads_do(ThreadClosure* tc, uint worker_id); }; -class ShenandoahWeakRoots { -private: - WeakProcessorPhaseTimes _process_timings; - WeakProcessor::Task _task; -public: - ShenandoahWeakRoots(uint n_workers); - ~ShenandoahWeakRoots(); - - template - void oops_do(IsAlive* is_alive, KeepAlive* keep_alive, uint worker_id); -}; - class ShenandoahStringDedupRoots { public: ShenandoahStringDedupRoots(); @@ -168,7 +248,8 @@ ShenandoahJNIHandleRoots<> _jni_roots; ShenandoahClassLoaderDataRoots _cld_roots; ShenandoahThreadRoots _thread_roots; - ShenandoahWeakRoots _weak_roots; + ShenandoahSerialWeakRoots _serial_weak_roots; + ShenandoahWeakRoots<> _weak_roots; ShenandoahStringDedupRoots _dedup_roots; ShenandoahCodeCacheRoots _code_roots; bool _include_concurrent_roots; @@ -186,7 +267,8 @@ ShenandoahJNIHandleRoots<> _jni_roots; ShenandoahClassLoaderDataRoots _cld_roots; ShenandoahThreadRoots _thread_roots; - ShenandoahWeakRoots _weak_roots; + ShenandoahSerialWeakRoots _serial_weak_roots; + ShenandoahWeakRoots<> _weak_roots; ShenandoahStringDedupRoots _dedup_roots; ShenandoahCodeCacheRoots _code_roots; const bool _update_code_cache; @@ -205,7 +287,8 @@ ShenandoahJNIHandleRoots<> _jni_roots; ShenandoahClassLoaderDataRoots _cld_roots; ShenandoahThreadRoots _thread_roots; - ShenandoahWeakRoots _weak_roots; + ShenandoahSerialWeakRoots _serial_weak_roots; + ShenandoahWeakRoots<> _weak_roots; ShenandoahStringDedupRoots _dedup_roots; ShenandoahCodeCacheRoots _code_roots;