src/hotspot/share/gc/shared/oopStorageParState.inline.hpp
changeset 49977 9f758f0bb058
parent 49711 4a7addb5762c
--- a/src/hotspot/share/gc/shared/oopStorageParState.inline.hpp	Thu May 03 14:13:20 2018 -0700
+++ b/src/hotspot/share/gc/shared/oopStorageParState.inline.hpp	Thu May 03 17:36:50 2018 -0400
@@ -41,14 +41,26 @@
   bool operator()(OopPtr ptr) const { _f(ptr); return true; }
 };
 
+struct OopStorage::BasicParState::IterationData {
+  size_t _segment_start;
+  size_t _segment_end;
+  size_t _processed;
+};
+
 template<bool is_const, typename F>
 inline void OopStorage::BasicParState::iterate(F f) {
   // Wrap f in ATF so we can use Block::iterate.
   AlwaysTrueFn<F> atf_f(f);
-  ensure_iteration_started();
-  typename Conditional<is_const, const Block*, Block*>::type block;
-  while ((block = claim_next_block()) != NULL) {
-    block->iterate(atf_f);
+  IterationData data = {};      // zero initialize.
+  while (claim_next_segment(&data)) {
+    assert(data._segment_start < data._segment_end, "invariant");
+    assert(data._segment_end <= _block_count, "invariant");
+    typedef typename Conditional<is_const, const Block*, Block*>::type BlockPtr;
+    size_t i = data._segment_start;
+    do {
+      BlockPtr block = _active_array->at(i);
+      block->iterate(atf_f);
+    } while (++i < data._segment_end);
   }
 }