31 32 // Mutexes used in the VM (see comment in mutexLocker.hpp): 33 // 34 // Note that the following pointers are effectively final -- after having been 35 // set at JVM startup-time, they should never be subsequently mutated. 36 // Instead of using pointers to malloc()ed monitors and mutexes we should consider 37 // eliminating the indirection and using instances instead. 38 // Consider using GCC's __read_mostly. 39 40 Mutex* Patching_lock = NULL; 41 Monitor* SystemDictionary_lock = NULL; 42 Mutex* Module_lock = NULL; 43 Mutex* CompiledIC_lock = NULL; 44 Mutex* InlineCacheBuffer_lock = NULL; 45 Mutex* VMStatistic_lock = NULL; 46 Mutex* JNIGlobalAlloc_lock = NULL; 47 Mutex* JNIGlobalActive_lock = NULL; 48 Mutex* JNIWeakAlloc_lock = NULL; 49 Mutex* JNIWeakActive_lock = NULL; 50 Mutex* JNIHandleBlockFreeList_lock = NULL; 51 Mutex* ResolvedMethodTable_lock = NULL; 52 Mutex* JmethodIdCreation_lock = NULL; 53 Mutex* JfieldIdCreation_lock = NULL; 54 Monitor* JNICritical_lock = NULL; 55 Mutex* JvmtiThreadState_lock = NULL; 56 Monitor* Heap_lock = NULL; 57 Mutex* ExpandHeap_lock = NULL; 58 Mutex* AdapterHandlerLibrary_lock = NULL; 59 Mutex* SignatureHandlerLibrary_lock = NULL; 60 Mutex* VtableStubs_lock = NULL; 61 Mutex* SymbolTable_lock = NULL; 62 Mutex* StringTable_lock = NULL; 63 Monitor* StringDedupQueue_lock = NULL; 64 Mutex* StringDedupTable_lock = NULL; 65 Monitor* CodeCache_lock = NULL; 66 Mutex* MethodData_lock = NULL; 67 Mutex* TouchedMethodLog_lock = NULL; 68 Mutex* RetData_lock = NULL; 69 Monitor* VMOperationQueue_lock = NULL; 70 Monitor* VMOperationRequest_lock = NULL; 244 245 def(Safepoint_lock , PaddedMonitor, safepoint, true, Monitor::_safepoint_check_sometimes); // locks SnippetCache_lock/Threads_lock 246 247 def(Threads_lock , PaddedMonitor, barrier, true, Monitor::_safepoint_check_sometimes); 248 249 def(VMOperationQueue_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes); // VM_thread allowed to block on these 250 def(VMOperationRequest_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes); 251 def(RetData_lock , PaddedMutex , nonleaf, false, Monitor::_safepoint_check_always); 252 def(Terminator_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes); 253 def(VtableStubs_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_always); 254 def(Notify_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_always); 255 // OopStorage-based JNI may lock the alloc_locks while releasing a handle, 256 // while previous JNI didn't need a lock for handle release. This runs afoul 257 // of some places which hold other locks while releasing a handle, including 258 // the Patching_lock, which is of "special" rank. As a temporary workaround, 259 // lower the JNI oopstorage lock ranks to make them super-special. 260 def(JNIGlobalAlloc_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never); 261 def(JNIGlobalActive_lock , PaddedMutex , nonleaf-1, true, Monitor::_safepoint_check_never); 262 def(JNIWeakAlloc_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never); 263 def(JNIWeakActive_lock , PaddedMutex , nonleaf-1, true, Monitor::_safepoint_check_never); 264 def(JNICritical_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_always); // used for JNI critical regions 265 def(AdapterHandlerLibrary_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_always); 266 267 def(Heap_lock , PaddedMonitor, nonleaf+1, false, Monitor::_safepoint_check_sometimes); 268 def(JfieldIdCreation_lock , PaddedMutex , nonleaf+1, true, Monitor::_safepoint_check_always); // jfieldID, Used in VM_Operation 269 def(ResolvedMethodTable_lock , PaddedMutex , nonleaf+1, false, Monitor::_safepoint_check_always); // Used to protect ResolvedMethodTable 270 271 def(CompiledIC_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks VtableStubs_lock, InlineCacheBuffer_lock 272 def(CompileTaskAlloc_lock , PaddedMutex , nonleaf+2, true, Monitor::_safepoint_check_always); 273 def(CompileStatistics_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); 274 def(DirectivesStack_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never); 275 def(MultiArray_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks SymbolTable_lock 276 277 def(JvmtiThreadState_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // Used by JvmtiThreadState/JvmtiEventController 278 def(Management_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // used for JVM management 279 280 def(Compile_lock , PaddedMutex , nonleaf+3, true, Monitor::_safepoint_check_sometimes); 281 def(MethodData_lock , PaddedMutex , nonleaf+3, false, Monitor::_safepoint_check_always); 282 def(TouchedMethodLog_lock , PaddedMutex , nonleaf+3, false, Monitor::_safepoint_check_always); 283 | 31 32 // Mutexes used in the VM (see comment in mutexLocker.hpp): 33 // 34 // Note that the following pointers are effectively final -- after having been 35 // set at JVM startup-time, they should never be subsequently mutated. 36 // Instead of using pointers to malloc()ed monitors and mutexes we should consider 37 // eliminating the indirection and using instances instead. 38 // Consider using GCC's __read_mostly. 39 40 Mutex* Patching_lock = NULL; 41 Monitor* SystemDictionary_lock = NULL; 42 Mutex* Module_lock = NULL; 43 Mutex* CompiledIC_lock = NULL; 44 Mutex* InlineCacheBuffer_lock = NULL; 45 Mutex* VMStatistic_lock = NULL; 46 Mutex* JNIGlobalAlloc_lock = NULL; 47 Mutex* JNIGlobalActive_lock = NULL; 48 Mutex* JNIWeakAlloc_lock = NULL; 49 Mutex* JNIWeakActive_lock = NULL; 50 Mutex* JNIHandleBlockFreeList_lock = NULL; 51 Mutex* VMWeakAlloc_lock = NULL; 52 Mutex* VMWeakActive_lock = NULL; 53 Mutex* ResolvedMethodTable_lock = NULL; 54 Mutex* JmethodIdCreation_lock = NULL; 55 Mutex* JfieldIdCreation_lock = NULL; 56 Monitor* JNICritical_lock = NULL; 57 Mutex* JvmtiThreadState_lock = NULL; 58 Monitor* Heap_lock = NULL; 59 Mutex* ExpandHeap_lock = NULL; 60 Mutex* AdapterHandlerLibrary_lock = NULL; 61 Mutex* SignatureHandlerLibrary_lock = NULL; 62 Mutex* VtableStubs_lock = NULL; 63 Mutex* SymbolTable_lock = NULL; 64 Mutex* StringTable_lock = NULL; 65 Monitor* StringDedupQueue_lock = NULL; 66 Mutex* StringDedupTable_lock = NULL; 67 Monitor* CodeCache_lock = NULL; 68 Mutex* MethodData_lock = NULL; 69 Mutex* TouchedMethodLog_lock = NULL; 70 Mutex* RetData_lock = NULL; 71 Monitor* VMOperationQueue_lock = NULL; 72 Monitor* VMOperationRequest_lock = NULL; 246 247 def(Safepoint_lock , PaddedMonitor, safepoint, true, Monitor::_safepoint_check_sometimes); // locks SnippetCache_lock/Threads_lock 248 249 def(Threads_lock , PaddedMonitor, barrier, true, Monitor::_safepoint_check_sometimes); 250 251 def(VMOperationQueue_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes); // VM_thread allowed to block on these 252 def(VMOperationRequest_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes); 253 def(RetData_lock , PaddedMutex , nonleaf, false, Monitor::_safepoint_check_always); 254 def(Terminator_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes); 255 def(VtableStubs_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_always); 256 def(Notify_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_always); 257 // OopStorage-based JNI may lock the alloc_locks while releasing a handle, 258 // while previous JNI didn't need a lock for handle release. This runs afoul 259 // of some places which hold other locks while releasing a handle, including 260 // the Patching_lock, which is of "special" rank. As a temporary workaround, 261 // lower the JNI oopstorage lock ranks to make them super-special. 262 def(JNIGlobalAlloc_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never); 263 def(JNIGlobalActive_lock , PaddedMutex , nonleaf-1, true, Monitor::_safepoint_check_never); 264 def(JNIWeakAlloc_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never); 265 def(JNIWeakActive_lock , PaddedMutex , nonleaf-1, true, Monitor::_safepoint_check_never); 266 def(VMWeakAlloc_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never); 267 def(VMWeakActive_lock , PaddedMutex , nonleaf-1, true, Monitor::_safepoint_check_never); 268 def(JNICritical_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_always); // used for JNI critical regions 269 def(AdapterHandlerLibrary_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_always); 270 271 def(Heap_lock , PaddedMonitor, nonleaf+1, false, Monitor::_safepoint_check_sometimes); 272 def(JfieldIdCreation_lock , PaddedMutex , nonleaf+1, true, Monitor::_safepoint_check_always); // jfieldID, Used in VM_Operation 273 def(ResolvedMethodTable_lock , PaddedMutex , nonleaf+1, false, Monitor::_safepoint_check_always); // Used to protect ResolvedMethodTable 274 275 def(CompiledIC_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks VtableStubs_lock, InlineCacheBuffer_lock 276 def(CompileTaskAlloc_lock , PaddedMutex , nonleaf+2, true, Monitor::_safepoint_check_always); 277 def(CompileStatistics_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); 278 def(DirectivesStack_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never); 279 def(MultiArray_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks SymbolTable_lock 280 281 def(JvmtiThreadState_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // Used by JvmtiThreadState/JvmtiEventController 282 def(Management_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // used for JVM management 283 284 def(Compile_lock , PaddedMutex , nonleaf+3, true, Monitor::_safepoint_check_sometimes); 285 def(MethodData_lock , PaddedMutex , nonleaf+3, false, Monitor::_safepoint_check_always); 286 def(TouchedMethodLog_lock , PaddedMutex , nonleaf+3, false, Monitor::_safepoint_check_always); 287 |