src/share/vm/runtime/mutexLocker.hpp

Wed, 25 Jan 2012 12:58:23 -0500

author
tonyp
date
Wed, 25 Jan 2012 12:58:23 -0500
changeset 3464
eff609af17d7
parent 3156
f08d439fab8c
child 3467
0a10d80352d5
permissions
-rw-r--r--

7127706: G1: re-enable survivors during the initial-mark pause
Summary: Re-enable survivors during the initial-mark pause. Afterwards, the concurrent marking threads have to scan them and mark everything reachable from them. The next GC will have to wait for the survivors to be scanned.
Reviewed-by: brutisso, johnc

duke@435 1 /*
tonyp@3464 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_RUNTIME_MUTEXLOCKER_HPP
stefank@2314 26 #define SHARE_VM_RUNTIME_MUTEXLOCKER_HPP
stefank@2314 27
stefank@2314 28 #include "memory/allocation.hpp"
stefank@2314 29 #include "runtime/mutex.hpp"
stefank@2314 30 #ifdef TARGET_OS_FAMILY_linux
stefank@2314 31 # include "os_linux.inline.hpp"
stefank@2314 32 #endif
stefank@2314 33 #ifdef TARGET_OS_FAMILY_solaris
stefank@2314 34 # include "os_solaris.inline.hpp"
stefank@2314 35 #endif
stefank@2314 36 #ifdef TARGET_OS_FAMILY_windows
stefank@2314 37 # include "os_windows.inline.hpp"
stefank@2314 38 #endif
never@3156 39 #ifdef TARGET_OS_FAMILY_bsd
never@3156 40 # include "os_bsd.inline.hpp"
never@3156 41 #endif
stefank@2314 42
duke@435 43 // Mutexes used in the VM.
duke@435 44
duke@435 45 extern Mutex* Patching_lock; // a lock used to guard code patching of compiled code
duke@435 46 extern Monitor* SystemDictionary_lock; // a lock on the system dictonary
duke@435 47 extern Mutex* PackageTable_lock; // a lock on the class loader package table
duke@435 48 extern Mutex* CompiledIC_lock; // a lock used to guard compiled IC patching and access
duke@435 49 extern Mutex* InlineCacheBuffer_lock; // a lock used to guard the InlineCacheBuffer
duke@435 50 extern Mutex* VMStatistic_lock; // a lock used to guard statistics count increment
duke@435 51 extern Mutex* JNIGlobalHandle_lock; // a lock on creating JNI global handles
duke@435 52 extern Mutex* JNIHandleBlockFreeList_lock; // a lock on the JNI handle block free list
duke@435 53 extern Mutex* JNICachedItableIndex_lock; // a lock on caching an itable index during JNI invoke
duke@435 54 extern Mutex* JmethodIdCreation_lock; // a lock on creating JNI method identifiers
duke@435 55 extern Mutex* JfieldIdCreation_lock; // a lock on creating JNI static field identifiers
duke@435 56 extern Monitor* JNICritical_lock; // a lock used while entering and exiting JNI critical regions, allows GC to sometimes get in
duke@435 57 extern Mutex* JvmtiThreadState_lock; // a lock on modification of JVMTI thread data
duke@435 58 extern Monitor* JvmtiPendingEvent_lock; // a lock on the JVMTI pending events list
ysr@777 59 extern Monitor* Heap_lock; // a lock on the heap
duke@435 60 extern Mutex* ExpandHeap_lock; // a lock on expanding the heap
duke@435 61 extern Mutex* AdapterHandlerLibrary_lock; // a lock on the AdapterHandlerLibrary
duke@435 62 extern Mutex* SignatureHandlerLibrary_lock; // a lock on the SignatureHandlerLibrary
duke@435 63 extern Mutex* VtableStubs_lock; // a lock on the VtableStubs
duke@435 64 extern Mutex* SymbolTable_lock; // a lock on the symbol table
duke@435 65 extern Mutex* StringTable_lock; // a lock on the interned string table
duke@435 66 extern Mutex* CodeCache_lock; // a lock on the CodeCache, rank is special, use MutexLockerEx
duke@435 67 extern Mutex* MethodData_lock; // a lock on installation of method data
duke@435 68 extern Mutex* RetData_lock; // a lock on installation of RetData inside method data
duke@435 69 extern Mutex* DerivedPointerTableGC_lock; // a lock to protect the derived pointer table
duke@435 70 extern Monitor* VMOperationQueue_lock; // a lock on queue of vm_operations waiting to execute
duke@435 71 extern Monitor* VMOperationRequest_lock; // a lock on Threads waiting for a vm_operation to terminate
duke@435 72 extern Monitor* Safepoint_lock; // a lock used by the safepoint abstraction
duke@435 73 extern Monitor* Threads_lock; // a lock on the Threads table of active Java threads
duke@435 74 // (also used by Safepoints too to block threads creation/destruction)
duke@435 75 extern Monitor* CGC_lock; // used for coordination between
duke@435 76 // fore- & background GC threads.
duke@435 77 extern Mutex* STS_init_lock; // coordinate initialization of SuspendibleThreadSets.
duke@435 78 extern Monitor* SLT_lock; // used in CMS GC for acquiring PLL
duke@435 79 extern Monitor* iCMS_lock; // CMS incremental mode start/stop notification
duke@435 80 extern Monitor* FullGCCount_lock; // in support of "concurrent" full gc
ysr@777 81 extern Monitor* CMark_lock; // used for concurrent mark thread coordination
tonyp@1793 82 extern Mutex* CMRegionStack_lock; // used for protecting accesses to the CM region stack
ysr@777 83 extern Mutex* SATB_Q_FL_lock; // Protects SATB Q
ysr@777 84 // buffer free list.
ysr@777 85 extern Monitor* SATB_Q_CBL_mon; // Protects SATB Q
ysr@777 86 // completed buffer queue.
ysr@777 87 extern Mutex* Shared_SATB_Q_lock; // Lock protecting SATB
ysr@777 88 // queue shared by
ysr@777 89 // non-Java threads.
ysr@777 90
ysr@777 91 extern Mutex* DirtyCardQ_FL_lock; // Protects dirty card Q
ysr@777 92 // buffer free list.
ysr@777 93 extern Monitor* DirtyCardQ_CBL_mon; // Protects dirty card Q
ysr@777 94 // completed buffer queue.
ysr@777 95 extern Mutex* Shared_DirtyCardQ_lock; // Lock protecting dirty card
ysr@777 96 // queue shared by
ysr@777 97 // non-Java threads.
duke@435 98 // (see option ExplicitGCInvokesConcurrent)
duke@435 99 extern Mutex* ParGCRareEvent_lock; // Synchronizes various (rare) parallel GC ops.
ysr@777 100 extern Mutex* EvacFailureStack_lock; // guards the evac failure scan stack
duke@435 101 extern Mutex* Compile_lock; // a lock held when Compilation is updating code (used to block CodeCache traversal, CHA updates, etc)
duke@435 102 extern Monitor* MethodCompileQueue_lock; // a lock held when method compilations are enqueued, dequeued
duke@435 103 extern Monitor* CompileThread_lock; // a lock held by compile threads during compilation system initialization
duke@435 104 extern Mutex* CompileTaskAlloc_lock; // a lock held when CompileTasks are allocated
duke@435 105 extern Mutex* CompileStatistics_lock; // a lock held when updating compilation statistics
duke@435 106 extern Mutex* MultiArray_lock; // a lock used to guard allocation of multi-dim arrays
duke@435 107 extern Monitor* Terminator_lock; // a lock used to guard termination of the vm
duke@435 108 extern Monitor* BeforeExit_lock; // a lock used to guard cleanups and shutdown hooks
duke@435 109 extern Monitor* Notify_lock; // a lock used to synchronize the start-up of the vm
duke@435 110 extern Monitor* Interrupt_lock; // a lock used for condition variable mediated interrupt processing
duke@435 111 extern Monitor* ProfileVM_lock; // a lock used for profiling the VMThread
duke@435 112 extern Mutex* ProfilePrint_lock; // a lock used to serialize the printing of profiles
duke@435 113 extern Mutex* ExceptionCache_lock; // a lock used to synchronize exception cache updates
duke@435 114 extern Mutex* OsrList_lock; // a lock used to serialize access to OSR queues
duke@435 115
duke@435 116 #ifndef PRODUCT
duke@435 117 extern Mutex* FullGCALot_lock; // a lock to make FullGCALot MT safe
tonyp@3464 118 #endif // PRODUCT
duke@435 119 extern Mutex* Debug1_lock; // A bunch of pre-allocated locks that can be used for tracing
duke@435 120 extern Mutex* Debug2_lock; // down synchronization related bugs!
duke@435 121 extern Mutex* Debug3_lock;
duke@435 122
duke@435 123 extern Mutex* RawMonitor_lock;
duke@435 124 extern Mutex* PerfDataMemAlloc_lock; // a lock on the allocator for PerfData memory for performance data
duke@435 125 extern Mutex* PerfDataManager_lock; // a long on access to PerfDataManager resources
duke@435 126 extern Mutex* ParkerFreeList_lock;
duke@435 127 extern Mutex* OopMapCacheAlloc_lock; // protects allocation of oop_map caches
duke@435 128
tonyp@2472 129 extern Mutex* FreeList_lock; // protects the free region list during safepoints
tonyp@2472 130 extern Monitor* SecondaryFreeList_lock; // protects the secondary free region list
tonyp@2472 131 extern Mutex* OldSets_lock; // protects the old region sets
tonyp@3464 132 extern Monitor* RootRegionScan_lock; // used to notify that the CM threads have finished scanning the IM snapshot regions
ysr@777 133 extern Mutex* MMUTracker_lock; // protects the MMU
ysr@777 134 // tracker data structures
ysr@777 135 extern Mutex* HotCardCache_lock; // protects the hot card cache
ysr@777 136
duke@435 137 extern Mutex* Management_lock; // a lock used to serialize JVM management
kamg@2511 138 extern Monitor* Service_lock; // a lock used for service thread operation
duke@435 139
duke@435 140 // A MutexLocker provides mutual exclusion with respect to a given mutex
duke@435 141 // for the scope which contains the locker. The lock is an OS lock, not
duke@435 142 // an object lock, and the two do not interoperate. Do not use Mutex-based
duke@435 143 // locks to lock on Java objects, because they will not be respected if a
duke@435 144 // that object is locked using the Java locking mechanism.
duke@435 145 //
duke@435 146 // NOTE WELL!!
duke@435 147 //
duke@435 148 // See orderAccess.hpp. We assume throughout the VM that MutexLocker's
duke@435 149 // and friends constructors do a fence, a lock and an acquire *in that
duke@435 150 // order*. And that their destructors do a release and unlock, in *that*
duke@435 151 // order. If their implementations change such that these assumptions
duke@435 152 // are violated, a whole lot of code will break.
duke@435 153
duke@435 154 // Print all mutexes/monitors that are currently owned by a thread; called
duke@435 155 // by fatal error handler.
duke@435 156 void print_owned_locks_on_error(outputStream* st);
duke@435 157
duke@435 158 char *lock_name(Mutex *mutex);
duke@435 159
duke@435 160 class MutexLocker: StackObj {
duke@435 161 private:
duke@435 162 Monitor * _mutex;
duke@435 163 public:
duke@435 164 MutexLocker(Monitor * mutex) {
duke@435 165 assert(mutex->rank() != Mutex::special,
duke@435 166 "Special ranked mutex should only use MutexLockerEx");
duke@435 167 _mutex = mutex;
duke@435 168 _mutex->lock();
duke@435 169 }
duke@435 170
duke@435 171 // Overloaded constructor passing current thread
duke@435 172 MutexLocker(Monitor * mutex, Thread *thread) {
duke@435 173 assert(mutex->rank() != Mutex::special,
duke@435 174 "Special ranked mutex should only use MutexLockerEx");
duke@435 175 _mutex = mutex;
duke@435 176 _mutex->lock(thread);
duke@435 177 }
duke@435 178
duke@435 179 ~MutexLocker() {
duke@435 180 _mutex->unlock();
duke@435 181 }
duke@435 182
duke@435 183 };
duke@435 184
duke@435 185 // for debugging: check that we're already owning this lock (or are at a safepoint)
duke@435 186 #ifdef ASSERT
duke@435 187 void assert_locked_or_safepoint(const Monitor * lock);
duke@435 188 void assert_lock_strong(const Monitor * lock);
duke@435 189 #else
duke@435 190 #define assert_locked_or_safepoint(lock)
duke@435 191 #define assert_lock_strong(lock)
duke@435 192 #endif
duke@435 193
duke@435 194 // A MutexLockerEx behaves like a MutexLocker when its constructor is
duke@435 195 // called with a Mutex. Unlike a MutexLocker, its constructor can also be
duke@435 196 // called with NULL, in which case the MutexLockerEx is a no-op. There
duke@435 197 // is also a corresponding MutexUnlockerEx. We want to keep the
duke@435 198 // basic MutexLocker as fast as possible. MutexLockerEx can also lock
duke@435 199 // without safepoint check.
duke@435 200
duke@435 201 class MutexLockerEx: public StackObj {
duke@435 202 private:
duke@435 203 Monitor * _mutex;
duke@435 204 public:
duke@435 205 MutexLockerEx(Monitor * mutex, bool no_safepoint_check = !Mutex::_no_safepoint_check_flag) {
duke@435 206 _mutex = mutex;
duke@435 207 if (_mutex != NULL) {
duke@435 208 assert(mutex->rank() > Mutex::special || no_safepoint_check,
duke@435 209 "Mutexes with rank special or lower should not do safepoint checks");
duke@435 210 if (no_safepoint_check)
duke@435 211 _mutex->lock_without_safepoint_check();
duke@435 212 else
duke@435 213 _mutex->lock();
duke@435 214 }
duke@435 215 }
duke@435 216
duke@435 217 ~MutexLockerEx() {
duke@435 218 if (_mutex != NULL) {
duke@435 219 _mutex->unlock();
duke@435 220 }
duke@435 221 }
duke@435 222 };
duke@435 223
duke@435 224 // A MonitorLockerEx is like a MutexLockerEx above, except it takes
duke@435 225 // a possibly null Monitor, and allows wait/notify as well which are
duke@435 226 // delegated to the underlying Monitor.
duke@435 227
duke@435 228 class MonitorLockerEx: public MutexLockerEx {
duke@435 229 private:
duke@435 230 Monitor * _monitor;
duke@435 231 public:
duke@435 232 MonitorLockerEx(Monitor* monitor,
duke@435 233 bool no_safepoint_check = !Mutex::_no_safepoint_check_flag):
duke@435 234 MutexLockerEx(monitor, no_safepoint_check),
duke@435 235 _monitor(monitor) {
duke@435 236 // Superclass constructor did locking
duke@435 237 }
duke@435 238
duke@435 239 ~MonitorLockerEx() {
duke@435 240 #ifdef ASSERT
duke@435 241 if (_monitor != NULL) {
duke@435 242 assert_lock_strong(_monitor);
duke@435 243 }
duke@435 244 #endif // ASSERT
duke@435 245 // Superclass destructor will do unlocking
duke@435 246 }
duke@435 247
duke@435 248 bool wait(bool no_safepoint_check = !Mutex::_no_safepoint_check_flag,
duke@435 249 long timeout = 0,
duke@435 250 bool as_suspend_equivalent = !Mutex::_as_suspend_equivalent_flag) {
duke@435 251 if (_monitor != NULL) {
duke@435 252 return _monitor->wait(no_safepoint_check, timeout, as_suspend_equivalent);
duke@435 253 }
duke@435 254 return false;
duke@435 255 }
duke@435 256
duke@435 257 bool notify_all() {
duke@435 258 if (_monitor != NULL) {
duke@435 259 return _monitor->notify_all();
duke@435 260 }
duke@435 261 return true;
duke@435 262 }
duke@435 263
duke@435 264 bool notify() {
duke@435 265 if (_monitor != NULL) {
duke@435 266 return _monitor->notify();
duke@435 267 }
duke@435 268 return true;
duke@435 269 }
duke@435 270 };
duke@435 271
duke@435 272
duke@435 273
duke@435 274 // A GCMutexLocker is usually initialized with a mutex that is
duke@435 275 // automatically acquired in order to do GC. The function that
duke@435 276 // synchronizes using a GCMutexLocker may be called both during and between
duke@435 277 // GC's. Thus, it must acquire the mutex if GC is not in progress, but not
duke@435 278 // if GC is in progress (since the mutex is already held on its behalf.)
duke@435 279
duke@435 280 class GCMutexLocker: public StackObj {
duke@435 281 private:
duke@435 282 Monitor * _mutex;
duke@435 283 bool _locked;
duke@435 284 public:
duke@435 285 GCMutexLocker(Monitor * mutex);
duke@435 286 ~GCMutexLocker() { if (_locked) _mutex->unlock(); }
duke@435 287 };
duke@435 288
duke@435 289
duke@435 290
duke@435 291 // A MutexUnlocker temporarily exits a previously
duke@435 292 // entered mutex for the scope which contains the unlocker.
duke@435 293
duke@435 294 class MutexUnlocker: StackObj {
duke@435 295 private:
duke@435 296 Monitor * _mutex;
duke@435 297
duke@435 298 public:
duke@435 299 MutexUnlocker(Monitor * mutex) {
duke@435 300 _mutex = mutex;
duke@435 301 _mutex->unlock();
duke@435 302 }
duke@435 303
duke@435 304 ~MutexUnlocker() {
duke@435 305 _mutex->lock();
duke@435 306 }
duke@435 307 };
duke@435 308
duke@435 309 // A MutexUnlockerEx temporarily exits a previously
duke@435 310 // entered mutex for the scope which contains the unlocker.
duke@435 311
duke@435 312 class MutexUnlockerEx: StackObj {
duke@435 313 private:
duke@435 314 Monitor * _mutex;
duke@435 315 bool _no_safepoint_check;
duke@435 316
duke@435 317 public:
duke@435 318 MutexUnlockerEx(Monitor * mutex, bool no_safepoint_check = !Mutex::_no_safepoint_check_flag) {
duke@435 319 _mutex = mutex;
duke@435 320 _no_safepoint_check = no_safepoint_check;
duke@435 321 _mutex->unlock();
duke@435 322 }
duke@435 323
duke@435 324 ~MutexUnlockerEx() {
duke@435 325 if (_no_safepoint_check == Mutex::_no_safepoint_check_flag) {
duke@435 326 _mutex->lock_without_safepoint_check();
duke@435 327 } else {
duke@435 328 _mutex->lock();
duke@435 329 }
duke@435 330 }
duke@435 331 };
duke@435 332
duke@435 333 #ifndef PRODUCT
duke@435 334 //
duke@435 335 // A special MutexLocker that allows:
duke@435 336 // - reentrant locking
duke@435 337 // - locking out of order
duke@435 338 //
duke@435 339 // Only too be used for verify code, where we can relaxe out dead-lock
duke@435 340 // dection code a bit (unsafe, but probably ok). This code is NEVER to
duke@435 341 // be included in a product version.
duke@435 342 //
duke@435 343 class VerifyMutexLocker: StackObj {
duke@435 344 private:
duke@435 345 Monitor * _mutex;
duke@435 346 bool _reentrant;
duke@435 347 public:
duke@435 348 VerifyMutexLocker(Monitor * mutex) {
duke@435 349 _mutex = mutex;
duke@435 350 _reentrant = mutex->owned_by_self();
duke@435 351 if (!_reentrant) {
duke@435 352 // We temp. diable strict safepoint checking, while we require the lock
duke@435 353 FlagSetting fs(StrictSafepointChecks, false);
duke@435 354 _mutex->lock();
duke@435 355 }
duke@435 356 }
duke@435 357
duke@435 358 ~VerifyMutexLocker() {
duke@435 359 if (!_reentrant) {
duke@435 360 _mutex->unlock();
duke@435 361 }
duke@435 362 }
duke@435 363 };
duke@435 364
duke@435 365 #endif
stefank@2314 366
stefank@2314 367 #endif // SHARE_VM_RUNTIME_MUTEXLOCKER_HPP

mercurial