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
|