|
40 | 40 | #include "memory/allocation.hpp"
|
41 | 41 | #include "memory/archiveUtils.hpp"
|
42 | 42 | #include "memory/filemap.hpp"
|
| 43 | +#include "memory/heapShared.hpp" |
43 | 44 | #include "memory/metadataFactory.hpp"
|
44 | 45 | #include "memory/metaspaceClosure.hpp"
|
45 | 46 | #include "memory/oopFactory.hpp"
|
@@ -1541,3 +1542,52 @@ bool SystemDictionaryShared::empty_dumptime_table() {
|
1541 | 1542 | }
|
1542 | 1543 | return false;
|
1543 | 1544 | }
|
| 1545 | + |
| 1546 | +#if INCLUDE_CDS_JAVA_HEAP |
| 1547 | + |
| 1548 | +class ArchivedMirrorPatcher { |
| 1549 | + static void update(Klass* k) { |
| 1550 | + if (k->has_raw_archived_mirror()) { |
| 1551 | + oop m = HeapShared::materialize_archived_object(k->archived_java_mirror_raw_narrow()); |
| 1552 | + if (m != NULL) { |
| 1553 | + java_lang_Class::update_archived_mirror_native_pointers(m); |
| 1554 | + } |
| 1555 | + } |
| 1556 | + } |
| 1557 | + |
| 1558 | +public: |
| 1559 | + static void update_array_klasses(Klass* ak) { |
| 1560 | + while (ak != NULL) { |
| 1561 | + update(ak); |
| 1562 | + ak = ArrayKlass::cast(ak)->higher_dimension(); |
| 1563 | + } |
| 1564 | + } |
| 1565 | + |
| 1566 | + void do_value(const RunTimeSharedClassInfo* info) { |
| 1567 | + InstanceKlass* ik = info->_klass; |
| 1568 | + update(ik); |
| 1569 | + update_array_klasses(ik->array_klasses()); |
| 1570 | + } |
| 1571 | +}; |
| 1572 | + |
| 1573 | +void SystemDictionaryShared::update_archived_mirror_native_pointers_for(RunTimeSharedDictionary* dict) { |
| 1574 | + ArchivedMirrorPatcher patcher; |
| 1575 | + dict->iterate(&patcher); |
| 1576 | +} |
| 1577 | + |
| 1578 | +void SystemDictionaryShared::update_archived_mirror_native_pointers() { |
| 1579 | + if (!HeapShared::open_archive_heap_region_mapped()) { |
| 1580 | + return; |
| 1581 | + } |
| 1582 | + if (MetaspaceShared::relocation_delta() == 0) { |
| 1583 | + return; |
| 1584 | + } |
| 1585 | + update_archived_mirror_native_pointers_for(&_builtin_dictionary); |
| 1586 | + update_archived_mirror_native_pointers_for(&_unregistered_dictionary); |
| 1587 | + |
| 1588 | + for (int t = T_BOOLEAN; t <= T_LONG; t++) { |
| 1589 | + Klass* k = Universe::typeArrayKlassObj((BasicType)t); |
| 1590 | + ArchivedMirrorPatcher::update_array_klasses(k); |
| 1591 | + } |
| 1592 | +} |
| 1593 | +#endif |
0 commit comments