Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp @ 2365:a181f3a124dd
6987703: iCMS: Intermittent hang with gc/gctests/CallGC/CallGC01 and +ExplicitGCInvokesConcurrent
Summary: Count enable_icms() and disable_icms() events so as to prevent inteference between concurrent calls, which can cause the iCMS thread to be left stranded in icms_wait() with an unserviced request and no young allocations to unwedge it.
Reviewed-by: jcoomes, poonam
author | ysr |
---|---|
date | Mon, 14 Mar 2011 21:52:24 -0700 |
parents | f95d63e2154a |
children | de268c8a8075 |
comparison
equal
deleted
inserted
replaced
2364:04d1138b4cce | 2365:a181f3a124dd |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
49 int ConcurrentMarkSweepThread::_CMS_flag = CMS_nil; | 49 int ConcurrentMarkSweepThread::_CMS_flag = CMS_nil; |
50 | 50 |
51 volatile jint ConcurrentMarkSweepThread::_pending_yields = 0; | 51 volatile jint ConcurrentMarkSweepThread::_pending_yields = 0; |
52 volatile jint ConcurrentMarkSweepThread::_pending_decrements = 0; | 52 volatile jint ConcurrentMarkSweepThread::_pending_decrements = 0; |
53 | 53 |
54 volatile bool ConcurrentMarkSweepThread::_icms_enabled = false; | 54 volatile jint ConcurrentMarkSweepThread::_icms_disabled = 0; |
55 volatile bool ConcurrentMarkSweepThread::_should_run = false; | 55 volatile bool ConcurrentMarkSweepThread::_should_run = false; |
56 // When icms is enabled, the icms thread is stopped until explicitly | 56 // When icms is enabled, the icms thread is stopped until explicitly |
57 // started. | 57 // started. |
58 volatile bool ConcurrentMarkSweepThread::_should_stop = true; | 58 volatile bool ConcurrentMarkSweepThread::_should_stop = true; |
59 | 59 |
82 if (!DisableStartThread) { | 82 if (!DisableStartThread) { |
83 os::start_thread(this); | 83 os::start_thread(this); |
84 } | 84 } |
85 } | 85 } |
86 _sltMonitor = SLT_lock; | 86 _sltMonitor = SLT_lock; |
87 set_icms_enabled(CMSIncrementalMode); | 87 assert(!CMSIncrementalMode || icms_is_enabled(), "Error"); |
88 } | 88 } |
89 | 89 |
90 void ConcurrentMarkSweepThread::run() { | 90 void ConcurrentMarkSweepThread::run() { |
91 assert(this == cmst(), "just checking"); | 91 assert(this == cmst(), "just checking"); |
92 | 92 |
339 } | 339 } |
340 } | 340 } |
341 | 341 |
342 void ConcurrentMarkSweepThread::icms_wait() { | 342 void ConcurrentMarkSweepThread::icms_wait() { |
343 assert(UseConcMarkSweepGC && CMSIncrementalMode, "just checking"); | 343 assert(UseConcMarkSweepGC && CMSIncrementalMode, "just checking"); |
344 if (_should_stop && icms_enabled()) { | 344 if (_should_stop && icms_is_enabled()) { |
345 MutexLockerEx x(iCMS_lock, Mutex::_no_safepoint_check_flag); | 345 MutexLockerEx x(iCMS_lock, Mutex::_no_safepoint_check_flag); |
346 trace_state("pause_icms"); | 346 trace_state("pause_icms"); |
347 _collector->stats().stop_cms_timer(); | 347 _collector->stats().stop_cms_timer(); |
348 while(!_should_run && icms_enabled()) { | 348 while(!_should_run && icms_is_enabled()) { |
349 iCMS_lock->wait(Mutex::_no_safepoint_check_flag); | 349 iCMS_lock->wait(Mutex::_no_safepoint_check_flag); |
350 } | 350 } |
351 _collector->stats().start_cms_timer(); | 351 _collector->stats().start_cms_timer(); |
352 _should_stop = false; | 352 _should_stop = false; |
353 trace_state("pause_icms end"); | 353 trace_state("pause_icms end"); |