src/share/vm/runtime/mutexLocker.hpp

Wed, 19 Jan 2011 19:30:42 -0500

author
tonyp
date
Wed, 19 Jan 2011 19:30:42 -0500
changeset 2472
0fa27f37d4d4
parent 2314
f95d63e2154a
child 2511
bf8517f4e4d0
permissions
-rw-r--r--

6977804: G1: remove the zero-filling thread
Summary: This changeset removes the zero-filling thread from G1 and collapses the two free region lists we had before (the "free" and "unclean" lists) into one. The new free list uses the new heap region sets / lists abstractions that we'll ultimately use it to keep track of all regions in the heap. A heap region set was also introduced for the humongous regions. Finally, this change increases the concurrency between the thread that completes freeing regions (after a cleanup pause) and the rest of the system (before we'd have to wait for said thread to complete before allocating a new region). The changest also includes a lot of refactoring and code simplification.
Reviewed-by: jcoomes, johnc

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

mercurial