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