167 var = new type(Mutex::pri, #var, vm_block, safepoint_check_allowed); \ |
167 var = new type(Mutex::pri, #var, vm_block, safepoint_check_allowed); \ |
168 assert(_num_mutex < MAX_NUM_MUTEX, "increase MAX_NUM_MUTEX"); \ |
168 assert(_num_mutex < MAX_NUM_MUTEX, "increase MAX_NUM_MUTEX"); \ |
169 _mutex_array[_num_mutex++] = var; \ |
169 _mutex_array[_num_mutex++] = var; \ |
170 } |
170 } |
171 |
171 |
|
172 // Using Padded subclasses to prevent false sharing of these global monitors and mutexes. |
172 void mutex_init() { |
173 void mutex_init() { |
173 def(tty_lock , Mutex , event, true, Monitor::_safepoint_check_never); // allow to lock in VM |
174 def(tty_lock , PaddedMutex , event, true, Monitor::_safepoint_check_never); // allow to lock in VM |
174 |
175 |
175 def(CGC_lock , Monitor, special, true, Monitor::_safepoint_check_never); // coordinate between fore- and background GC |
176 def(CGC_lock , PaddedMonitor, special, true, Monitor::_safepoint_check_never); // coordinate between fore- and background GC |
176 def(STS_lock , Monitor, leaf, true, Monitor::_safepoint_check_never); |
177 def(STS_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_never); |
177 |
178 |
178 if (UseConcMarkSweepGC || UseG1GC) { |
179 if (UseConcMarkSweepGC || UseG1GC) { |
179 def(FullGCCount_lock , Monitor, leaf, true, Monitor::_safepoint_check_never); // in support of ExplicitGCInvokesConcurrent |
180 def(FullGCCount_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_never); // in support of ExplicitGCInvokesConcurrent |
180 } |
181 } |
181 if (UseG1GC) { |
182 if (UseG1GC) { |
182 |
183 |
183 def(SATB_Q_FL_lock , Mutex , special, true, Monitor::_safepoint_check_never); |
184 def(SATB_Q_FL_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never); |
184 def(SATB_Q_CBL_mon , Monitor, nonleaf, true, Monitor::_safepoint_check_never); |
185 def(SATB_Q_CBL_mon , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_never); |
185 def(Shared_SATB_Q_lock , Mutex, nonleaf, true, Monitor::_safepoint_check_never); |
186 def(Shared_SATB_Q_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never); |
186 |
187 |
187 def(DirtyCardQ_FL_lock , Mutex , special, true, Monitor::_safepoint_check_never); |
188 def(DirtyCardQ_FL_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never); |
188 def(DirtyCardQ_CBL_mon , Monitor, nonleaf, true, Monitor::_safepoint_check_never); |
189 def(DirtyCardQ_CBL_mon , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_never); |
189 def(Shared_DirtyCardQ_lock , Mutex, nonleaf, true, Monitor::_safepoint_check_never); |
190 def(Shared_DirtyCardQ_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never); |
190 |
191 |
191 def(FreeList_lock , Mutex, leaf , true, Monitor::_safepoint_check_never); |
192 def(FreeList_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_never); |
192 def(SecondaryFreeList_lock , Monitor, leaf , true, Monitor::_safepoint_check_never); |
193 def(SecondaryFreeList_lock , PaddedMonitor, leaf , true, Monitor::_safepoint_check_never); |
193 def(OldSets_lock , Mutex , leaf , true, Monitor::_safepoint_check_never); |
194 def(OldSets_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_never); |
194 def(RootRegionScan_lock , Monitor, leaf , true, Monitor::_safepoint_check_never); |
195 def(RootRegionScan_lock , PaddedMonitor, leaf , true, Monitor::_safepoint_check_never); |
195 def(MMUTracker_lock , Mutex , leaf , true, Monitor::_safepoint_check_never); |
196 def(MMUTracker_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_never); |
196 |
197 |
197 def(StringDedupQueue_lock , Monitor, leaf, true, Monitor::_safepoint_check_never); |
198 def(StringDedupQueue_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_never); |
198 def(StringDedupTable_lock , Mutex , leaf, true, Monitor::_safepoint_check_never); |
199 def(StringDedupTable_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never); |
199 |
200 |
200 def(MarkStackFreeList_lock , Mutex , leaf , true, Monitor::_safepoint_check_never); |
201 def(MarkStackFreeList_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_never); |
201 def(MarkStackChunkList_lock , Mutex , leaf , true, Monitor::_safepoint_check_never); |
202 def(MarkStackChunkList_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_never); |
202 } |
203 } |
203 def(ParGCRareEvent_lock , Mutex , leaf , true, Monitor::_safepoint_check_sometimes); |
204 def(ParGCRareEvent_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_sometimes); |
204 def(DerivedPointerTableGC_lock , Mutex, leaf, true, Monitor::_safepoint_check_never); |
205 def(DerivedPointerTableGC_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never); |
205 def(CodeCache_lock , Mutex , special, true, Monitor::_safepoint_check_never); |
206 def(CodeCache_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never); |
206 def(RawMonitor_lock , Mutex, special, true, Monitor::_safepoint_check_never); |
207 def(RawMonitor_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never); |
207 def(OopMapCacheAlloc_lock , Mutex, leaf, true, Monitor::_safepoint_check_always); // used for oop_map_cache allocation. |
208 def(OopMapCacheAlloc_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); // used for oop_map_cache allocation. |
208 |
209 |
209 def(Patching_lock , Mutex , special, true, Monitor::_safepoint_check_never); // used for safepointing and code patching. |
210 def(Patching_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never); // used for safepointing and code patching. |
210 def(Service_lock , Monitor, special, true, Monitor::_safepoint_check_never); // used for service thread operations |
211 def(Service_lock , PaddedMonitor, special, true, Monitor::_safepoint_check_never); // used for service thread operations |
211 def(JmethodIdCreation_lock , Mutex , leaf, true, Monitor::_safepoint_check_always); // used for creating jmethodIDs. |
212 def(JmethodIdCreation_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); // used for creating jmethodIDs. |
212 |
213 |
213 def(SystemDictionary_lock , Monitor, leaf, true, Monitor::_safepoint_check_always); // lookups done by VM thread |
214 def(SystemDictionary_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_always); // lookups done by VM thread |
214 def(Module_lock , Mutex , leaf+2, true, Monitor::_safepoint_check_always); |
215 def(Module_lock , PaddedMutex , leaf+2, true, Monitor::_safepoint_check_always); |
215 def(InlineCacheBuffer_lock , Mutex , leaf, true, Monitor::_safepoint_check_always); |
216 def(InlineCacheBuffer_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); |
216 def(VMStatistic_lock , Mutex , leaf, false, Monitor::_safepoint_check_always); |
217 def(VMStatistic_lock , PaddedMutex , leaf, false, Monitor::_safepoint_check_always); |
217 def(ExpandHeap_lock , Mutex , leaf, true, Monitor::_safepoint_check_always); // Used during compilation by VM thread |
218 def(ExpandHeap_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); // Used during compilation by VM thread |
218 def(JNIHandleBlockFreeList_lock , Mutex , leaf, true, Monitor::_safepoint_check_never); // handles are used by VM thread |
219 def(JNIHandleBlockFreeList_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never); // handles are used by VM thread |
219 def(SignatureHandlerLibrary_lock , Mutex , leaf, false, Monitor::_safepoint_check_always); |
220 def(SignatureHandlerLibrary_lock , PaddedMutex , leaf, false, Monitor::_safepoint_check_always); |
220 def(SymbolTable_lock , Mutex , leaf+2, true, Monitor::_safepoint_check_always); |
221 def(SymbolTable_lock , PaddedMutex , leaf+2, true, Monitor::_safepoint_check_always); |
221 def(StringTable_lock , Mutex , leaf, true, Monitor::_safepoint_check_always); |
222 def(StringTable_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); |
222 def(ProfilePrint_lock , Mutex , leaf, false, Monitor::_safepoint_check_always); // serial profile printing |
223 def(ProfilePrint_lock , PaddedMutex , leaf, false, Monitor::_safepoint_check_always); // serial profile printing |
223 def(ExceptionCache_lock , Mutex , leaf, false, Monitor::_safepoint_check_always); // serial profile printing |
224 def(ExceptionCache_lock , PaddedMutex , leaf, false, Monitor::_safepoint_check_always); // serial profile printing |
224 def(OsrList_lock , Mutex , leaf, true, Monitor::_safepoint_check_never); |
225 def(OsrList_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never); |
225 def(Debug1_lock , Mutex , leaf, true, Monitor::_safepoint_check_never); |
226 def(Debug1_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never); |
226 #ifndef PRODUCT |
227 #ifndef PRODUCT |
227 def(FullGCALot_lock , Mutex , leaf, false, Monitor::_safepoint_check_always); // a lock to make FullGCALot MT safe |
228 def(FullGCALot_lock , PaddedMutex , leaf, false, Monitor::_safepoint_check_always); // a lock to make FullGCALot MT safe |
228 #endif |
229 #endif |
229 def(BeforeExit_lock , Monitor, leaf, true, Monitor::_safepoint_check_always); |
230 def(BeforeExit_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_always); |
230 def(PerfDataMemAlloc_lock , Mutex , leaf, true, Monitor::_safepoint_check_always); // used for allocating PerfData memory for performance data |
231 def(PerfDataMemAlloc_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); // used for allocating PerfData memory for performance data |
231 def(PerfDataManager_lock , Mutex , leaf, true, Monitor::_safepoint_check_always); // used for synchronized access to PerfDataManager resources |
232 def(PerfDataManager_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); // used for synchronized access to PerfDataManager resources |
232 |
233 |
233 // CMS_modUnionTable_lock leaf |
234 // CMS_modUnionTable_lock leaf |
234 // CMS_bitMap_lock leaf 1 |
235 // CMS_bitMap_lock leaf 1 |
235 // CMS_freeList_lock leaf 2 |
236 // CMS_freeList_lock leaf 2 |
236 |
237 |
237 def(Safepoint_lock , Monitor, safepoint, true, Monitor::_safepoint_check_sometimes); // locks SnippetCache_lock/Threads_lock |
238 def(Safepoint_lock , PaddedMonitor, safepoint, true, Monitor::_safepoint_check_sometimes); // locks SnippetCache_lock/Threads_lock |
238 |
239 |
239 def(Threads_lock , Monitor, barrier, true, Monitor::_safepoint_check_sometimes); |
240 def(Threads_lock , PaddedMonitor, barrier, true, Monitor::_safepoint_check_sometimes); |
240 |
241 |
241 def(VMOperationQueue_lock , Monitor, nonleaf, true, Monitor::_safepoint_check_sometimes); // VM_thread allowed to block on these |
242 def(VMOperationQueue_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes); // VM_thread allowed to block on these |
242 def(VMOperationRequest_lock , Monitor, nonleaf, true, Monitor::_safepoint_check_sometimes); |
243 def(VMOperationRequest_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes); |
243 def(RetData_lock , Mutex , nonleaf, false, Monitor::_safepoint_check_always); |
244 def(RetData_lock , PaddedMutex , nonleaf, false, Monitor::_safepoint_check_always); |
244 def(Terminator_lock , Monitor, nonleaf, true, Monitor::_safepoint_check_sometimes); |
245 def(Terminator_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes); |
245 def(VtableStubs_lock , Mutex , nonleaf, true, Monitor::_safepoint_check_always); |
246 def(VtableStubs_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_always); |
246 def(Notify_lock , Monitor, nonleaf, true, Monitor::_safepoint_check_always); |
247 def(Notify_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_always); |
247 def(JNIGlobalHandle_lock , Mutex , nonleaf, true, Monitor::_safepoint_check_always); // locks JNIHandleBlockFreeList_lock |
248 def(JNIGlobalHandle_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_always); // locks JNIHandleBlockFreeList_lock |
248 def(JNICritical_lock , Monitor, nonleaf, true, Monitor::_safepoint_check_always); // used for JNI critical regions |
249 def(JNICritical_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_always); // used for JNI critical regions |
249 def(AdapterHandlerLibrary_lock , Mutex , nonleaf, true, Monitor::_safepoint_check_always); |
250 def(AdapterHandlerLibrary_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_always); |
250 |
251 |
251 def(Heap_lock , Monitor, nonleaf+1, false, Monitor::_safepoint_check_sometimes); |
252 def(Heap_lock , PaddedMonitor, nonleaf+1, false, Monitor::_safepoint_check_sometimes); |
252 def(JfieldIdCreation_lock , Mutex , nonleaf+1, true, Monitor::_safepoint_check_always); // jfieldID, Used in VM_Operation |
253 def(JfieldIdCreation_lock , PaddedMutex , nonleaf+1, true, Monitor::_safepoint_check_always); // jfieldID, Used in VM_Operation |
253 def(MemberNameTable_lock , Mutex , nonleaf+1, false, Monitor::_safepoint_check_always); // Used to protect MemberNameTable |
254 def(MemberNameTable_lock , PaddedMutex , nonleaf+1, false, Monitor::_safepoint_check_always); // Used to protect MemberNameTable |
254 |
255 |
255 def(CompiledIC_lock , Mutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks VtableStubs_lock, InlineCacheBuffer_lock |
256 def(CompiledIC_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks VtableStubs_lock, InlineCacheBuffer_lock |
256 def(CompileTaskAlloc_lock , Mutex , nonleaf+2, true, Monitor::_safepoint_check_always); |
257 def(CompileTaskAlloc_lock , PaddedMutex , nonleaf+2, true, Monitor::_safepoint_check_always); |
257 def(CompileStatistics_lock , Mutex , nonleaf+2, false, Monitor::_safepoint_check_always); |
258 def(CompileStatistics_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); |
258 def(DirectivesStack_lock , Mutex , special, true, Monitor::_safepoint_check_never); |
259 def(DirectivesStack_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never); |
259 def(MultiArray_lock , Mutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks SymbolTable_lock |
260 def(MultiArray_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks SymbolTable_lock |
260 |
261 |
261 def(JvmtiThreadState_lock , Mutex , nonleaf+2, false, Monitor::_safepoint_check_always); // Used by JvmtiThreadState/JvmtiEventController |
262 def(JvmtiThreadState_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // Used by JvmtiThreadState/JvmtiEventController |
262 def(Management_lock , Mutex , nonleaf+2, false, Monitor::_safepoint_check_always); // used for JVM management |
263 def(Management_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // used for JVM management |
263 |
264 |
264 def(Compile_lock , Mutex , nonleaf+3, true, Monitor::_safepoint_check_sometimes); |
265 def(Compile_lock , PaddedMutex , nonleaf+3, true, Monitor::_safepoint_check_sometimes); |
265 def(MethodData_lock , Mutex , nonleaf+3, false, Monitor::_safepoint_check_always); |
266 def(MethodData_lock , PaddedMutex , nonleaf+3, false, Monitor::_safepoint_check_always); |
266 def(TouchedMethodLog_lock , Mutex , nonleaf+3, false, Monitor::_safepoint_check_always); |
267 def(TouchedMethodLog_lock , PaddedMutex , nonleaf+3, false, Monitor::_safepoint_check_always); |
267 |
268 |
268 def(MethodCompileQueue_lock , Monitor, nonleaf+4, true, Monitor::_safepoint_check_always); |
269 def(MethodCompileQueue_lock , PaddedMonitor, nonleaf+4, true, Monitor::_safepoint_check_always); |
269 def(Debug2_lock , Mutex , nonleaf+4, true, Monitor::_safepoint_check_never); |
270 def(Debug2_lock , PaddedMutex , nonleaf+4, true, Monitor::_safepoint_check_never); |
270 def(Debug3_lock , Mutex , nonleaf+4, true, Monitor::_safepoint_check_never); |
271 def(Debug3_lock , PaddedMutex , nonleaf+4, true, Monitor::_safepoint_check_never); |
271 def(CompileThread_lock , Monitor, nonleaf+5, false, Monitor::_safepoint_check_always); |
272 def(CompileThread_lock , PaddedMonitor, nonleaf+5, false, Monitor::_safepoint_check_always); |
272 def(PeriodicTask_lock , Monitor, nonleaf+5, true, Monitor::_safepoint_check_sometimes); |
273 def(PeriodicTask_lock , PaddedMonitor, nonleaf+5, true, Monitor::_safepoint_check_sometimes); |
273 def(RedefineClasses_lock , Monitor, nonleaf+5, true, Monitor::_safepoint_check_always); |
274 def(RedefineClasses_lock , PaddedMonitor, nonleaf+5, true, Monitor::_safepoint_check_always); |
274 if (WhiteBoxAPI) { |
275 if (WhiteBoxAPI) { |
275 def(Compilation_lock , Monitor, leaf, false, Monitor::_safepoint_check_never); |
276 def(Compilation_lock , PaddedMonitor, leaf, false, Monitor::_safepoint_check_never); |
276 } |
277 } |
277 |
278 |
278 #ifdef INCLUDE_TRACE |
279 #ifdef INCLUDE_TRACE |
279 def(JfrMsg_lock , Monitor, leaf, true, Monitor::_safepoint_check_always); |
280 def(JfrMsg_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_always); |
280 def(JfrBuffer_lock , Mutex, leaf, true, Monitor::_safepoint_check_never); |
281 def(JfrBuffer_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never); |
281 def(JfrThreadGroups_lock , Mutex, leaf, true, Monitor::_safepoint_check_always); |
282 def(JfrThreadGroups_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); |
282 def(JfrStream_lock , Mutex, leaf+1, true, Monitor::_safepoint_check_never); // ensure to rank lower than 'safepoint' |
283 def(JfrStream_lock , PaddedMutex , leaf+1, true, Monitor::_safepoint_check_never); // ensure to rank lower than 'safepoint' |
283 def(JfrStacktrace_lock , Mutex, special, true, Monitor::_safepoint_check_sometimes); |
284 def(JfrStacktrace_lock , PaddedMutex , special, true, Monitor::_safepoint_check_sometimes); |
284 #endif |
285 #endif |
285 |
286 |
286 #ifndef SUPPORTS_NATIVE_CX8 |
287 #ifndef SUPPORTS_NATIVE_CX8 |
287 def(UnsafeJlong_lock , Mutex, special, false, Monitor::_safepoint_check_never); |
288 def(UnsafeJlong_lock , PaddedMutex , special, false, Monitor::_safepoint_check_never); |
288 #endif |
289 #endif |
289 } |
290 } |
290 |
291 |
291 GCMutexLocker::GCMutexLocker(Monitor * mutex) { |
292 GCMutexLocker::GCMutexLocker(Monitor * mutex) { |
292 if (SafepointSynchronize::is_at_safepoint()) { |
293 if (SafepointSynchronize::is_at_safepoint()) { |