3457 // concurrently with us. Make sure that anything after
3458 // this point does not assume that we are the only GC thread
3459 // running. Note: of course, the actual marking work will
3460 // not start until the safepoint itself is released in
3461 // SuspendibleThreadSet::desynchronize().
3462 doConcurrentMark();
3463 }
3464
3465 return true;
3466 }
3467
3468 void G1CollectedHeap::remove_self_forwarding_pointers() {
3469 G1ParRemoveSelfForwardPtrsTask rsfp_task;
3470 workers()->run_task(&rsfp_task);
3471 }
3472
3473 void G1CollectedHeap::restore_after_evac_failure() {
3474 double remove_self_forwards_start = os::elapsedTime();
3475
3476 remove_self_forwarding_pointers();
3477 _preserved_marks_set.restore(workers());
3478
3479 g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
3480 }
3481
3482 void G1CollectedHeap::preserve_mark_during_evac_failure(uint worker_id, oop obj, markOop m) {
3483 if (!_evacuation_failed) {
3484 _evacuation_failed = true;
3485 }
3486
3487 _evacuation_failed_info_array[worker_id].register_copy_failure(obj->size());
3488 _preserved_marks_set.get(worker_id)->push_if_necessary(obj, m);
3489 }
3490
3491 bool G1ParEvacuateFollowersClosure::offer_termination() {
3492 G1ParScanThreadState* const pss = par_scan_state();
3493 start_term_time();
3494 const bool res = terminator()->offer_termination();
3495 end_term_time();
3496 return res;
3497 }
|
3457 // concurrently with us. Make sure that anything after
3458 // this point does not assume that we are the only GC thread
3459 // running. Note: of course, the actual marking work will
3460 // not start until the safepoint itself is released in
3461 // SuspendibleThreadSet::desynchronize().
3462 doConcurrentMark();
3463 }
3464
3465 return true;
3466 }
3467
3468 void G1CollectedHeap::remove_self_forwarding_pointers() {
3469 G1ParRemoveSelfForwardPtrsTask rsfp_task;
3470 workers()->run_task(&rsfp_task);
3471 }
3472
3473 void G1CollectedHeap::restore_after_evac_failure() {
3474 double remove_self_forwards_start = os::elapsedTime();
3475
3476 remove_self_forwarding_pointers();
3477 SharedRestorePreservedMarksTaskExecutor task_executor(workers());
3478 _preserved_marks_set.restore(&task_executor);
3479
3480 g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
3481 }
3482
3483 void G1CollectedHeap::preserve_mark_during_evac_failure(uint worker_id, oop obj, markOop m) {
3484 if (!_evacuation_failed) {
3485 _evacuation_failed = true;
3486 }
3487
3488 _evacuation_failed_info_array[worker_id].register_copy_failure(obj->size());
3489 _preserved_marks_set.get(worker_id)->push_if_necessary(obj, m);
3490 }
3491
3492 bool G1ParEvacuateFollowersClosure::offer_termination() {
3493 G1ParScanThreadState* const pss = par_scan_state();
3494 start_term_time();
3495 const bool res = terminator()->offer_termination();
3496 end_term_time();
3497 return res;
3498 }
|