2278 }
2279 }
2280 }
2281
2282 size_t G1CMTask::start_partial_array_processing(oop obj) {
2283 assert(should_be_sliced(obj), "Must be an array object %d and large %zu", obj->is_objArray(), obj->size());
2284
2285 objArrayOop obj_array = objArrayOop(obj);
2286 size_t array_length = obj_array->length();
2287
2288 size_t initial_chunk_size = _partial_array_splitter.start(_task_queue, obj_array, nullptr, array_length);
2289
2290 // Mark objArray klass metadata
2291 if (_cm_oop_closure->do_metadata()) {
2292 _cm_oop_closure->do_klass(obj_array->klass());
2293 }
2294
2295 process_array_chunk(obj_array, 0, initial_chunk_size);
2296
2297 // Include object header size
2298 return objArrayOopDesc::object_size(checked_cast<int>(initial_chunk_size));
2299 }
2300
2301 size_t G1CMTask::process_partial_array(const G1TaskQueueEntry& task, bool stolen) {
2302 PartialArrayState* state = task.to_partial_array_state();
2303 // Access state before release by claim().
2304 objArrayOop obj = objArrayOop(state->source());
2305
2306 PartialArraySplitter::Claim claim =
2307 _partial_array_splitter.claim(state, _task_queue, stolen);
2308
2309 process_array_chunk(obj, claim._start, claim._end);
2310 return heap_word_size((claim._end - claim._start) * heapOopSize);
2311 }
2312
2313 void G1CMTask::drain_global_stack(bool partially) {
2314 if (has_aborted()) {
2315 return;
2316 }
2317
2318 // We have a policy to drain the local queue before we attempt to
|
2278 }
2279 }
2280 }
2281
2282 size_t G1CMTask::start_partial_array_processing(oop obj) {
2283 assert(should_be_sliced(obj), "Must be an array object %d and large %zu", obj->is_objArray(), obj->size());
2284
2285 objArrayOop obj_array = objArrayOop(obj);
2286 size_t array_length = obj_array->length();
2287
2288 size_t initial_chunk_size = _partial_array_splitter.start(_task_queue, obj_array, nullptr, array_length);
2289
2290 // Mark objArray klass metadata
2291 if (_cm_oop_closure->do_metadata()) {
2292 _cm_oop_closure->do_klass(obj_array->klass());
2293 }
2294
2295 process_array_chunk(obj_array, 0, initial_chunk_size);
2296
2297 // Include object header size
2298 return refArrayOopDesc::object_size(checked_cast<int>(initial_chunk_size));
2299 }
2300
2301 size_t G1CMTask::process_partial_array(const G1TaskQueueEntry& task, bool stolen) {
2302 PartialArrayState* state = task.to_partial_array_state();
2303 // Access state before release by claim().
2304 objArrayOop obj = objArrayOop(state->source());
2305
2306 PartialArraySplitter::Claim claim =
2307 _partial_array_splitter.claim(state, _task_queue, stolen);
2308
2309 process_array_chunk(obj, claim._start, claim._end);
2310 return heap_word_size((claim._end - claim._start) * heapOopSize);
2311 }
2312
2313 void G1CMTask::drain_global_stack(bool partially) {
2314 if (has_aborted()) {
2315 return;
2316 }
2317
2318 // We have a policy to drain the local queue before we attempt to
|