< prev index next >

src/share/vm/gc/parallel/objectStartArray.cpp

Print this page
rev 9847 : 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
Summary: Fix remaining issues after 8146401

@@ -121,10 +121,31 @@
 
 void ObjectStartArray::reset() {
   memset(_blocks_region.start(), clean_block, _blocks_region.byte_size());
 }
 
+// Optimized for finding the first object that crosses into
+// a given block. The blocks contain the offset of the last
+// object in that block. Scroll backwards by one, and the first
+// object hit should be at the beginning of the block
+HeapWord* ObjectStartArray::object_start(HeapWord* addr) const {
+  assert_covered_region_contains(addr);
+  jbyte* block = block_for_addr(addr);
+  HeapWord* scroll_forward = offset_addr_for_block(block--);
+  while (scroll_forward > addr) {
+    scroll_forward = offset_addr_for_block(block--);
+  }
+
+  HeapWord* next = scroll_forward;
+  while (next <= addr) {
+    scroll_forward = next;
+    next += oop(next)->size();
+  }
+  assert(scroll_forward <= addr, "wrong order for current and arg");
+  assert(addr <= next, "wrong order for arg and next");
+  return scroll_forward;
+}
 
 bool ObjectStartArray::object_starts_in_range(HeapWord* start_addr,
                                               HeapWord* end_addr) const {
   assert(start_addr <= end_addr,
          "Range is wrong. start_addr (" PTR_FORMAT ") is after end_addr (" PTR_FORMAT ")",
< prev index next >