annotate src/share/vm/runtime/vm_operations.hpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents bd02caa94611
children 5f24d0319e54
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: 677
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 // The following classes are used for operations
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // initiated by a Java thread but that must
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // take place in the VMThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 #define VM_OP_ENUM(type) VMOp_##type,
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // Note: When new VM_XXX comes up, add 'XXX' to the template table.
a61af66fc99e Initial load
duke
parents:
diff changeset
32 #define VM_OPS_DO(template) \
a61af66fc99e Initial load
duke
parents:
diff changeset
33 template(Dummy) \
a61af66fc99e Initial load
duke
parents:
diff changeset
34 template(ThreadStop) \
a61af66fc99e Initial load
duke
parents:
diff changeset
35 template(ThreadDump) \
a61af66fc99e Initial load
duke
parents:
diff changeset
36 template(PrintThreads) \
a61af66fc99e Initial load
duke
parents:
diff changeset
37 template(FindDeadlocks) \
a61af66fc99e Initial load
duke
parents:
diff changeset
38 template(ForceSafepoint) \
a61af66fc99e Initial load
duke
parents:
diff changeset
39 template(ForceAsyncSafepoint) \
a61af66fc99e Initial load
duke
parents:
diff changeset
40 template(Deoptimize) \
a61af66fc99e Initial load
duke
parents:
diff changeset
41 template(DeoptimizeFrame) \
a61af66fc99e Initial load
duke
parents:
diff changeset
42 template(DeoptimizeAll) \
a61af66fc99e Initial load
duke
parents:
diff changeset
43 template(ZombieAll) \
a61af66fc99e Initial load
duke
parents:
diff changeset
44 template(Verify) \
a61af66fc99e Initial load
duke
parents:
diff changeset
45 template(PrintJNI) \
a61af66fc99e Initial load
duke
parents:
diff changeset
46 template(HeapDumper) \
a61af66fc99e Initial load
duke
parents:
diff changeset
47 template(DeoptimizeTheWorld) \
a61af66fc99e Initial load
duke
parents:
diff changeset
48 template(GC_HeapInspection) \
a61af66fc99e Initial load
duke
parents:
diff changeset
49 template(GenCollectFull) \
a61af66fc99e Initial load
duke
parents:
diff changeset
50 template(GenCollectFullConcurrent) \
a61af66fc99e Initial load
duke
parents:
diff changeset
51 template(GenCollectForAllocation) \
139
c0492d52d55b 6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents: 0
diff changeset
52 template(GenCollectForPermanentAllocation) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
53 template(ParallelGCFailedAllocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
54 template(ParallelGCFailedPermanentAllocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
55 template(ParallelGCSystemGC) \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
56 template(CGC_Operation) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
57 template(CMS_Initial_Mark) \
a61af66fc99e Initial load
duke
parents:
diff changeset
58 template(CMS_Final_Remark) \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
59 template(G1CollectFull) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
60 template(G1CollectForAllocation) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
61 template(G1IncCollectionPause) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 template(EnableBiasedLocking) \
a61af66fc99e Initial load
duke
parents:
diff changeset
63 template(RevokeBias) \
a61af66fc99e Initial load
duke
parents:
diff changeset
64 template(BulkRevokeBias) \
a61af66fc99e Initial load
duke
parents:
diff changeset
65 template(PopulateDumpSharedSpace) \
a61af66fc99e Initial load
duke
parents:
diff changeset
66 template(JNIFunctionTableCopier) \
a61af66fc99e Initial load
duke
parents:
diff changeset
67 template(RedefineClasses) \
a61af66fc99e Initial load
duke
parents:
diff changeset
68 template(GetOwnedMonitorInfo) \
a61af66fc99e Initial load
duke
parents:
diff changeset
69 template(GetObjectMonitorUsage) \
a61af66fc99e Initial load
duke
parents:
diff changeset
70 template(GetCurrentContendedMonitor) \
a61af66fc99e Initial load
duke
parents:
diff changeset
71 template(GetStackTrace) \
a61af66fc99e Initial load
duke
parents:
diff changeset
72 template(GetMultipleStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
73 template(GetAllStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
74 template(GetThreadListStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
75 template(GetFrameCount) \
a61af66fc99e Initial load
duke
parents:
diff changeset
76 template(GetFrameLocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
77 template(ChangeBreakpoints) \
a61af66fc99e Initial load
duke
parents:
diff changeset
78 template(GetOrSetLocal) \
a61af66fc99e Initial load
duke
parents:
diff changeset
79 template(GetCurrentLocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
80 template(EnterInterpOnlyMode) \
a61af66fc99e Initial load
duke
parents:
diff changeset
81 template(ChangeSingleStep) \
a61af66fc99e Initial load
duke
parents:
diff changeset
82 template(HeapWalkOperation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
83 template(HeapIterateOperation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
84 template(ReportJavaOutOfMemory) \
a61af66fc99e Initial load
duke
parents:
diff changeset
85 template(Exit) \
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 class VM_Operation: public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
89 enum Mode {
a61af66fc99e Initial load
duke
parents:
diff changeset
90 _safepoint, // blocking, safepoint, vm_op C-heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
91 _no_safepoint, // blocking, no safepoint, vm_op C-Heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
92 _concurrent, // non-blocking, no safepoint, vm_op C-Heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
93 _async_safepoint // non-blocking, safepoint, vm_op C-Heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
94 };
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 enum VMOp_Type {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 VM_OPS_DO(VM_OP_ENUM)
a61af66fc99e Initial load
duke
parents:
diff changeset
98 VMOp_Terminating
a61af66fc99e Initial load
duke
parents:
diff changeset
99 };
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
102 Thread* _calling_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 ThreadPriority _priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 long _timestamp;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 VM_Operation* _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 VM_Operation* _prev;
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // The VM operation name array
a61af66fc99e Initial load
duke
parents:
diff changeset
109 static const char* _names[];
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
112 VM_Operation() { _calling_thread = NULL; _next = NULL; _prev = NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
113 virtual ~VM_Operation() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // VM operation support (used by VM thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
116 Thread* calling_thread() const { return _calling_thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
117 ThreadPriority priority() { return _priority; }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 void set_calling_thread(Thread* thread, ThreadPriority priority);
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 long timestamp() const { return _timestamp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
121 void set_timestamp(long timestamp) { _timestamp = timestamp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // Called by VM thread - does in turn invoke doit(). Do not override this
a61af66fc99e Initial load
duke
parents:
diff changeset
124 void evaluate();
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // evaluate() is called by the VMThread and in turn calls doit().
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // If the thread invoking VMThread::execute((VM_Operation*) is a JavaThread,
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // doit_prologue() is called in that thread before transferring control to
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // the VMThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // If doit_prologue() returns true the VM operation will proceed, and
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // doit_epilogue() will be called by the JavaThread once the VM operation
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // completes. If doit_prologue() returns false the VM operation is cancelled.
a61af66fc99e Initial load
duke
parents:
diff changeset
133 virtual void doit() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 virtual bool doit_prologue() { return true; };
a61af66fc99e Initial load
duke
parents:
diff changeset
135 virtual void doit_epilogue() {}; // Note: Not called if mode is: _concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // Type test
a61af66fc99e Initial load
duke
parents:
diff changeset
138 virtual bool is_methodCompiler() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // Linking
a61af66fc99e Initial load
duke
parents:
diff changeset
141 VM_Operation *next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
142 VM_Operation *prev() const { return _prev; }
a61af66fc99e Initial load
duke
parents:
diff changeset
143 void set_next(VM_Operation *next) { _next = next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 void set_prev(VM_Operation *prev) { _prev = prev; }
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Configuration. Override these appropriatly in subclasses.
a61af66fc99e Initial load
duke
parents:
diff changeset
147 virtual VMOp_Type type() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 virtual Mode evaluation_mode() const { return _safepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
149 virtual bool allow_nested_vm_operations() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
150 virtual bool is_cheap_allocated() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
151 virtual void oops_do(OopClosure* f) { /* do nothing */ };
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // CAUTION: <don't hang yourself with following rope>
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // If you override these methods, make sure that the evaluation
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // of these methods is race-free and non-blocking, since these
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // methods may be evaluated either by the mutators or by the
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // vm thread, either concurrently with mutators or with the mutators
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // stopped. In other words, taking locks is verboten, and if there
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // are any races in evaluating the conditions, they'd better be benign.
a61af66fc99e Initial load
duke
parents:
diff changeset
160 virtual bool evaluate_at_safepoint() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 return evaluation_mode() == _safepoint ||
a61af66fc99e Initial load
duke
parents:
diff changeset
162 evaluation_mode() == _async_safepoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 virtual bool evaluate_concurrently() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 return evaluation_mode() == _concurrent ||
a61af66fc99e Initial load
duke
parents:
diff changeset
166 evaluation_mode() == _async_safepoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
170 void print_on_error(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 const char* name() const { return _names[type()]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
172 static const char* name(int type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 assert(type >= 0 && type < VMOp_Terminating, "invalid VM operation type");
a61af66fc99e Initial load
duke
parents:
diff changeset
174 return _names[type];
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
176 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
177 void print_on(outputStream* st) const { print_on_error(st); }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
179 };
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 class VM_ThreadStop: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
183 oop _thread; // The Thread that the Throwable is thrown against
a61af66fc99e Initial load
duke
parents:
diff changeset
184 oop _throwable; // The Throwable thrown at the target Thread
a61af66fc99e Initial load
duke
parents:
diff changeset
185 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // All oops are passed as JNI handles, since there is no guarantee that a GC might happen before the
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // VM operation is executed.
a61af66fc99e Initial load
duke
parents:
diff changeset
188 VM_ThreadStop(oop thread, oop throwable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
189 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
190 _throwable = throwable;
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 VMOp_Type type() const { return VMOp_ThreadStop; }
a61af66fc99e Initial load
duke
parents:
diff changeset
193 oop target_thread() const { return _thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
194 oop throwable() const { return _throwable;}
a61af66fc99e Initial load
duke
parents:
diff changeset
195 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // We deoptimize if top-most frame is compiled - this might require a C2I adapter to be generated
a61af66fc99e Initial load
duke
parents:
diff changeset
197 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
198 Mode evaluation_mode() const { return _async_safepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
199 bool is_cheap_allocated() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
202 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 f->do_oop(&_thread); f->do_oop(&_throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 };
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // dummy vm op, evaluated just to force a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
208 class VM_ForceSafepoint: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
210 VM_ForceSafepoint() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
211 void doit() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
212 VMOp_Type type() const { return VMOp_ForceSafepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
213 };
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // dummy vm op, evaluated just to force a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
216 class VM_ForceAsyncSafepoint: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
218 VM_ForceAsyncSafepoint() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
219 void doit() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
220 VMOp_Type type() const { return VMOp_ForceAsyncSafepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 Mode evaluation_mode() const { return _async_safepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 bool is_cheap_allocated() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
223 };
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 class VM_Deoptimize: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
227 VM_Deoptimize() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
228 VMOp_Type type() const { return VMOp_Deoptimize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
229 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
230 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
231 };
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 class VM_DeoptimizeFrame: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
235 JavaThread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
236 intptr_t* _id;
a61af66fc99e Initial load
duke
parents:
diff changeset
237 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
238 VM_DeoptimizeFrame(JavaThread* thread, intptr_t* id);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 VMOp_Type type() const { return VMOp_DeoptimizeFrame; }
a61af66fc99e Initial load
duke
parents:
diff changeset
240 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
241 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 };
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
245 class VM_DeoptimizeAll: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
247 KlassHandle _dependee;
a61af66fc99e Initial load
duke
parents:
diff changeset
248 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
249 VM_DeoptimizeAll() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
250 VMOp_Type type() const { return VMOp_DeoptimizeAll; }
a61af66fc99e Initial load
duke
parents:
diff changeset
251 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
252 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
253 };
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 class VM_ZombieAll: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
258 VM_ZombieAll() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
259 VMOp_Type type() const { return VMOp_ZombieAll; }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
261 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
262 };
a61af66fc99e Initial load
duke
parents:
diff changeset
263 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 class VM_Verify: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
267 KlassHandle _dependee;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
269 VM_Verify() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
270 VMOp_Type type() const { return VMOp_Verify; }
a61af66fc99e Initial load
duke
parents:
diff changeset
271 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
272 };
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 class VM_PrintThreads: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
276 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
277 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 bool _print_concurrent_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
280 VM_PrintThreads() { _out = tty; _print_concurrent_locks = PrintConcurrentLocks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
281 VM_PrintThreads(outputStream* out, bool print_concurrent_locks) { _out = out; _print_concurrent_locks = print_concurrent_locks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 VMOp_Type type() const { return VMOp_PrintThreads; }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
284 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
285 void doit_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
286 };
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 class VM_PrintJNI: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
290 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
292 VM_PrintJNI() { _out = tty; }
a61af66fc99e Initial load
duke
parents:
diff changeset
293 VM_PrintJNI(outputStream* out) { _out = out; }
a61af66fc99e Initial load
duke
parents:
diff changeset
294 VMOp_Type type() const { return VMOp_PrintJNI; }
a61af66fc99e Initial load
duke
parents:
diff changeset
295 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
296 };
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 class DeadlockCycle;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 class VM_FindDeadlocks: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
300 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
301 bool _concurrent_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
302 DeadlockCycle* _deadlocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
303 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
306 VM_FindDeadlocks(bool concurrent_locks) : _concurrent_locks(concurrent_locks), _out(NULL), _deadlocks(NULL) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
307 VM_FindDeadlocks(outputStream* st) : _concurrent_locks(true), _out(st), _deadlocks(NULL) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
308 ~VM_FindDeadlocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 DeadlockCycle* result() { return _deadlocks; };
a61af66fc99e Initial load
duke
parents:
diff changeset
311 VMOp_Type type() const { return VMOp_FindDeadlocks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
312 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
313 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
314 };
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 class ThreadDumpResult;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 class ThreadSnapshot;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 class ThreadConcurrentLocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 class VM_ThreadDump : public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
322 ThreadDumpResult* _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
323 int _num_threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 GrowableArray<instanceHandle>* _threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
325 int _max_depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
326 bool _with_locked_monitors;
a61af66fc99e Initial load
duke
parents:
diff changeset
327 bool _with_locked_synchronizers;
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 ThreadSnapshot* snapshot_thread(JavaThread* java_thread, ThreadConcurrentLocks* tcl);
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
332 VM_ThreadDump(ThreadDumpResult* result,
a61af66fc99e Initial load
duke
parents:
diff changeset
333 int max_depth, // -1 indicates entire stack
a61af66fc99e Initial load
duke
parents:
diff changeset
334 bool with_locked_monitors,
a61af66fc99e Initial load
duke
parents:
diff changeset
335 bool with_locked_synchronizers);
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 VM_ThreadDump(ThreadDumpResult* result,
a61af66fc99e Initial load
duke
parents:
diff changeset
338 GrowableArray<instanceHandle>* threads,
a61af66fc99e Initial load
duke
parents:
diff changeset
339 int num_threads, // -1 indicates entire stack
a61af66fc99e Initial load
duke
parents:
diff changeset
340 int max_depth,
a61af66fc99e Initial load
duke
parents:
diff changeset
341 bool with_locked_monitors,
a61af66fc99e Initial load
duke
parents:
diff changeset
342 bool with_locked_synchronizers);
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 VMOp_Type type() const { return VMOp_ThreadDump; }
a61af66fc99e Initial load
duke
parents:
diff changeset
345 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
346 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
347 void doit_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
348 };
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 class VM_Exit: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
353 int _exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 static volatile bool _vm_exited;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 static Thread * _shutdown_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
356 static void wait_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
357 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
358 VM_Exit(int exit_code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 _exit_code = exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361 static int wait_for_threads_in_native_to_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
362 static int set_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
363 static bool vm_exited() { return _vm_exited; }
a61af66fc99e Initial load
duke
parents:
diff changeset
364 static void block_if_vm_exited() {
a61af66fc99e Initial load
duke
parents:
diff changeset
365 if (_vm_exited) {
a61af66fc99e Initial load
duke
parents:
diff changeset
366 wait_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 VMOp_Type type() const { return VMOp_Exit; }
a61af66fc99e Initial load
duke
parents:
diff changeset
370 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
371 };