concurrentMarkSweepThread.hpp revision 1807
1757N/A * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1472N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 0N/A// The Concurrent Mark Sweep GC Thread (could be several in the future). 0N/A // CMS thread should yield for a young gen collection, direct allocation, 0N/A // and iCMS activity. 0N/A static char _pad_1[
64 -
sizeof(
jint)];
// prevent cache-line sharing 0N/A static char _pad_2[
64 -
sizeof(
jint)];
// prevent cache-line sharing 0N/A // Tracing messages, enabled by CMSTraceThreadState. 0N/A // Returns the CMS Thread 0N/A // Create and start the CMS Thread, or stop it on shutdown 0N/A // Synchronization using CMS token 0N/A // Wait on CMS lock until the next synchronous GC 1807N/A // or given timeout, whichever is earlier. A timeout value 1807N/A // of 0 indicates that there is no upper bound on the wait time. 1807N/A // A concurrent full gc request terminates the wait. 1757N/A // The CMS thread will yield during the work portion of its cycle 0N/A // only when requested to. Both synchronous and asychronous requests 1757N/A // (1) A synchronous request is used for young gen collections and 1757N/A // for direct allocations. The requesting thread increments 1757N/A // _pending_yields at the beginning of an operation, and decrements 1757N/A // _pending_yields when that operation is completed. 1757N/A // In turn, the CMS thread yields when _pending_yields is positive, 1757N/A // and continues to yield until the value reverts to 0. 1757N/A // (2) An asynchronous request, on the other hand, is used by iCMS 1757N/A // for the stop_icms() operation. A single yield satisfies all of 1757N/A // the outstanding asynch yield requests, of which there may 1757N/A // occasionally be several in close succession. To accomplish 1757N/A // this, an asynch-requesting thread atomically increments both 1757N/A // _pending_yields and _pending_decrements. An asynchr requesting 1757N/A // thread does not wait and "acknowledge" completion of an operation 1757N/A // and deregister the request, like the synchronous version described 1757N/A // above does. In turn, after yielding, the CMS thread decrements both 1757N/A // _pending_yields and _pending_decrements by the value seen in 1757N/A // _pending_decrements before the decrement. 1757N/A // NOTE: The above scheme is isomorphic to having two request counters, 1757N/A // one for async requests and one for sync requests, and for the CMS thread 1757N/A // to check the sum of the two counters to decide whether it should yield 1757N/A // and to clear only the async counter when it yields. However, it turns out 1757N/A // to be more efficient for CMS code to just check a single counter 1757N/A // _pending_yields that holds the sum (of both sync and async requests), and 1757N/A // a second counter _pending_decrements that only holds the async requests, 1757N/A // for greater efficiency, since in a typical CMS run, there are many more 1757N/A // pontential (i.e. static) yield points than there are actual 1757N/A // (i.e. dynamic) yields because of requests, which are few and far between. 0N/A // Note that, while "_pending_yields >= _pending_decrements" is an invariant, 0N/A // we cannot easily test that invariant, since the counters are manipulated via 0N/A // atomic instructions without explicit locking and we cannot read 0N/A // the two counters atomically together: one suggestion is to 0N/A // use (for example) 16-bit counters so as to be able to read the 0N/A // two counters atomically even on 32-bit platforms. Notice that 1757N/A // the second assert in acknowledge_yield_request() below does indeed 0N/A // check a form of the above invariant, albeit indirectly. 0N/A // Order important to preserve: _pending_yields >= _pending_decrements 0N/A // CMS incremental mode. 0N/A static void start_icms();
// notify thread to start a quantum of work 0N/A void icms_wait();
// if asked to stop, wait until notified to start 0N/A // Incremental mode is enabled globally by the flag CMSIncrementalMode. It 0N/A// Used to emit a warning in case of unexpectedly excessive 0N/A// looping (in "apparently endless loops") in CMS code.