87 Thread *current_thread = Thread::current(); |
87 Thread *current_thread = Thread::current(); |
88 |
88 |
89 while (!_should_terminate) { |
89 while (!_should_terminate) { |
90 // wait until started is set. |
90 // wait until started is set. |
91 sleepBeforeNextCycle(); |
91 sleepBeforeNextCycle(); |
|
92 if (_should_terminate) { |
|
93 break; |
|
94 } |
|
95 |
92 { |
96 { |
93 ResourceMark rm; |
97 ResourceMark rm; |
94 HandleMark hm; |
98 HandleMark hm; |
95 double cycle_start = os::elapsedVTime(); |
99 double cycle_start = os::elapsedVTime(); |
96 |
100 |
301 void ConcurrentMarkThread::yield() { |
305 void ConcurrentMarkThread::yield() { |
302 _sts.yield("Concurrent Mark"); |
306 _sts.yield("Concurrent Mark"); |
303 } |
307 } |
304 |
308 |
305 void ConcurrentMarkThread::stop() { |
309 void ConcurrentMarkThread::stop() { |
306 // it is ok to take late safepoints here, if needed |
310 { |
307 MutexLockerEx mu(Terminator_lock); |
311 MutexLockerEx ml(Terminator_lock); |
308 _should_terminate = true; |
312 _should_terminate = true; |
309 while (!_has_terminated) { |
313 } |
310 Terminator_lock->wait(); |
314 |
|
315 { |
|
316 MutexLockerEx ml(CGC_lock, Mutex::_no_safepoint_check_flag); |
|
317 CGC_lock->notify_all(); |
|
318 } |
|
319 |
|
320 { |
|
321 MutexLockerEx ml(Terminator_lock); |
|
322 while (!_has_terminated) { |
|
323 Terminator_lock->wait(); |
|
324 } |
311 } |
325 } |
312 } |
326 } |
313 |
327 |
314 void ConcurrentMarkThread::print() const { |
328 void ConcurrentMarkThread::print() const { |
315 print_on(tty); |
329 print_on(tty); |
325 // We join here because we don't want to do the "shouldConcurrentMark()" |
339 // We join here because we don't want to do the "shouldConcurrentMark()" |
326 // below while the world is otherwise stopped. |
340 // below while the world is otherwise stopped. |
327 assert(!in_progress(), "should have been cleared"); |
341 assert(!in_progress(), "should have been cleared"); |
328 |
342 |
329 MutexLockerEx x(CGC_lock, Mutex::_no_safepoint_check_flag); |
343 MutexLockerEx x(CGC_lock, Mutex::_no_safepoint_check_flag); |
330 while (!started()) { |
344 while (!started() && !_should_terminate) { |
331 CGC_lock->wait(Mutex::_no_safepoint_check_flag); |
345 CGC_lock->wait(Mutex::_no_safepoint_check_flag); |
332 } |
346 } |
333 set_in_progress(); |
347 |
334 clear_started(); |
348 if (started()) { |
|
349 set_in_progress(); |
|
350 clear_started(); |
|
351 } |
335 } |
352 } |
336 |
353 |
337 // Note: As is the case with CMS - this method, although exported |
354 // Note: As is the case with CMS - this method, although exported |
338 // by the ConcurrentMarkThread, which is a non-JavaThread, can only |
355 // by the ConcurrentMarkThread, which is a non-JavaThread, can only |
339 // be called by a JavaThread. Currently this is done at vm creation |
356 // be called by a JavaThread. Currently this is done at vm creation |