61 initialize();
62
63 // set name
64 set_name("G1 Refine#%d", worker_id);
65 create_and_start();
66 }
67
68 void ConcurrentG1RefineThread::initialize() {
69 // Current thread activation threshold
70 _threshold = MIN2(cg1r()->thread_threshold_step() * (_worker_id + 1) + cg1r()->green_zone(),
71 cg1r()->yellow_zone());
72 // A thread deactivates once the number of buffer reached a deactivation threshold
73 _deactivation_threshold =
74 MAX2(_threshold - MIN2(_threshold, cg1r()->thread_threshold_step()),
75 cg1r()->green_zone());
76 }
77
78 void ConcurrentG1RefineThread::wait_for_completed_buffers() {
79 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
80 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
81 while (!_should_terminate && !is_active()) {
82 _monitor->wait(Mutex::_no_safepoint_check_flag);
83 }
84 }
85
86 bool ConcurrentG1RefineThread::is_active() {
87 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
88 return is_primary() ? dcqs.process_completed_buffers() : _active;
89 }
90
91 void ConcurrentG1RefineThread::activate() {
92 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
93 if (!is_primary()) {
94 set_active(true);
95 } else {
96 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
97 dcqs.set_process_completed(true);
98 }
99 _monitor->notify();
100 }
101
102 void ConcurrentG1RefineThread::deactivate() {
103 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
104 if (!is_primary()) {
105 set_active(false);
106 } else {
107 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
108 dcqs.set_process_completed(false);
109 }
110 }
111
112 void ConcurrentG1RefineThread::run() {
113 initialize_in_thread();
114 wait_for_universe_init();
115
116 run_service();
117
118 terminate();
119 }
120
121 void ConcurrentG1RefineThread::run_service() {
122 _vtime_start = os::elapsedVTime();
123
124 while (!_should_terminate) {
125 // Wait for work
126 wait_for_completed_buffers();
127 if (_should_terminate) {
128 break;
129 }
130
131 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
132 log_debug(gc, refine)("Activated %d, on threshold: " SIZE_FORMAT ", current: " SIZE_FORMAT,
133 _worker_id, _threshold, dcqs.completed_buffers_num());
134
135 {
136 SuspendibleThreadSetJoiner sts_join;
137
138 do {
139 size_t curr_buffer_num = dcqs.completed_buffers_num();
140 // If the number of the buffers falls down into the yellow zone,
141 // that means that the transition period after the evacuation pause has ended.
142 if (dcqs.completed_queue_padding() > 0 && curr_buffer_num <= cg1r()->yellow_zone()) {
143 dcqs.set_completed_queue_padding(0);
144 }
145
146 // Check if we need to activate the next thread.
147 if (_next != NULL && !_next->is_active() && curr_buffer_num > _next->_threshold) {
149 }
150 } while (dcqs.apply_closure_to_completed_buffer(_refine_closure,
151 _worker_id + _worker_id_offset,
152 _deactivation_threshold,
153 false /* during_pause */));
154
155 deactivate();
156 log_debug(gc, refine)("Deactivated %d, off threshold: " SIZE_FORMAT ", current: " SIZE_FORMAT,
157 _worker_id, _deactivation_threshold,
158 dcqs.completed_buffers_num());
159 }
160
161 if (os::supports_vtime()) {
162 _vtime_accum = (os::elapsedVTime() - _vtime_start);
163 } else {
164 _vtime_accum = 0.0;
165 }
166 }
167
168 log_debug(gc, refine)("Stopping %d", _worker_id);
169 }
170
171 void ConcurrentG1RefineThread::stop() {
172 // it is ok to take late safepoints here, if needed
173 {
174 MutexLockerEx mu(Terminator_lock);
175 _should_terminate = true;
176 }
177
178 stop_service();
179
180 {
181 MutexLockerEx mu(Terminator_lock);
182 while (!_has_terminated) {
183 Terminator_lock->wait();
184 }
185 }
186 }
187
188 void ConcurrentG1RefineThread::stop_service() {
189 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
190 _monitor->notify();
191 }
|
61 initialize();
62
63 // set name
64 set_name("G1 Refine#%d", worker_id);
65 create_and_start();
66 }
67
68 void ConcurrentG1RefineThread::initialize() {
69 // Current thread activation threshold
70 _threshold = MIN2(cg1r()->thread_threshold_step() * (_worker_id + 1) + cg1r()->green_zone(),
71 cg1r()->yellow_zone());
72 // A thread deactivates once the number of buffer reached a deactivation threshold
73 _deactivation_threshold =
74 MAX2(_threshold - MIN2(_threshold, cg1r()->thread_threshold_step()),
75 cg1r()->green_zone());
76 }
77
78 void ConcurrentG1RefineThread::wait_for_completed_buffers() {
79 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
80 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
81 while (!should_terminate() && !is_active()) {
82 _monitor->wait(Mutex::_no_safepoint_check_flag);
83 }
84 }
85
86 bool ConcurrentG1RefineThread::is_active() {
87 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
88 return is_primary() ? dcqs.process_completed_buffers() : _active;
89 }
90
91 void ConcurrentG1RefineThread::activate() {
92 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
93 if (!is_primary()) {
94 set_active(true);
95 } else {
96 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
97 dcqs.set_process_completed(true);
98 }
99 _monitor->notify();
100 }
101
102 void ConcurrentG1RefineThread::deactivate() {
103 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
104 if (!is_primary()) {
105 set_active(false);
106 } else {
107 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
108 dcqs.set_process_completed(false);
109 }
110 }
111
112 void ConcurrentG1RefineThread::run_service() {
113 _vtime_start = os::elapsedVTime();
114
115 while (!should_terminate()) {
116 // Wait for work
117 wait_for_completed_buffers();
118 if (should_terminate()) {
119 break;
120 }
121
122 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
123 log_debug(gc, refine)("Activated %d, on threshold: " SIZE_FORMAT ", current: " SIZE_FORMAT,
124 _worker_id, _threshold, dcqs.completed_buffers_num());
125
126 {
127 SuspendibleThreadSetJoiner sts_join;
128
129 do {
130 size_t curr_buffer_num = dcqs.completed_buffers_num();
131 // If the number of the buffers falls down into the yellow zone,
132 // that means that the transition period after the evacuation pause has ended.
133 if (dcqs.completed_queue_padding() > 0 && curr_buffer_num <= cg1r()->yellow_zone()) {
134 dcqs.set_completed_queue_padding(0);
135 }
136
137 // Check if we need to activate the next thread.
138 if (_next != NULL && !_next->is_active() && curr_buffer_num > _next->_threshold) {
140 }
141 } while (dcqs.apply_closure_to_completed_buffer(_refine_closure,
142 _worker_id + _worker_id_offset,
143 _deactivation_threshold,
144 false /* during_pause */));
145
146 deactivate();
147 log_debug(gc, refine)("Deactivated %d, off threshold: " SIZE_FORMAT ", current: " SIZE_FORMAT,
148 _worker_id, _deactivation_threshold,
149 dcqs.completed_buffers_num());
150 }
151
152 if (os::supports_vtime()) {
153 _vtime_accum = (os::elapsedVTime() - _vtime_start);
154 } else {
155 _vtime_accum = 0.0;
156 }
157 }
158
159 log_debug(gc, refine)("Stopping %d", _worker_id);
160 }
161
162 void ConcurrentG1RefineThread::stop_service() {
163 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
164 _monitor->notify();
165 }
|