< prev index next >

src/hotspot/share/gc/g1/g1ParScanThreadState.cpp

Print this page
*** 226,42 ***
    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);
--- 226,46 ---
    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 >