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
|