< prev index next > src/hotspot/share/gc/g1/g1ParScanThreadState.cpp
Print this page
RawAccess<IS_NOT_NULL>::oop_store(p, obj);
write_ref_field_post(p, obj);
}
MAYBE_INLINE_EVACUATION
void G1ParScanThreadState::do_partial_array(PartialArrayState* state, bool stolen) {
// Access state before release by claim().
objArrayOop to_array = objArrayOop(state->destination());
PartialArraySplitter::Claim claim =
_partial_array_splitter.claim(state, _task_queue, stolen);
G1HeapRegionAttr dest_attr = _g1h->region_attr(to_array);
G1SkipCardMarkSetter x(&_scanner, dest_attr.is_new_survivor());
// Process claimed task.
! to_array->oop_iterate_elements_range(&_scanner,
! checked_cast<int>(claim._start),
- checked_cast<int>(claim._end));
}
MAYBE_INLINE_EVACUATION
void G1ParScanThreadState::start_partial_objarray(oop from_obj,
oop to_obj) {
assert(from_obj->is_forwarded(), "precondition");
assert(from_obj->forwardee() == to_obj, "precondition");
assert(to_obj->is_objArray(), "precondition");
objArrayOop to_array = objArrayOop(to_obj);
size_t array_length = to_array->length();
size_t initial_chunk_size =
// The source array is unused when processing states.
_partial_array_splitter.start(_task_queue, nullptr, to_array, array_length);
! assert(_scanner.skip_card_mark_set(), "must be");
- // Process the initial chunk. No need to process the type in the
- // klass, as it will already be handled by processing the built-in
- // module.
- to_array->oop_iterate_elements_range(&_scanner, 0, checked_cast<int>(initial_chunk_size));
}
MAYBE_INLINE_EVACUATION
void G1ParScanThreadState::dispatch_task(ScannerTask task, bool stolen) {
verify_task(task);
RawAccess<IS_NOT_NULL>::oop_store(p, obj);
write_ref_field_post(p, obj);
}
+ ALWAYSINLINE
+ void G1ParScanThreadState::process_array_chunk(objArrayOop obj, size_t start, size_t end) {
+ obj->oop_iterate_elements_range(&_scanner,
+ checked_cast<int>(start),
+ checked_cast<int>(end));
+ }
+
MAYBE_INLINE_EVACUATION
void G1ParScanThreadState::do_partial_array(PartialArrayState* state, bool stolen) {
// Access state before release by claim().
objArrayOop to_array = objArrayOop(state->destination());
PartialArraySplitter::Claim claim =
_partial_array_splitter.claim(state, _task_queue, stolen);
G1HeapRegionAttr dest_attr = _g1h->region_attr(to_array);
G1SkipCardMarkSetter x(&_scanner, dest_attr.is_new_survivor());
// Process claimed task.
! assert(to_array->is_objArray(), "Must be");
! process_array_chunk(to_array, claim._start, claim._end);
}
MAYBE_INLINE_EVACUATION
void G1ParScanThreadState::start_partial_objarray(oop from_obj,
oop to_obj) {
assert(from_obj->is_forwarded(), "precondition");
assert(from_obj->forwardee() == to_obj, "precondition");
assert(to_obj->is_objArray(), "precondition");
+ assert(!_scanner.do_metadata(), "precondition");
+ assert(_scanner.skip_card_mark_set(), "precondition");
objArrayOop to_array = objArrayOop(to_obj);
size_t array_length = to_array->length();
size_t initial_chunk_size =
// The source array is unused when processing states.
_partial_array_splitter.start(_task_queue, nullptr, to_array, array_length);
! process_array_chunk(to_array, 0, initial_chunk_size);
}
MAYBE_INLINE_EVACUATION
void G1ParScanThreadState::dispatch_task(ScannerTask task, bool stolen) {
verify_task(task);
< prev index next >