@@ -1492,6 +1492,29 @@ void FileMapRegion::init(int region_index, size_t mapping_offset, size_t size, b
14921492 _mapped_base = NULL ;
14931493}
14941494
1495+ void FileMapRegion::init_bitmaps (ArchiveHeapBitmapInfo oopmap, ArchiveHeapBitmapInfo ptrmap) {
1496+ _oopmap_offset = oopmap._bm_region_offset ;
1497+ _oopmap_size_in_bits = oopmap._size_in_bits ;
1498+
1499+ _ptrmap_offset = ptrmap._bm_region_offset ;
1500+ _ptrmap_size_in_bits = ptrmap._size_in_bits ;
1501+ }
1502+
1503+ BitMapView FileMapRegion::bitmap_view (bool is_oopmap) {
1504+ char * bitmap_base = FileMapInfo::current_info ()->map_bitmap_region ();
1505+ bitmap_base += is_oopmap ? _oopmap_offset : _ptrmap_offset;
1506+ size_t size_in_bits = is_oopmap ? _oopmap_size_in_bits : _ptrmap_size_in_bits;
1507+ return BitMapView ((BitMap::bm_word_t *)(bitmap_base), size_in_bits);
1508+ }
1509+
1510+ BitMapView FileMapRegion::oopmap_view () {
1511+ return bitmap_view (true );
1512+ }
1513+
1514+ BitMapView FileMapRegion::ptrmap_view () {
1515+ assert (has_ptrmap (), " must be" );
1516+ return bitmap_view (false );
1517+ }
14951518
14961519static const char * region_name (int region_index) {
14971520 static const char * names[] = {
@@ -1566,41 +1589,41 @@ void FileMapInfo::write_region(int region, char* base, size_t size,
15661589 }
15671590}
15681591
1569- size_t FileMapInfo::set_oopmaps_offset (GrowableArray<ArchiveHeapOopmapInfo >* oopmaps , size_t curr_size) {
1570- for (int i = 0 ; i < oopmaps ->length (); i++) {
1571- oopmaps ->at (i)._offset = curr_size;
1572- curr_size += oopmaps ->at (i)._oopmap_size_in_bytes ;
1592+ size_t FileMapInfo::set_bitmaps_offset (GrowableArray<ArchiveHeapBitmapInfo >* bitmaps , size_t curr_size) {
1593+ for (int i = 0 ; i < bitmaps ->length (); i++) {
1594+ bitmaps ->at (i)._bm_region_offset = curr_size;
1595+ curr_size += bitmaps ->at (i)._size_in_bytes ;
15731596 }
15741597 return curr_size;
15751598}
15761599
1577- size_t FileMapInfo::write_oopmaps (GrowableArray<ArchiveHeapOopmapInfo >* oopmaps , size_t curr_offset, char * buffer) {
1578- for (int i = 0 ; i < oopmaps ->length (); i++) {
1579- memcpy (buffer + curr_offset, oopmaps ->at (i)._oopmap , oopmaps ->at (i)._oopmap_size_in_bytes );
1580- curr_offset += oopmaps ->at (i)._oopmap_size_in_bytes ;
1600+ size_t FileMapInfo::write_bitmaps (GrowableArray<ArchiveHeapBitmapInfo >* bitmaps , size_t curr_offset, char * buffer) {
1601+ for (int i = 0 ; i < bitmaps ->length (); i++) {
1602+ memcpy (buffer + curr_offset, bitmaps ->at (i)._map , bitmaps ->at (i)._size_in_bytes );
1603+ curr_offset += bitmaps ->at (i)._size_in_bytes ;
15811604 }
15821605 return curr_offset;
15831606}
15841607
15851608char * FileMapInfo::write_bitmap_region (const CHeapBitMap* ptrmap,
1586- GrowableArray<ArchiveHeapOopmapInfo >* closed_oopmaps ,
1587- GrowableArray<ArchiveHeapOopmapInfo >* open_oopmaps ,
1609+ GrowableArray<ArchiveHeapBitmapInfo >* closed_bitmaps ,
1610+ GrowableArray<ArchiveHeapBitmapInfo >* open_bitmaps ,
15881611 size_t &size_in_bytes) {
15891612 size_t size_in_bits = ptrmap->size ();
15901613 size_in_bytes = ptrmap->size_in_bytes ();
15911614
1592- if (closed_oopmaps != NULL && open_oopmaps != NULL ) {
1593- size_in_bytes = set_oopmaps_offset (closed_oopmaps , size_in_bytes);
1594- size_in_bytes = set_oopmaps_offset (open_oopmaps , size_in_bytes);
1615+ if (closed_bitmaps != NULL && open_bitmaps != NULL ) {
1616+ size_in_bytes = set_bitmaps_offset (closed_bitmaps , size_in_bytes);
1617+ size_in_bytes = set_bitmaps_offset (open_bitmaps , size_in_bytes);
15951618 }
15961619
15971620 char * buffer = NEW_C_HEAP_ARRAY (char , size_in_bytes, mtClassShared);
15981621 ptrmap->write_to ((BitMap::bm_word_t *)buffer, ptrmap->size_in_bytes ());
15991622 header ()->set_ptrmap_size_in_bits (size_in_bits);
16001623
1601- if (closed_oopmaps != NULL && open_oopmaps != NULL ) {
1602- size_t curr_offset = write_oopmaps (closed_oopmaps , ptrmap->size_in_bytes (), buffer);
1603- write_oopmaps (open_oopmaps , curr_offset, buffer);
1624+ if (closed_bitmaps != NULL && open_bitmaps != NULL ) {
1625+ size_t curr_offset = write_bitmaps (closed_bitmaps , ptrmap->size_in_bytes (), buffer);
1626+ write_bitmaps (open_bitmaps , curr_offset, buffer);
16041627 }
16051628
16061629 write_region (MetaspaceShared::bm, (char *)buffer, size_in_bytes, /* read_only=*/ true , /* allow_exec=*/ false );
@@ -1639,7 +1662,7 @@ char* FileMapInfo::write_bitmap_region(const CHeapBitMap* ptrmap,
16391662// |
16401663// +-- gap
16411664size_t FileMapInfo::write_heap_regions (GrowableArray<MemRegion>* regions,
1642- GrowableArray<ArchiveHeapOopmapInfo >* oopmaps ,
1665+ GrowableArray<ArchiveHeapBitmapInfo >* bitmaps ,
16431666 int first_region_id, int max_num_regions) {
16441667 assert (max_num_regions <= 2 , " Only support maximum 2 memory regions" );
16451668
@@ -1665,8 +1688,10 @@ size_t FileMapInfo::write_heap_regions(GrowableArray<MemRegion>* regions,
16651688 int region_idx = i + first_region_id;
16661689 write_region (region_idx, start, size, false , false );
16671690 if (size > 0 ) {
1668- space_at (region_idx)->init_oopmap (oopmaps->at (i)._offset ,
1669- oopmaps->at (i)._oopmap_size_in_bits );
1691+ int oopmap_idx = i * 2 ;
1692+ int ptrmap_idx = i * 2 + 1 ;
1693+ space_at (region_idx)->init_bitmaps (bitmaps->at (oopmap_idx),
1694+ bitmaps->at (ptrmap_idx));
16701695 }
16711696 }
16721697 return total_size;
@@ -2307,6 +2332,8 @@ bool FileMapInfo::map_heap_regions(int first, int max, bool is_open_archive,
23072332 log_info (cds)(" UseSharedSpaces: mapped heap regions are corrupt" );
23082333 return false ;
23092334 }
2335+
2336+ si->set_mapped_base (base);
23102337 }
23112338
23122339 cleanup._aborted = false ;
0 commit comments