< prev index next > src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp
Print this page
if (_terminator != nullptr) {
steal_marking_work(*_terminator, _worker_id);
}
}
- template <typename T>
- inline void follow_array_specialized(objArrayOop obj, size_t start, size_t end, ParCompactionManager* cm) {
- assert(start <= end, "invariant");
- T* const base = (T*)obj->base();
- T* const beg = base + start;
- T* const chunk_end = base + end;
-
- // Push the non-null elements of the next stride on the marking stack.
- for (T* e = beg; e < chunk_end; e++) {
- cm->mark_and_push<T>(e);
- }
- }
-
inline void ParCompactionManager::follow_array(objArrayOop obj, size_t start, size_t end) {
! if (UseCompressedOops) {
! follow_array_specialized<narrowOop>(obj, start, end, this);
! } else {
- follow_array_specialized<oop>(obj, start, end, this);
- }
}
inline void ParCompactionManager::follow_contents(const ScannerTask& task, bool stolen) {
if (task.is_partial_array_state()) {
assert(PSParallelCompact::mark_bitmap()->is_marked(task.to_partial_array_state()->source()), "should be marked");
process_array_chunk(task.to_partial_array_state(), stolen);
} else {
oop obj = task.to_oop();
assert(PSParallelCompact::mark_bitmap()->is_marked(obj), "should be marked");
! if (obj->is_objArray()) {
! push_objArray(obj);
} else {
obj->oop_iterate(&_mark_and_push_closure);
}
}
}
if (_terminator != nullptr) {
steal_marking_work(*_terminator, _worker_id);
}
}
inline void ParCompactionManager::follow_array(objArrayOop obj, size_t start, size_t end) {
! obj->oop_iterate_elements_range(&_mark_and_push_closure,
! checked_cast<int>(start),
! checked_cast<int>(end));
}
inline void ParCompactionManager::follow_contents(const ScannerTask& task, bool stolen) {
if (task.is_partial_array_state()) {
assert(PSParallelCompact::mark_bitmap()->is_marked(task.to_partial_array_state()->source()), "should be marked");
process_array_chunk(task.to_partial_array_state(), stolen);
} else {
oop obj = task.to_oop();
assert(PSParallelCompact::mark_bitmap()->is_marked(obj), "should be marked");
! if (obj->is_array_with_oops()) {
! push_objArray((objArrayOop)obj);
} else {
obj->oop_iterate(&_mark_and_push_closure);
}
}
}
< prev index next >