< prev index next >
src/share/vm/gc/g1/g1ConcurrentMark.inline.hpp
Print this page
rev 11973 : imported patch 8159422-high-mark-stack-contention
rev 11974 : imported patch 8159422-mikael-review
rev 11976 : imported patch 8159422-kim-review
@@ -87,18 +87,32 @@
return _bm.par_set_bit(heapWordToOffset(addr));
}
#undef check_mark
+#ifndef PRODUCT
template<typename Fn>
-inline void G1CMMarkStack::iterate(Fn fn) {
+inline void G1CMMarkStack::iterate(Fn fn) const {
assert_at_safepoint(true);
- assert(!stack_modified(), "Saved index " SIZE_FORMAT " must be the same as " SIZE_FORMAT, _saved_index, _index);
- for (size_t i = 0; i < _index; ++i) {
- fn(_base[i]);
+
+ size_t num_chunks = 0;
+
+ OopChunk* cur = _chunk_list;
+ while (cur != NULL) {
+ guarantee(num_chunks <= _chunks_in_chunk_list, "Found " SIZE_FORMAT " oop chunks which is more than there should be", num_chunks);
+
+ for (size_t i = 0; i < OopsPerChunk; ++i) {
+ if (cur->data[i] == NULL) {
+ break;
+ }
+ fn(cur->data[i]);
+ }
+ cur = cur->next;
+ num_chunks++;
}
}
+#endif
// It scans an object and visits its children.
inline void G1CMTask::scan_object(oop obj) { process_grey_object<true>(obj); }
inline void G1CMTask::push(oop obj) {
< prev index next >