< prev index next >

src/share/vm/classfile/classLoaderData.cpp

Print this page

        

*** 61,70 **** --- 61,71 ---- #include "memory/metaspaceShared.hpp" #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" #include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" + #include "oops/valueKlass.hpp" #include "runtime/atomic.hpp" #include "runtime/javaCalls.hpp" #include "runtime/jniHandles.hpp" #include "runtime/mutex.hpp" #include "runtime/orderAccess.hpp"
*** 288,297 **** --- 289,308 ---- } assert(k != k->next_link(), "no loops!"); } } + void ClassLoaderData::value_classes_do(void f(ValueKlass*)) { + // Lock-free access requires load_ptr_acquire + for (Klass* k = load_ptr_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); }
*** 472,481 **** --- 483,493 ---- } void ClassLoaderData::unload() { _unloading = true; + value_classes_do(ValueKlass::cleanup); // Tell serviceability tools these classes are unloading classes_do(InstanceKlass::notify_unload_class); if (log_is_enabled(Debug, class, loader, data)) { ResourceMark rm;
*** 668,679 **** --- 680,695 ---- 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 >