< prev index next >

src/hotspot/share/cds/archiveHeapLoader.cpp

Print this page

409 
410 void ArchiveHeapLoader::fill_failed_loaded_heap() {
411   assert(_loading_failed, "must be");
412   if (_loaded_heap_bottom != 0) {
413     assert(_loaded_heap_top != 0, "must be");
414     HeapWord* bottom = (HeapWord*)_loaded_heap_bottom;
415     HeapWord* top = (HeapWord*)_loaded_heap_top;
416     Universe::heap()->fill_with_objects(bottom, top - bottom);
417   }
418 }
419 
420 class PatchNativePointers: public BitMapClosure {
421   Metadata** _start;
422 
423  public:
424   PatchNativePointers(Metadata** start) : _start(start) {}
425 
426   bool do_bit(size_t offset) {
427     Metadata** p = _start + offset;
428     *p = (Metadata*)(address(*p) + MetaspaceShared::relocation_delta());
429     // Currently we have only Klass pointers in heap objects.
430     // This needs to be relaxed when we support other types of native
431     // pointers such as Method.
432     assert(((Klass*)(*p))->is_klass(), "must be");
433     return true;
434   }
435 };
436 
437 void ArchiveHeapLoader::patch_native_pointers() {
438   if (MetaspaceShared::relocation_delta() == 0) {
439     return;
440   }
441 
442   FileMapRegion* r = FileMapInfo::current_info()->region_at(MetaspaceShared::hp);
443   if (r->mapped_base() != nullptr && r->has_ptrmap()) {
444     log_info(cds, heap)("Patching native pointers in heap region");
445     BitMapView bm = FileMapInfo::current_info()->ptrmap_view(MetaspaceShared::hp);
446     PatchNativePointers patcher((Metadata**)r->mapped_base() + FileMapInfo::current_info()->heap_ptrmap_start_pos());
447     bm.iterate(&patcher);
448   }
449 }
450 #endif // INCLUDE_CDS_JAVA_HEAP

409 
410 void ArchiveHeapLoader::fill_failed_loaded_heap() {
411   assert(_loading_failed, "must be");
412   if (_loaded_heap_bottom != 0) {
413     assert(_loaded_heap_top != 0, "must be");
414     HeapWord* bottom = (HeapWord*)_loaded_heap_bottom;
415     HeapWord* top = (HeapWord*)_loaded_heap_top;
416     Universe::heap()->fill_with_objects(bottom, top - bottom);
417   }
418 }
419 
420 class PatchNativePointers: public BitMapClosure {
421   Metadata** _start;
422 
423  public:
424   PatchNativePointers(Metadata** start) : _start(start) {}
425 
426   bool do_bit(size_t offset) {
427     Metadata** p = _start + offset;
428     *p = (Metadata*)(address(*p) + MetaspaceShared::relocation_delta());




429     return true;
430   }
431 };
432 
433 void ArchiveHeapLoader::patch_native_pointers() {
434   if (MetaspaceShared::relocation_delta() == 0) {
435     return;
436   }
437 
438   FileMapRegion* r = FileMapInfo::current_info()->region_at(MetaspaceShared::hp);
439   if (r->mapped_base() != nullptr && r->has_ptrmap()) {
440     log_info(cds, heap)("Patching native pointers in heap region");
441     BitMapView bm = FileMapInfo::current_info()->ptrmap_view(MetaspaceShared::hp);
442     PatchNativePointers patcher((Metadata**)r->mapped_base() + FileMapInfo::current_info()->heap_ptrmap_start_pos());
443     bm.iterate(&patcher);
444   }
445 }
446 #endif // INCLUDE_CDS_JAVA_HEAP
< prev index next >