--- old/src/hotspot/share/classfile/classLoaderDataGraph.cpp 2018-11-14 07:09:54.256154104 -0500 +++ new/src/hotspot/share/classfile/classLoaderDataGraph.cpp 2018-11-14 07:09:53.976154113 -0500 @@ -230,13 +230,6 @@ return loader_data; } -void ClassLoaderDataGraph::cld_do(CLDClosure* cl) { - assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock); - for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) { - cl->do_cld(cld); - } -} - void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) { assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock); // Only walk the head until any clds not purged from prior unloading @@ -247,6 +240,15 @@ } } +// These are functions called by the GC, which require all of the CLDs, including the +// unloading ones. +void ClassLoaderDataGraph::cld_oops_do(CLDClosure* cl) { + assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock); + for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) { + cl->do_cld(cld); + } +} + void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) { assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock); for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) { @@ -257,12 +259,12 @@ } } -void ClassLoaderDataGraph::always_strong_cld_do(CLDClosure* cl) { +void ClassLoaderDataGraph::always_strong_cld_oops_do(CLDClosure* cl) { assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock); if (ClassUnloading) { roots_cld_do(cl, NULL); } else { - cld_do(cl); + cld_oops_do(cl); } } @@ -286,9 +288,12 @@ HandleMark _hm; // clean up handles when this is done. Handle _holder; Thread* _thread; + NoSafepointVerifier _nsv; // No safepoints allowed in this scope + // unless verifying at a safepoint. public: - ClassLoaderDataGraphIterator() : _next(ClassLoaderDataGraph::_head) { + ClassLoaderDataGraphIterator() : _next(ClassLoaderDataGraph::_head), + _nsv(true, !SafepointSynchronize::is_at_safepoint()) { _thread = Thread::current(); assert_locked_or_safepoint(ClassLoaderDataGraph_lock); } @@ -308,9 +313,25 @@ } return cld; } +}; +void ClassLoaderDataGraph::cld_do(CLDClosure* cl) { + ClassLoaderDataGraphIterator iter; + while (ClassLoaderData* cld = iter.get_next()) { + cl->do_cld(cld); + } +} -}; +void ClassLoaderDataGraph::always_strong_cld_do(CLDClosure* cl) { + assert_locked_or_safepoint(ClassLoaderDataGraph_lock); + if (ClassUnloading) { + // The keep_alive bits are only so GC doesn't unload the classes prematurely, + // not for tools to find. + cl->do_cld(ClassLoaderData::the_null_class_loader_data()); + } else { + cld_do(cl); + } +} // These functions assume that the caller has locked the ClassLoaderDataGraph_lock // if they are not calling the function from a safepoint.