20 * or visit www.oracle.com if you need additional information or have any |
20 * or visit www.oracle.com if you need additional information or have any |
21 * questions. |
21 * questions. |
22 * |
22 * |
23 */ |
23 */ |
24 #include "precompiled.hpp" |
24 #include "precompiled.hpp" |
25 #include "jfr/leakprofiler/chains/bitset.hpp" |
25 #include "jfr/leakprofiler/chains/bitset.inline.hpp" |
26 #include "jfr/recorder/storage/jfrVirtualMemory.hpp" |
|
27 #include "memory/memRegion.hpp" |
|
28 |
26 |
29 BitSet::BitSet(const MemRegion& covered_region) : |
27 BitSet::BitMapFragment::BitMapFragment(uintptr_t granule, BitMapFragment* next) : |
30 _vmm(NULL), |
28 _bits(_bitmap_granularity_size >> LogMinObjAlignmentInBytes, mtTracing, true /* clear */), |
31 _region_start(covered_region.start()), |
29 _next(next) { |
32 _region_size(covered_region.word_size()) { |
30 } |
|
31 |
|
32 BitSet::BitSet() : |
|
33 _bitmap_fragments(32), |
|
34 _fragment_list(NULL), |
|
35 _last_fragment_bits(NULL), |
|
36 _last_fragment_granule(0) { |
33 } |
37 } |
34 |
38 |
35 BitSet::~BitSet() { |
39 BitSet::~BitSet() { |
36 delete _vmm; |
40 BitMapFragment* current = _fragment_list; |
|
41 while (current != NULL) { |
|
42 BitMapFragment* next = current->next(); |
|
43 delete current; |
|
44 current = next; |
|
45 } |
37 } |
46 } |
38 |
|
39 bool BitSet::initialize() { |
|
40 assert(_vmm == NULL, "invariant"); |
|
41 _vmm = new JfrVirtualMemory(); |
|
42 if (_vmm == NULL) { |
|
43 return false; |
|
44 } |
|
45 |
|
46 const BitMap::idx_t bits = _region_size >> LogMinObjAlignment; |
|
47 const size_t words = bits / BitsPerWord; |
|
48 const size_t raw_bytes = words * sizeof(BitMap::idx_t); |
|
49 |
|
50 // the virtual memory invocation will reserve and commit the entire space |
|
51 BitMap::bm_word_t* map = (BitMap::bm_word_t*)_vmm->initialize(raw_bytes, raw_bytes); |
|
52 if (map == NULL) { |
|
53 return false; |
|
54 } |
|
55 _bits = BitMapView(map, bits); |
|
56 return true; |
|
57 } |
|
58 |
|