annotate src/share/vm/runtime/mutexLocker.cpp @ 1145:e018e6884bd8

6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
author ysr
date Wed, 23 Dec 2009 09:23:54 -0800
parents bd02caa94611
children 72f725c5a7be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
844
bd02caa94611 6862919: Update copyright year
xdono
parents: 794
diff changeset
2 * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_mutexLocker.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // Mutexes used in the VM (see comment in mutexLocker.hpp):
a61af66fc99e Initial load
duke
parents:
diff changeset
29 //
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // Note that the following pointers are effectively final -- after having been
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // set at JVM startup-time, they should never be subsequently mutated.
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // Instead of using pointers to malloc()ed monitors and mutexes we should consider
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // eliminating the indirection and using instances instead.
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // Consider using GCC's __read_mostly.
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 Mutex* Patching_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 Monitor* SystemDictionary_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 Mutex* PackageTable_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 Mutex* CompiledIC_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 Mutex* InlineCacheBuffer_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 Mutex* VMStatistic_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 Mutex* JNIGlobalHandle_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 Mutex* JNIHandleBlockFreeList_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 Mutex* JNICachedItableIndex_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 Mutex* JmethodIdCreation_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 Mutex* JfieldIdCreation_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 Monitor* JNICritical_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 Mutex* JvmtiThreadState_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 Monitor* JvmtiPendingEvent_lock = NULL;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
50 Monitor* Heap_lock = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
51 Mutex* ExpandHeap_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 Mutex* AdapterHandlerLibrary_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 Mutex* SignatureHandlerLibrary_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 Mutex* VtableStubs_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 Mutex* SymbolTable_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 Mutex* StringTable_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 Mutex* CodeCache_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 Mutex* MethodData_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 Mutex* RetData_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 Monitor* VMOperationQueue_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 Monitor* VMOperationRequest_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 Monitor* Safepoint_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 Monitor* SerializePage_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 Monitor* Threads_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 Monitor* CGC_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 Mutex* STS_init_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 Monitor* SLT_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 Monitor* iCMS_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 Monitor* FullGCCount_lock = NULL;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
70 Monitor* CMark_lock = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
71 Monitor* ZF_mon = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
72 Monitor* Cleanup_mon = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
73 Mutex* SATB_Q_FL_lock = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
74 Monitor* SATB_Q_CBL_mon = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
75 Mutex* Shared_SATB_Q_lock = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
76 Mutex* DirtyCardQ_FL_lock = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
77 Monitor* DirtyCardQ_CBL_mon = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
78 Mutex* Shared_DirtyCardQ_lock = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79 Mutex* ParGCRareEvent_lock = NULL;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
80 Mutex* EvacFailureStack_lock = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
81 Mutex* DerivedPointerTableGC_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 Mutex* Compile_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 Monitor* MethodCompileQueue_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
85 Monitor* C1_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
87 Monitor* CompileThread_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 Mutex* CompileTaskAlloc_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 Mutex* CompileStatistics_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 Mutex* MultiArray_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
91 Monitor* Terminator_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
92 Monitor* BeforeExit_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
93 Monitor* Notify_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 Monitor* Interrupt_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 Monitor* ProfileVM_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 Mutex* ProfilePrint_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
97 Mutex* ExceptionCache_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
98 Monitor* ObjAllocPost_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
99 Mutex* OsrList_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
101 Mutex* FullGCALot_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 Mutex* Debug1_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 Mutex* Debug2_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 Mutex* Debug3_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 Mutex* tty_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 Mutex* RawMonitor_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 Mutex* PerfDataMemAlloc_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 Mutex* PerfDataManager_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 Mutex* OopMapCacheAlloc_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
114
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
115 Mutex* MMUTracker_lock = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
116 Mutex* HotCardCache_lock = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
117
0
a61af66fc99e Initial load
duke
parents:
diff changeset
118 Monitor* GCTaskManager_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 Mutex* Management_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 Monitor* LowMemory_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 #define MAX_NUM_MUTEX 128
a61af66fc99e Initial load
duke
parents:
diff changeset
124 static Monitor * _mutex_array[MAX_NUM_MUTEX];
a61af66fc99e Initial load
duke
parents:
diff changeset
125 static int _num_mutex;
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
128 void assert_locked_or_safepoint(const Monitor * lock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // check if this thread owns the lock (common case)
a61af66fc99e Initial load
duke
parents:
diff changeset
130 if (IgnoreLockingAssertions) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 assert(lock != NULL, "Need non-NULL lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
132 if (lock->owned_by_self()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 if (SafepointSynchronize::is_at_safepoint()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 if (!Universe::is_fully_initialized()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // see if invoker of VM operation owns it
a61af66fc99e Initial load
duke
parents:
diff changeset
136 VM_Operation* op = VMThread::vm_operation();
a61af66fc99e Initial load
duke
parents:
diff changeset
137 if (op != NULL && op->calling_thread() == lock->owner()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 fatal1("must own lock %s", lock->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // a stronger assertion than the above
a61af66fc99e Initial load
duke
parents:
diff changeset
142 void assert_lock_strong(const Monitor * lock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 if (IgnoreLockingAssertions) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 assert(lock != NULL, "Need non-NULL lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
145 if (lock->owned_by_self()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 fatal1("must own lock %s", lock->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 #define def(var, type, pri, vm_block) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
151 var = new type(Mutex::pri, #var, vm_block); \
a61af66fc99e Initial load
duke
parents:
diff changeset
152 assert(_num_mutex < MAX_NUM_MUTEX, \
a61af66fc99e Initial load
duke
parents:
diff changeset
153 "increase MAX_NUM_MUTEX"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
154 _mutex_array[_num_mutex++] = var; \
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 void mutex_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 def(tty_lock , Mutex , event, true ); // allow to lock in VM
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 def(CGC_lock , Monitor, special, true ); // coordinate between fore- and background GC
a61af66fc99e Initial load
duke
parents:
diff changeset
161 def(STS_init_lock , Mutex, leaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
162 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 def(iCMS_lock , Monitor, special, true ); // CMS incremental mode start/stop notification
a61af66fc99e Initial load
duke
parents:
diff changeset
164 def(FullGCCount_lock , Monitor, leaf, true ); // in support of ExplicitGCInvokesConcurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
166 if (UseG1GC) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
167 def(CMark_lock , Monitor, nonleaf, true ); // coordinate concurrent mark thread
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
168 def(ZF_mon , Monitor, leaf, true );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
169 def(Cleanup_mon , Monitor, nonleaf, true );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
170 def(SATB_Q_FL_lock , Mutex , special, true );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
171 def(SATB_Q_CBL_mon , Monitor, nonleaf, true );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
172 def(Shared_SATB_Q_lock , Mutex, nonleaf, true );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
173
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
174 def(DirtyCardQ_FL_lock , Mutex , special, true );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
175 def(DirtyCardQ_CBL_mon , Monitor, nonleaf, true );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
176 def(Shared_DirtyCardQ_lock , Mutex, nonleaf, true );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
177
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
178 def(MMUTracker_lock , Mutex , leaf , true );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
179 def(HotCardCache_lock , Mutex , special , true );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
180 def(EvacFailureStack_lock , Mutex , nonleaf , true );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
181 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
182 def(ParGCRareEvent_lock , Mutex , leaf , true );
a61af66fc99e Initial load
duke
parents:
diff changeset
183 def(DerivedPointerTableGC_lock , Mutex, leaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
184 def(CodeCache_lock , Mutex , special, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
185 def(Interrupt_lock , Monitor, special, true ); // used for interrupt processing
a61af66fc99e Initial load
duke
parents:
diff changeset
186 def(RawMonitor_lock , Mutex, special, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
187 def(OopMapCacheAlloc_lock , Mutex, leaf, true ); // used for oop_map_cache allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 def(Patching_lock , Mutex , special, true ); // used for safepointing and code patching.
a61af66fc99e Initial load
duke
parents:
diff changeset
190 def(ObjAllocPost_lock , Monitor, special, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
191 def(LowMemory_lock , Monitor, special, true ); // used for low memory detection
a61af66fc99e Initial load
duke
parents:
diff changeset
192 def(JmethodIdCreation_lock , Mutex , leaf, true ); // used for creating jmethodIDs.
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 def(SystemDictionary_lock , Monitor, leaf, true ); // lookups done by VM thread
a61af66fc99e Initial load
duke
parents:
diff changeset
195 def(PackageTable_lock , Mutex , leaf, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
196 def(InlineCacheBuffer_lock , Mutex , leaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
197 def(VMStatistic_lock , Mutex , leaf, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
198 def(ExpandHeap_lock , Mutex , leaf, true ); // Used during compilation by VM thread
a61af66fc99e Initial load
duke
parents:
diff changeset
199 def(JNIHandleBlockFreeList_lock , Mutex , leaf, true ); // handles are used by VM thread
a61af66fc99e Initial load
duke
parents:
diff changeset
200 def(SignatureHandlerLibrary_lock , Mutex , leaf, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
201 def(SymbolTable_lock , Mutex , leaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
202 def(StringTable_lock , Mutex , leaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
203 def(ProfilePrint_lock , Mutex , leaf, false); // serial profile printing
a61af66fc99e Initial load
duke
parents:
diff changeset
204 def(ExceptionCache_lock , Mutex , leaf, false); // serial profile printing
a61af66fc99e Initial load
duke
parents:
diff changeset
205 def(OsrList_lock , Mutex , leaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
206 def(Debug1_lock , Mutex , leaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
207 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
208 def(FullGCALot_lock , Mutex , leaf, false); // a lock to make FullGCALot MT safe
a61af66fc99e Initial load
duke
parents:
diff changeset
209 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
210 def(BeforeExit_lock , Monitor, leaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
211 def(PerfDataMemAlloc_lock , Mutex , leaf, true ); // used for allocating PerfData memory for performance data
a61af66fc99e Initial load
duke
parents:
diff changeset
212 def(PerfDataManager_lock , Mutex , leaf, true ); // used for synchronized access to PerfDataManager resources
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // CMS_modUnionTable_lock leaf
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // CMS_bitMap_lock leaf + 1
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // CMS_freeList_lock leaf + 2
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 def(Safepoint_lock , Monitor, safepoint, true ); // locks SnippetCache_lock/Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 def(Threads_lock , Monitor, barrier, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 def(VMOperationQueue_lock , Monitor, nonleaf, true ); // VM_thread allowed to block on these
a61af66fc99e Initial load
duke
parents:
diff changeset
223 def(VMOperationRequest_lock , Monitor, nonleaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
224 def(RetData_lock , Mutex , nonleaf, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 def(Terminator_lock , Monitor, nonleaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
226 def(VtableStubs_lock , Mutex , nonleaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
227 def(Notify_lock , Monitor, nonleaf, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
228 def(JNIGlobalHandle_lock , Mutex , nonleaf, true ); // locks JNIHandleBlockFreeList_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
229 def(JNICritical_lock , Monitor, nonleaf, true ); // used for JNI critical regions
a61af66fc99e Initial load
duke
parents:
diff changeset
230 def(AdapterHandlerLibrary_lock , Mutex , nonleaf, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
232 def(SLT_lock , Monitor, nonleaf, false );
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // used in CMS GC for locking PLL lock
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 55
diff changeset
235 def(Heap_lock , Monitor, nonleaf+1, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
236 def(JfieldIdCreation_lock , Mutex , nonleaf+1, true ); // jfieldID, Used in VM_Operation
a61af66fc99e Initial load
duke
parents:
diff changeset
237 def(JNICachedItableIndex_lock , Mutex , nonleaf+1, false); // Used to cache an itable index during JNI invoke
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 def(CompiledIC_lock , Mutex , nonleaf+2, false); // locks VtableStubs_lock, InlineCacheBuffer_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
240 def(CompileTaskAlloc_lock , Mutex , nonleaf+2, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
241 def(CompileStatistics_lock , Mutex , nonleaf+2, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
242 def(MultiArray_lock , Mutex , nonleaf+2, false); // locks SymbolTable_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 def(JvmtiThreadState_lock , Mutex , nonleaf+2, false); // Used by JvmtiThreadState/JvmtiEventController
a61af66fc99e Initial load
duke
parents:
diff changeset
245 def(JvmtiPendingEvent_lock , Monitor, nonleaf, false); // Used by JvmtiCodeBlobEvents
a61af66fc99e Initial load
duke
parents:
diff changeset
246 def(Management_lock , Mutex , nonleaf+2, false); // used for JVM management
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 def(Compile_lock , Mutex , nonleaf+3, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
249 def(MethodData_lock , Mutex , nonleaf+3, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 def(MethodCompileQueue_lock , Monitor, nonleaf+4, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
252 def(Debug2_lock , Mutex , nonleaf+4, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
253 def(Debug3_lock , Mutex , nonleaf+4, true );
a61af66fc99e Initial load
duke
parents:
diff changeset
254 def(ProfileVM_lock , Monitor, nonleaf+4, false); // used for profiling of the VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
255 def(CompileThread_lock , Monitor, nonleaf+5, false );
a61af66fc99e Initial load
duke
parents:
diff changeset
256 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
257 def(C1_lock , Monitor, nonleaf+5, false );
a61af66fc99e Initial load
duke
parents:
diff changeset
258 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 GCMutexLocker::GCMutexLocker(Monitor * mutex) {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 if (SafepointSynchronize::is_at_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 _locked = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 _mutex = mutex;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 _locked = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
269 _mutex->lock();
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // Print all mutexes/monitors that are currently owned by a thread; called
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // by fatal error handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
275 void print_owned_locks_on_error(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
276 st->print("VM Mutex/Monitor currently owned by a thread: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
277 bool none = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 for (int i = 0; i < _num_mutex; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // see if it has an owner
a61af66fc99e Initial load
duke
parents:
diff changeset
280 if (_mutex_array[i]->owner() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 if (none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // print format used by Mutex::print_on_error()
a61af66fc99e Initial load
duke
parents:
diff changeset
283 st->print_cr(" ([mutex/lock_event])");
a61af66fc99e Initial load
duke
parents:
diff changeset
284 none = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286 _mutex_array[i]->print_on_error(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
287 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 if (none) st->print_cr("None");
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }