< 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 >