369
370 assert_zone_constraints_gyr(_green_zone, _yellow_zone, _red_zone);
371 LOG_ZONES("Updated Refinement Zones: "
372 "green: " SIZE_FORMAT ", "
373 "yellow: " SIZE_FORMAT ", "
374 "red: " SIZE_FORMAT,
375 _green_zone, _yellow_zone, _red_zone);
376 }
377
378 void G1ConcurrentRefine::adjust(double update_rs_time,
379 size_t update_rs_processed_buffers,
380 double goal_ms) {
381 DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
382
383 if (G1UseAdaptiveConcRefinement) {
384 update_zones(update_rs_time, update_rs_processed_buffers, goal_ms);
385
386 // Change the barrier params
387 if (max_num_threads() == 0) {
388 // Disable dcqs notification when there are no threads to notify.
389 dcqs.set_process_completed_buffers_threshold(DirtyCardQueueSet::_process_completed_buffers_threshold_never);
390 } else {
391 // Worker 0 is the primary; wakeup is via dcqs notification.
392 STATIC_ASSERT(max_yellow_zone <= INT_MAX);
393 size_t activate = activation_threshold(0);
394 dcqs.set_process_completed_buffers_threshold(activate);
395 }
396 dcqs.set_max_completed_buffers(red_zone());
397 }
398
399 size_t curr_queue_size = dcqs.completed_buffers_num();
400 if ((dcqs.max_completed_buffers() > 0) &&
401 (curr_queue_size >= yellow_zone())) {
402 dcqs.set_completed_buffers_padding(curr_queue_size);
403 } else {
404 dcqs.set_completed_buffers_padding(0);
405 }
406 dcqs.notify_if_necessary();
407 }
408
409 size_t G1ConcurrentRefine::activation_threshold(uint worker_id) const {
|
369
370 assert_zone_constraints_gyr(_green_zone, _yellow_zone, _red_zone);
371 LOG_ZONES("Updated Refinement Zones: "
372 "green: " SIZE_FORMAT ", "
373 "yellow: " SIZE_FORMAT ", "
374 "red: " SIZE_FORMAT,
375 _green_zone, _yellow_zone, _red_zone);
376 }
377
378 void G1ConcurrentRefine::adjust(double update_rs_time,
379 size_t update_rs_processed_buffers,
380 double goal_ms) {
381 DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
382
383 if (G1UseAdaptiveConcRefinement) {
384 update_zones(update_rs_time, update_rs_processed_buffers, goal_ms);
385
386 // Change the barrier params
387 if (max_num_threads() == 0) {
388 // Disable dcqs notification when there are no threads to notify.
389 dcqs.set_process_completed_buffers_threshold(DirtyCardQueueSet::ProcessCompletedBuffersThresholdNever);
390 } else {
391 // Worker 0 is the primary; wakeup is via dcqs notification.
392 STATIC_ASSERT(max_yellow_zone <= INT_MAX);
393 size_t activate = activation_threshold(0);
394 dcqs.set_process_completed_buffers_threshold(activate);
395 }
396 dcqs.set_max_completed_buffers(red_zone());
397 }
398
399 size_t curr_queue_size = dcqs.completed_buffers_num();
400 if ((dcqs.max_completed_buffers() > 0) &&
401 (curr_queue_size >= yellow_zone())) {
402 dcqs.set_completed_buffers_padding(curr_queue_size);
403 } else {
404 dcqs.set_completed_buffers_padding(0);
405 }
406 dcqs.notify_if_necessary();
407 }
408
409 size_t G1ConcurrentRefine::activation_threshold(uint worker_id) const {
|