< prev index next >

src/hotspot/share/cds/archiveHeapLoader.cpp

Print this page

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

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




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