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");