< prev index next >
src/hotspot/share/classfile/classLoaderData.cpp
Print this page
@@ -61,10 +61,11 @@
#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,10 +362,20 @@
}
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,10 +538,12 @@
// 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,12 +834,16 @@
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 >