< prev index next >
src/hotspot/share/classfile/systemDictionaryShared.cpp
Print this page
@@ -38,10 +38,11 @@
#include "classfile/vmSymbols.hpp"
#include "logging/log.hpp"
#include "memory/allocation.hpp"
#include "memory/archiveUtils.hpp"
#include "memory/filemap.hpp"
+#include "memory/heapShared.hpp"
#include "memory/metadataFactory.hpp"
#include "memory/metaspaceClosure.hpp"
#include "memory/oopFactory.hpp"
#include "memory/resourceArea.hpp"
#include "memory/universe.hpp"
@@ -1539,5 +1540,51 @@
if (_dumptime_table->count_of(true) == 0 && _dumptime_table->count_of(false) == 0){
return true;
}
return false;
}
+
+class ArchivedMirrorPatcher {
+ static void update(Klass* k) {
+ if (k->has_raw_archived_mirror()) {
+ oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow());
+ if (m != NULL) {
+ java_lang_Class::update_archived_mirror_native_pointers(m);
+ }
+ }
+ }
+
+public:
+ static void update_array_klasses(Klass* ak) {
+ while (ak != NULL) {
+ update(ak);
+ ak = ArrayKlass::cast(ak)->higher_dimension();
+ }
+ }
+
+ void do_value(const RunTimeSharedClassInfo* info) {
+ InstanceKlass* ik = info->_klass;
+ update(ik);
+ update_array_klasses(ik->array_klasses());
+ }
+};
+
+void SystemDictionaryShared::update_archived_mirror_native_pointers(RunTimeSharedDictionary* dict) {
+ ArchivedMirrorPatcher patcher;
+ dict->iterate(&patcher);
+}
+
+void SystemDictionaryShared::update_archived_mirror_native_pointers() {
+ if (!HeapShared::open_archive_heap_region_mapped()) {
+ return;
+ }
+ if (MetaspaceShared::relocation_delta() == 0) {
+ return;
+ }
+ update_archived_mirror_native_pointers(&_builtin_dictionary);
+ update_archived_mirror_native_pointers(&_unregistered_dictionary);
+
+ for (int t = T_BOOLEAN; t <= T_LONG; t++) {
+ Klass* k = Universe::typeArrayKlassObj((BasicType)t);
+ ArchivedMirrorPatcher::update_array_klasses(k);
+ }
+}
< prev index next >