< prev index next >

src/hotspot/share/cds/archiveHeapWriter.cpp

Print this page

460   // Mark the pointer in the oopmap
461   T* region_bottom = (T*)requested_region_bottom;
462   assert(request_p >= region_bottom, "must be");
463   BitMap::idx_t idx = request_p - region_bottom;
464   assert(idx < oopmap->size(), "overflow");
465   oopmap->set_bit(idx);
466 }
467 
468 void ArchiveHeapWriter::update_header_for_requested_obj(oop requested_obj, oop src_obj,  Klass* src_klass) {
469   assert(UseCompressedClassPointers, "Archived heap only supported for compressed klasses");
470   narrowKlass nk = ArchiveBuilder::current()->get_requested_narrow_klass(src_klass);
471   address buffered_addr = requested_addr_to_buffered_addr(cast_from_oop<address>(requested_obj));
472 
473   oop fake_oop = cast_to_oop(buffered_addr);
474   fake_oop->set_narrow_klass(nk);
475 
476   // We need to retain the identity_hash, because it may have been used by some hashtables
477   // in the shared heap. This also has the side effect of pre-initializing the
478   // identity_hash for all shared objects, so they are less likely to be written
479   // into during run time, increasing the potential of memory sharing.
480   if (src_obj != nullptr) {
481     intptr_t src_hash = src_obj->identity_hash();
482     fake_oop->set_mark(markWord::prototype().copy_set_hash(src_hash));
483     assert(fake_oop->mark().is_unlocked(), "sanity");
484 
485     DEBUG_ONLY(intptr_t archived_hash = fake_oop->identity_hash());
486     assert(src_hash == archived_hash, "Different hash codes: original " INTPTR_FORMAT ", archived " INTPTR_FORMAT, src_hash, archived_hash);
487   }
488 }
489 
490 // Relocate an element in the buffered copy of HeapShared::roots()
491 template <typename T> void ArchiveHeapWriter::relocate_root_at(oop requested_roots, int index, CHeapBitMap* oopmap) {
492   size_t offset = (size_t)((objArrayOop)requested_roots)->obj_at_offset<T>(index);
493   relocate_field_in_buffer<T>((T*)(buffered_heap_roots_addr() + offset), oopmap);
494 }
495 
496 class ArchiveHeapWriter::EmbeddedOopRelocator: public BasicOopIterateClosure {
497   oop _src_obj;
498   address _buffered_obj;
499   CHeapBitMap* _oopmap;
500 
501 public:
502   EmbeddedOopRelocator(oop src_obj, address buffered_obj, CHeapBitMap* oopmap) :

460   // Mark the pointer in the oopmap
461   T* region_bottom = (T*)requested_region_bottom;
462   assert(request_p >= region_bottom, "must be");
463   BitMap::idx_t idx = request_p - region_bottom;
464   assert(idx < oopmap->size(), "overflow");
465   oopmap->set_bit(idx);
466 }
467 
468 void ArchiveHeapWriter::update_header_for_requested_obj(oop requested_obj, oop src_obj,  Klass* src_klass) {
469   assert(UseCompressedClassPointers, "Archived heap only supported for compressed klasses");
470   narrowKlass nk = ArchiveBuilder::current()->get_requested_narrow_klass(src_klass);
471   address buffered_addr = requested_addr_to_buffered_addr(cast_from_oop<address>(requested_obj));
472 
473   oop fake_oop = cast_to_oop(buffered_addr);
474   fake_oop->set_narrow_klass(nk);
475 
476   // We need to retain the identity_hash, because it may have been used by some hashtables
477   // in the shared heap. This also has the side effect of pre-initializing the
478   // identity_hash for all shared objects, so they are less likely to be written
479   // into during run time, increasing the potential of memory sharing.
480   if (src_obj != nullptr && (!(EnableValhalla && src_obj->mark().is_inline_type()))) {
481     intptr_t src_hash = src_obj->identity_hash();
482     fake_oop->set_mark(src_klass->prototype_header().copy_set_hash(src_hash));
483     assert(fake_oop->mark().is_unlocked(), "sanity");
484 
485     DEBUG_ONLY(intptr_t archived_hash = fake_oop->identity_hash());
486     assert(src_hash == archived_hash, "Different hash codes: original " INTPTR_FORMAT ", archived " INTPTR_FORMAT, src_hash, archived_hash);
487   }
488 }
489 
490 // Relocate an element in the buffered copy of HeapShared::roots()
491 template <typename T> void ArchiveHeapWriter::relocate_root_at(oop requested_roots, int index, CHeapBitMap* oopmap) {
492   size_t offset = (size_t)((objArrayOop)requested_roots)->obj_at_offset<T>(index);
493   relocate_field_in_buffer<T>((T*)(buffered_heap_roots_addr() + offset), oopmap);
494 }
495 
496 class ArchiveHeapWriter::EmbeddedOopRelocator: public BasicOopIterateClosure {
497   oop _src_obj;
498   address _buffered_obj;
499   CHeapBitMap* _oopmap;
500 
501 public:
502   EmbeddedOopRelocator(oop src_obj, address buffered_obj, CHeapBitMap* oopmap) :
< prev index next >