< prev index next >

src/hotspot/share/classfile/classLoaderData.cpp

Print this page

        

*** 61,70 **** --- 61,71 ---- #include "memory/metadataFactory.hpp" #include "memory/resourceArea.hpp" #include "oops/access.inline.hpp" #include "oops/oop.inline.hpp" #include "oops/oopHandle.inline.hpp" + #include "oops/valueKlass.hpp" #include "oops/weakHandle.inline.hpp" #include "runtime/atomic.hpp" #include "runtime/handles.inline.hpp" #include "runtime/mutex.hpp" #include "runtime/orderAccess.hpp"
*** 361,370 **** --- 362,381 ---- } assert(k != k->next_link(), "no loops!"); } } + void ClassLoaderData::value_classes_do(void f(ValueKlass*)) { + // Lock-free access requires load_acquire + for (Klass* k = OrderAccess::load_acquire(&_klasses); k != NULL; k = k->next_link()) { + if (k->is_value()) { + f(ValueKlass::cast(k)); + } + assert(k != k->next_link(), "no loops!"); + } + } + void ClassLoaderData::modules_do(void f(ModuleEntry*)) { assert_locked_or_safepoint(Module_lock); if (_unnamed_module != NULL) { f(_unnamed_module); }
*** 527,536 **** --- 538,549 ---- // Some items on the _deallocate_list need to free their C heap structures // if they are not already on the _klasses list. free_deallocate_list_C_heap_structures(); + value_classes_do(ValueKlass::cleanup); + // Clean up class dependencies and tell serviceability tools // these classes are unloading. Must be called // after erroneous classes are released. classes_do(InstanceKlass::unload_class);
*** 821,832 **** --- 834,849 ---- if (m->is_method()) { MetadataFactory::free_metadata(this, (Method*)m); } else if (m->is_constantPool()) { MetadataFactory::free_metadata(this, (ConstantPool*)m); } else if (m->is_klass()) { + if (!((Klass*)m)->is_value()) { MetadataFactory::free_metadata(this, (InstanceKlass*)m); } else { + MetadataFactory::free_metadata(this, (ValueKlass*)m); + } + } else { ShouldNotReachHere(); } } else { // Metadata is alive. // If scratch_class is on stack then it shouldn't be on this list!
< prev index next >