< prev index next > src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp
Print this page
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");
}
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");
}
// 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) {
// 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) {
}
}
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);
}
}
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);
}
}
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--;
}
}
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 >