< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp

Print this page
*** 69,16 ***
        if (klass->is_stack_chunk_instance_klass()) {
          // Loom doesn't support mixing of weak marking and strong marking of stack chunks.
          cl->set_weak(false);
        }
        obj->oop_iterate(cl);
!     } else if (klass->is_objArray_klass()) {
        // Case 2: Object array instance and no chunk is set. Must be the first
        // time we visit it, start the chunked processing.
        do_chunked_array_start<T>(q, cl, obj, klass, weak);
      } else {
!       // Case 3: Primitive array. Do nothing, no oops there. We use the same
        // performance tweak TypeArrayKlass::oop_oop_iterate_impl is using:
        // We skip iterating over the klass pointer since we know that
        // Universe::TypeArrayKlass never moves.
        assert(klass->is_typeArray_klass(), "should be type array");
      }
--- 69,19 ---
        if (klass->is_stack_chunk_instance_klass()) {
          // Loom doesn't support mixing of weak marking and strong marking of stack chunks.
          cl->set_weak(false);
        }
        obj->oop_iterate(cl);
!     } else if (klass->is_refArray_klass()) {
        // Case 2: Object array instance and no chunk is set. Must be the first
        // time we visit it, start the chunked processing.
        do_chunked_array_start<T>(q, cl, obj, klass, weak);
+     } else if (klass->is_flatArray_klass()) {
+       // Case 3: Flat array instance, all elements are embedded.
+       obj->oop_iterate(cl);
      } else {
!       // Case 4: Primitive array. Do nothing, no oops there. We use the same
        // performance tweak TypeArrayKlass::oop_oop_iterate_impl is using:
        // We skip iterating over the klass pointer since we know that
        // Universe::TypeArrayKlass never moves.
        assert(klass->is_typeArray_klass(), "should be type array");
      }

*** 87,11 ***
      // from final- to strong mark.
      if (task->count_liveness()) {
        count_liveness<GENERATION>(live_data, obj, klass, worker_id);
      }
    } else {
!     // Case 4: Array chunk, has sensible chunk id. Process it.
      do_chunked_array<T>(q, cl, obj, task->chunk(), task->pow(), weak);
    }
  }
  
  inline void ShenandoahMark::dedup_string(oop obj, StringDedup::Requests* const req) {
--- 90,11 ---
      // from final- to strong mark.
      if (task->count_liveness()) {
        count_liveness<GENERATION>(live_data, obj, klass, worker_id);
      }
    } else {
!     // Case 5: Array chunk, has sensible chunk id. Process it.
      do_chunked_array<T>(q, cl, obj, task->chunk(), task->pow(), weak);
    }
  }
  
  inline void ShenandoahMark::dedup_string(oop obj, StringDedup::Requests* const req) {

*** 154,12 ***
    }
  }
  
  template <class T>
  void ShenandoahMark::do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop obj, Klass* klass, bool weak) {
!   assert(obj->is_objArray(), "expect object array");
!   objArrayOop array = objArrayOop(obj);
    int len = array->length();
  
    // Mark objArray klass metadata
    if (Devirtualizer::do_metadata(cl)) {
      Devirtualizer::do_klass(cl, klass);
--- 157,12 ---
    }
  }
  
  template <class T>
  void ShenandoahMark::do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop obj, Klass* klass, bool weak) {
!   assert(obj->is_refArray(), "expect ref array");
!   refArrayOop array = refArrayOop(obj);
    int len = array->length();
  
    // Mark objArray klass metadata
    if (Devirtualizer::do_metadata(cl)) {
      Devirtualizer::do_klass(cl, klass);

*** 221,12 ***
    }
  }
  
  template <class T>
  void ShenandoahMark::do_chunked_array(ShenandoahObjToScanQueue* q, T* cl, oop obj, int chunk, int pow, bool weak) {
!   assert(obj->is_objArray(), "expect object array");
!   objArrayOop array = objArrayOop(obj);
  
    // Split out tasks, as suggested in ShenandoahMarkTask docs. Avoid pushing tasks that
    // are known to start beyond the array.
    while ((1 << pow) > (int)ObjArrayMarkingStride && (chunk*2 < ShenandoahMarkTask::chunk_size())) {
      pow--;
--- 224,12 ---
    }
  }
  
  template <class T>
  void ShenandoahMark::do_chunked_array(ShenandoahObjToScanQueue* q, T* cl, oop obj, int chunk, int pow, bool weak) {
!   assert(obj->is_refArray(), "expect ref array");
!   refArrayOop array = refArrayOop(obj);
  
    // Split out tasks, as suggested in ShenandoahMarkTask docs. Avoid pushing tasks that
    // are known to start beyond the array.
    while ((1 << pow) > (int)ObjArrayMarkingStride && (chunk*2 < ShenandoahMarkTask::chunk_size())) {
      pow--;
< prev index next >