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 } |