src/share/vm/gc/g1/g1ConcurrentMark.cpp

Print this page




 906 
 907     double start_vtime = os::elapsedVTime();
 908 
 909     {
 910       SuspendibleThreadSetJoiner sts_join;
 911 
 912       assert(worker_id < _cm->active_tasks(), "invariant");
 913       G1CMTask* the_task = _cm->task(worker_id);
 914       the_task->record_start_time();
 915       if (!_cm->has_aborted()) {
 916         do {
 917           double start_vtime_sec = os::elapsedVTime();
 918           double mark_step_duration_ms = G1ConcMarkStepDurationMillis;
 919 
 920           the_task->do_marking_step(mark_step_duration_ms,
 921                                     true  /* do_termination */,
 922                                     false /* is_serial*/);
 923 
 924           double end_vtime_sec = os::elapsedVTime();
 925           double elapsed_vtime_sec = end_vtime_sec - start_vtime_sec;
 926           _cm->clear_has_overflown();
 927 
 928           _cm->do_yield_check();
 929 
 930           jlong sleep_time_ms;
 931           if (!_cm->has_aborted() && the_task->has_aborted()) {
 932             sleep_time_ms =
 933               (jlong) (elapsed_vtime_sec * _cm->sleep_factor() * 1000.0);
 934             {
 935               SuspendibleThreadSetLeaver sts_leave;
 936               os::sleep(Thread::current(), sleep_time_ms, false);
 937             }
 938           }
 939         } while (!_cm->has_aborted() && the_task->has_aborted());
 940       }
 941       the_task->record_end_time();
 942       guarantee(!the_task->has_aborted() || _cm->has_aborted(), "invariant");
 943     }
 944 
 945     double end_vtime = os::elapsedVTime();
 946     _cm->update_accum_task_vtime(worker_id, end_vtime - start_vtime);
 947   }




 906 
 907     double start_vtime = os::elapsedVTime();
 908 
 909     {
 910       SuspendibleThreadSetJoiner sts_join;
 911 
 912       assert(worker_id < _cm->active_tasks(), "invariant");
 913       G1CMTask* the_task = _cm->task(worker_id);
 914       the_task->record_start_time();
 915       if (!_cm->has_aborted()) {
 916         do {
 917           double start_vtime_sec = os::elapsedVTime();
 918           double mark_step_duration_ms = G1ConcMarkStepDurationMillis;
 919 
 920           the_task->do_marking_step(mark_step_duration_ms,
 921                                     true  /* do_termination */,
 922                                     false /* is_serial*/);
 923 
 924           double end_vtime_sec = os::elapsedVTime();
 925           double elapsed_vtime_sec = end_vtime_sec - start_vtime_sec;


 926           _cm->do_yield_check();
 927 
 928           jlong sleep_time_ms;
 929           if (!_cm->has_aborted() && the_task->has_aborted()) {
 930             sleep_time_ms =
 931               (jlong) (elapsed_vtime_sec * _cm->sleep_factor() * 1000.0);
 932             {
 933               SuspendibleThreadSetLeaver sts_leave;
 934               os::sleep(Thread::current(), sleep_time_ms, false);
 935             }
 936           }
 937         } while (!_cm->has_aborted() && the_task->has_aborted());
 938       }
 939       the_task->record_end_time();
 940       guarantee(!the_task->has_aborted() || _cm->has_aborted(), "invariant");
 941     }
 942 
 943     double end_vtime = os::elapsedVTime();
 944     _cm->update_accum_task_vtime(worker_id, end_vtime - start_vtime);
 945   }