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--);
|