104 assert(_covered_region.contains(result), 105 "out of bounds accessor from card marking array"); 106 107 return result; 108 } 109 110 public: 111 112 // This method is in lieu of a constructor, so that this class can be 113 // embedded inline in other classes. 114 void initialize(MemRegion reserved_region); 115 116 void set_covered_region(MemRegion mr); 117 118 void reset(); 119 120 MemRegion covered_region() { return _covered_region; } 121 122 #define assert_covered_region_contains(addr) \ 123 assert(_covered_region.contains(addr), \ 124 err_msg(#addr " (" PTR_FORMAT ") is not in covered region [" PTR_FORMAT ", " PTR_FORMAT "]", \ 125 p2i(addr), p2i(_covered_region.start()), p2i(_covered_region.end()))) 126 127 void allocate_block(HeapWord* p) { 128 assert_covered_region_contains(p); 129 jbyte* block = block_for_addr(p); 130 HeapWord* block_base = addr_for_block(block); 131 size_t offset = pointer_delta(p, block_base, sizeof(HeapWord*)); 132 assert(offset < 128, "Sanity"); 133 // When doing MT offsets, we can't assert this. 134 //assert(offset > *block, "Found backwards allocation"); 135 *block = (jbyte)offset; 136 } 137 138 // Optimized for finding the first object that crosses into 139 // a given block. The blocks contain the offset of the last 140 // object in that block. Scroll backwards by one, and the first 141 // object hit should be at the beginning of the block 142 HeapWord* object_start(HeapWord* addr) const { 143 assert_covered_region_contains(addr); 144 jbyte* block = block_for_addr(addr); 145 HeapWord* scroll_forward = offset_addr_for_block(block--); | 104 assert(_covered_region.contains(result), 105 "out of bounds accessor from card marking array"); 106 107 return result; 108 } 109 110 public: 111 112 // This method is in lieu of a constructor, so that this class can be 113 // embedded inline in other classes. 114 void initialize(MemRegion reserved_region); 115 116 void set_covered_region(MemRegion mr); 117 118 void reset(); 119 120 MemRegion covered_region() { return _covered_region; } 121 122 #define assert_covered_region_contains(addr) \ 123 assert(_covered_region.contains(addr), \ 124 #addr " (" PTR_FORMAT ") is not in covered region [" PTR_FORMAT ", " PTR_FORMAT "]", \ 125 p2i(addr), p2i(_covered_region.start()), p2i(_covered_region.end())) 126 127 void allocate_block(HeapWord* p) { 128 assert_covered_region_contains(p); 129 jbyte* block = block_for_addr(p); 130 HeapWord* block_base = addr_for_block(block); 131 size_t offset = pointer_delta(p, block_base, sizeof(HeapWord*)); 132 assert(offset < 128, "Sanity"); 133 // When doing MT offsets, we can't assert this. 134 //assert(offset > *block, "Found backwards allocation"); 135 *block = (jbyte)offset; 136 } 137 138 // Optimized for finding the first object that crosses into 139 // a given block. The blocks contain the offset of the last 140 // object in that block. Scroll backwards by one, and the first 141 // object hit should be at the beginning of the block 142 HeapWord* object_start(HeapWord* addr) const { 143 assert_covered_region_contains(addr); 144 jbyte* block = block_for_addr(addr); 145 HeapWord* scroll_forward = offset_addr_for_block(block--); |