51 G1FullGCMarker::~G1FullGCMarker() {
52 assert(is_task_queue_empty(), "Must be empty at this point");
53 }
54
55 void G1FullGCMarker::process_partial_array(PartialArrayState* state, bool stolen) {
56 // Access state before release by claim().
57 objArrayOop obj_array = objArrayOop(state->source());
58 PartialArraySplitter::Claim claim =
59 _partial_array_splitter.claim(state, task_queue(), stolen);
60 process_array_chunk(obj_array, claim._start, claim._end);
61 }
62
63 static uintx calc_array_stride(uint array_len, uint num_threads) {
64 precond(num_threads > 0);
65
66 const size_t stride = (array_len + num_threads - 1) / num_threads;
67 return clamp(stride, ArrayMarkingMinStride, ObjArrayMarkingStride);
68 }
69
70 void G1FullGCMarker::start_partial_array_processing(objArrayOop obj) {
71 mark_closure()->do_klass(obj->klass());
72 // Don't push empty arrays to avoid unnecessary work.
73 const int array_length = obj->length();
74
75 if (array_length == 0) {
76 return;
77 }
78
79 const uintx stride = calc_array_stride(array_length, _collector->workers());
80 const size_t initial_chunk_size = _partial_array_splitter.start(task_queue(), obj, nullptr, array_length, stride);
81
82 process_array_chunk(obj, 0, initial_chunk_size);
83 }
84
85 void G1FullGCMarker::complete_marking(G1ScannerTasksQueueSet* task_queues,
86 TaskTerminator* terminator) {
87 do {
88 process_marking_stacks();
89 ScannerTask stolen_task;
90 if (task_queues->steal(_worker_id, stolen_task)) {
91 dispatch_task(stolen_task, true);
|
51 G1FullGCMarker::~G1FullGCMarker() {
52 assert(is_task_queue_empty(), "Must be empty at this point");
53 }
54
55 void G1FullGCMarker::process_partial_array(PartialArrayState* state, bool stolen) {
56 // Access state before release by claim().
57 objArrayOop obj_array = objArrayOop(state->source());
58 PartialArraySplitter::Claim claim =
59 _partial_array_splitter.claim(state, task_queue(), stolen);
60 process_array_chunk(obj_array, claim._start, claim._end);
61 }
62
63 static uintx calc_array_stride(uint array_len, uint num_threads) {
64 precond(num_threads > 0);
65
66 const size_t stride = (array_len + num_threads - 1) / num_threads;
67 return clamp(stride, ArrayMarkingMinStride, ObjArrayMarkingStride);
68 }
69
70 void G1FullGCMarker::start_partial_array_processing(objArrayOop obj) {
71 precond(obj->is_array_with_oops());
72 mark_closure()->do_klass(obj->klass());
73
74 // Don't push empty arrays to avoid unnecessary work.
75 const int array_length = obj->length();
76
77 if (array_length == 0) {
78 return;
79 }
80
81 const uintx stride = calc_array_stride(array_length, _collector->workers());
82 const size_t initial_chunk_size = _partial_array_splitter.start(task_queue(), obj, nullptr, array_length, stride);
83
84 process_array_chunk(obj, 0, initial_chunk_size);
85 }
86
87 void G1FullGCMarker::complete_marking(G1ScannerTasksQueueSet* task_queues,
88 TaskTerminator* terminator) {
89 do {
90 process_marking_stacks();
91 ScannerTask stolen_task;
92 if (task_queues->steal(_worker_id, stolen_task)) {
93 dispatch_task(stolen_task, true);
|