annotate src/share/vm/runtime/vm_operations.hpp @ 13212:eb03a7335eb0

Use fixed instead of virtual register for target in far foreign call, since the register allocator does not support virtual registers to be used at call sites.
author Christian Wimmer <christian.wimmer@oracle.com>
date Mon, 02 Dec 2013 14:20:32 -0800
parents cefad50507d8
children d8041d695d19
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10186
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. 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 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1202
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1202
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1202
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
25 #ifndef SHARE_VM_RUNTIME_VM_OPERATIONS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
26 #define SHARE_VM_RUNTIME_VM_OPERATIONS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
28 #include "classfile/javaClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
29 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
30 #include "oops/oop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
31 #include "runtime/thread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
32 #include "utilities/top.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
33
0
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // The following classes are used for operations
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // initiated by a Java thread but that must
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // take place in the VMThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 #define VM_OP_ENUM(type) VMOp_##type,
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // Note: When new VM_XXX comes up, add 'XXX' to the template table.
a61af66fc99e Initial load
duke
parents:
diff changeset
41 #define VM_OPS_DO(template) \
a61af66fc99e Initial load
duke
parents:
diff changeset
42 template(Dummy) \
a61af66fc99e Initial load
duke
parents:
diff changeset
43 template(ThreadStop) \
a61af66fc99e Initial load
duke
parents:
diff changeset
44 template(ThreadDump) \
a61af66fc99e Initial load
duke
parents:
diff changeset
45 template(PrintThreads) \
a61af66fc99e Initial load
duke
parents:
diff changeset
46 template(FindDeadlocks) \
a61af66fc99e Initial load
duke
parents:
diff changeset
47 template(ForceSafepoint) \
a61af66fc99e Initial load
duke
parents:
diff changeset
48 template(ForceAsyncSafepoint) \
a61af66fc99e Initial load
duke
parents:
diff changeset
49 template(Deoptimize) \
a61af66fc99e Initial load
duke
parents:
diff changeset
50 template(DeoptimizeFrame) \
a61af66fc99e Initial load
duke
parents:
diff changeset
51 template(DeoptimizeAll) \
a61af66fc99e Initial load
duke
parents:
diff changeset
52 template(ZombieAll) \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
53 template(UnlinkSymbols) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
54 template(Verify) \
a61af66fc99e Initial load
duke
parents:
diff changeset
55 template(PrintJNI) \
a61af66fc99e Initial load
duke
parents:
diff changeset
56 template(HeapDumper) \
a61af66fc99e Initial load
duke
parents:
diff changeset
57 template(DeoptimizeTheWorld) \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
58 template(CollectForMetadataAllocation) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
59 template(GC_HeapInspection) \
a61af66fc99e Initial load
duke
parents:
diff changeset
60 template(GenCollectFull) \
a61af66fc99e Initial load
duke
parents:
diff changeset
61 template(GenCollectFullConcurrent) \
a61af66fc99e Initial load
duke
parents:
diff changeset
62 template(GenCollectForAllocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
63 template(ParallelGCFailedAllocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
64 template(ParallelGCSystemGC) \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
65 template(CGC_Operation) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
66 template(CMS_Initial_Mark) \
a61af66fc99e Initial load
duke
parents:
diff changeset
67 template(CMS_Final_Remark) \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
68 template(G1CollectFull) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
69 template(G1CollectForAllocation) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
70 template(G1IncCollectionPause) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
71 template(EnableBiasedLocking) \
a61af66fc99e Initial load
duke
parents:
diff changeset
72 template(RevokeBias) \
a61af66fc99e Initial load
duke
parents:
diff changeset
73 template(BulkRevokeBias) \
a61af66fc99e Initial load
duke
parents:
diff changeset
74 template(PopulateDumpSharedSpace) \
a61af66fc99e Initial load
duke
parents:
diff changeset
75 template(JNIFunctionTableCopier) \
a61af66fc99e Initial load
duke
parents:
diff changeset
76 template(RedefineClasses) \
a61af66fc99e Initial load
duke
parents:
diff changeset
77 template(GetOwnedMonitorInfo) \
a61af66fc99e Initial load
duke
parents:
diff changeset
78 template(GetObjectMonitorUsage) \
a61af66fc99e Initial load
duke
parents:
diff changeset
79 template(GetCurrentContendedMonitor) \
a61af66fc99e Initial load
duke
parents:
diff changeset
80 template(GetStackTrace) \
a61af66fc99e Initial load
duke
parents:
diff changeset
81 template(GetMultipleStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
82 template(GetAllStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
83 template(GetThreadListStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
84 template(GetFrameCount) \
a61af66fc99e Initial load
duke
parents:
diff changeset
85 template(GetFrameLocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
86 template(ChangeBreakpoints) \
a61af66fc99e Initial load
duke
parents:
diff changeset
87 template(GetOrSetLocal) \
a61af66fc99e Initial load
duke
parents:
diff changeset
88 template(GetCurrentLocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
89 template(EnterInterpOnlyMode) \
a61af66fc99e Initial load
duke
parents:
diff changeset
90 template(ChangeSingleStep) \
a61af66fc99e Initial load
duke
parents:
diff changeset
91 template(HeapWalkOperation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
92 template(HeapIterateOperation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
93 template(ReportJavaOutOfMemory) \
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 2426
diff changeset
94 template(JFRCheckpoint) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
95 template(Exit) \
8710
9058789475af 7107135: Stack guard pages are no more protected after loading a shared library with executable stack
iklam
parents: 6725
diff changeset
96 template(LinuxDllLoad) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4800
diff changeset
98 class VM_Operation: public CHeapObj<mtInternal> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
100 enum Mode {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 _safepoint, // blocking, safepoint, vm_op C-heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _no_safepoint, // blocking, no safepoint, vm_op C-Heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
103 _concurrent, // non-blocking, no safepoint, vm_op C-Heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _async_safepoint // non-blocking, safepoint, vm_op C-Heap allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
105 };
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 enum VMOp_Type {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 VM_OPS_DO(VM_OP_ENUM)
a61af66fc99e Initial load
duke
parents:
diff changeset
109 VMOp_Terminating
a61af66fc99e Initial load
duke
parents:
diff changeset
110 };
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
113 Thread* _calling_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 ThreadPriority _priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 long _timestamp;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 VM_Operation* _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 VM_Operation* _prev;
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // The VM operation name array
a61af66fc99e Initial load
duke
parents:
diff changeset
120 static const char* _names[];
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
123 VM_Operation() { _calling_thread = NULL; _next = NULL; _prev = NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
124 virtual ~VM_Operation() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // VM operation support (used by VM thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
127 Thread* calling_thread() const { return _calling_thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
128 ThreadPriority priority() { return _priority; }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 void set_calling_thread(Thread* thread, ThreadPriority priority);
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 long timestamp() const { return _timestamp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
132 void set_timestamp(long timestamp) { _timestamp = timestamp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // Called by VM thread - does in turn invoke doit(). Do not override this
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void evaluate();
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // evaluate() is called by the VMThread and in turn calls doit().
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // If the thread invoking VMThread::execute((VM_Operation*) is a JavaThread,
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // doit_prologue() is called in that thread before transferring control to
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // the VMThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // If doit_prologue() returns true the VM operation will proceed, and
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // doit_epilogue() will be called by the JavaThread once the VM operation
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // completes. If doit_prologue() returns false the VM operation is cancelled.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 virtual void doit() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
145 virtual bool doit_prologue() { return true; };
a61af66fc99e Initial load
duke
parents:
diff changeset
146 virtual void doit_epilogue() {}; // Note: Not called if mode is: _concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Type test
a61af66fc99e Initial load
duke
parents:
diff changeset
149 virtual bool is_methodCompiler() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // Linking
a61af66fc99e Initial load
duke
parents:
diff changeset
152 VM_Operation *next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
153 VM_Operation *prev() const { return _prev; }
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void set_next(VM_Operation *next) { _next = next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
155 void set_prev(VM_Operation *prev) { _prev = prev; }
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Configuration. Override these appropriatly in subclasses.
a61af66fc99e Initial load
duke
parents:
diff changeset
158 virtual VMOp_Type type() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 virtual Mode evaluation_mode() const { return _safepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 virtual bool allow_nested_vm_operations() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 virtual bool is_cheap_allocated() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
162 virtual void oops_do(OopClosure* f) { /* do nothing */ };
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // CAUTION: <don't hang yourself with following rope>
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // If you override these methods, make sure that the evaluation
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // of these methods is race-free and non-blocking, since these
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // methods may be evaluated either by the mutators or by the
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // vm thread, either concurrently with mutators or with the mutators
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // stopped. In other words, taking locks is verboten, and if there
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // are any races in evaluating the conditions, they'd better be benign.
a61af66fc99e Initial load
duke
parents:
diff changeset
171 virtual bool evaluate_at_safepoint() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
172 return evaluation_mode() == _safepoint ||
a61af66fc99e Initial load
duke
parents:
diff changeset
173 evaluation_mode() == _async_safepoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 virtual bool evaluate_concurrently() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 return evaluation_mode() == _concurrent ||
a61af66fc99e Initial load
duke
parents:
diff changeset
177 evaluation_mode() == _async_safepoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
179
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10186
diff changeset
180 static const char* mode_to_string(Mode mode);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10186
diff changeset
181
0
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
183 void print_on_error(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
184 const char* name() const { return _names[type()]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
185 static const char* name(int type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 assert(type >= 0 && type < VMOp_Terminating, "invalid VM operation type");
a61af66fc99e Initial load
duke
parents:
diff changeset
187 return _names[type];
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
190 void print_on(outputStream* st) const { print_on_error(st); }
a61af66fc99e Initial load
duke
parents:
diff changeset
191 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
192 };
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 class VM_ThreadStop: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
196 oop _thread; // The Thread that the Throwable is thrown against
a61af66fc99e Initial load
duke
parents:
diff changeset
197 oop _throwable; // The Throwable thrown at the target Thread
a61af66fc99e Initial load
duke
parents:
diff changeset
198 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // 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
200 // VM operation is executed.
a61af66fc99e Initial load
duke
parents:
diff changeset
201 VM_ThreadStop(oop thread, oop throwable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
203 _throwable = throwable;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 VMOp_Type type() const { return VMOp_ThreadStop; }
a61af66fc99e Initial load
duke
parents:
diff changeset
206 oop target_thread() const { return _thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
207 oop throwable() const { return _throwable;}
a61af66fc99e Initial load
duke
parents:
diff changeset
208 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // We deoptimize if top-most frame is compiled - this might require a C2I adapter to be generated
a61af66fc99e Initial load
duke
parents:
diff changeset
210 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 Mode evaluation_mode() const { return _async_safepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 bool is_cheap_allocated() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
215 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 f->do_oop(&_thread); f->do_oop(&_throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
218 };
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // dummy vm op, evaluated just to force a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
221 class VM_ForceSafepoint: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
223 VM_ForceSafepoint() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
224 void doit() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
225 VMOp_Type type() const { return VMOp_ForceSafepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
226 };
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // dummy vm op, evaluated just to force a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
229 class VM_ForceAsyncSafepoint: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
231 VM_ForceAsyncSafepoint() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
232 void doit() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
233 VMOp_Type type() const { return VMOp_ForceAsyncSafepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 Mode evaluation_mode() const { return _async_safepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
235 bool is_cheap_allocated() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
236 };
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 class VM_Deoptimize: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
240 VM_Deoptimize() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
241 VMOp_Type type() const { return VMOp_Deoptimize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
243 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
244 };
a61af66fc99e Initial load
duke
parents:
diff changeset
245
1905
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
246
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
247 // Deopt helper that can deoptimize frames in threads other than the
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
248 // current thread. Only used through Deoptimization::deoptimize_frame.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
249 class VM_DeoptimizeFrame: public VM_Operation {
1905
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
250 friend class Deoptimization;
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
251
0
a61af66fc99e Initial load
duke
parents:
diff changeset
252 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
253 JavaThread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 intptr_t* _id;
5110
0ebca2e35ca5 more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4800
diff changeset
255 int _reason;
0ebca2e35ca5 more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4800
diff changeset
256 VM_DeoptimizeFrame(JavaThread* thread, intptr_t* id, int reason);
1905
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
257
0
a61af66fc99e Initial load
duke
parents:
diff changeset
258 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
259 VMOp_Type type() const { return VMOp_DeoptimizeFrame; }
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
a61af66fc99e Initial load
duke
parents:
diff changeset
264 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
265 class VM_DeoptimizeAll: 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_DeoptimizeAll() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
270 VMOp_Type type() const { return VMOp_DeoptimizeAll; }
a61af66fc99e Initial load
duke
parents:
diff changeset
271 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
272 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
273 };
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 class VM_ZombieAll: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
277 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
278 VM_ZombieAll() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
279 VMOp_Type type() const { return VMOp_ZombieAll; }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
281 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 };
a61af66fc99e Initial load
duke
parents:
diff changeset
283 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
284
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
285 class VM_UnlinkSymbols: public VM_Operation {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
286 public:
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
287 VM_UnlinkSymbols() {}
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
288 VMOp_Type type() const { return VMOp_UnlinkSymbols; }
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
289 void doit();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
290 bool allow_nested_vm_operations() const { return true; }
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
291 };
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
292
0
a61af66fc99e Initial load
duke
parents:
diff changeset
293 class VM_Verify: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 private:
9071
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8710
diff changeset
295 bool _silent;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
296 public:
10186
b06ac540229e 8013132: Add a flag to turn off the output of the verbose verification code
stefank
parents: 9071
diff changeset
297 VM_Verify(bool silent = VerifySilently) : _silent(silent) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
298 VMOp_Type type() const { return VMOp_Verify; }
a61af66fc99e Initial load
duke
parents:
diff changeset
299 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
300 };
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 class VM_PrintThreads: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
305 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 bool _print_concurrent_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
308 VM_PrintThreads() { _out = tty; _print_concurrent_locks = PrintConcurrentLocks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
309 VM_PrintThreads(outputStream* out, bool print_concurrent_locks) { _out = out; _print_concurrent_locks = print_concurrent_locks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
310 VMOp_Type type() const { return VMOp_PrintThreads; }
a61af66fc99e Initial load
duke
parents:
diff changeset
311 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
312 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
313 void doit_epilogue();
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 VM_PrintJNI: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
318 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
319 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
320 VM_PrintJNI() { _out = tty; }
a61af66fc99e Initial load
duke
parents:
diff changeset
321 VM_PrintJNI(outputStream* out) { _out = out; }
a61af66fc99e Initial load
duke
parents:
diff changeset
322 VMOp_Type type() const { return VMOp_PrintJNI; }
a61af66fc99e Initial load
duke
parents:
diff changeset
323 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
324 };
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 class DeadlockCycle;
a61af66fc99e Initial load
duke
parents:
diff changeset
327 class VM_FindDeadlocks: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
329 bool _concurrent_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 DeadlockCycle* _deadlocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
331 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
334 VM_FindDeadlocks(bool concurrent_locks) : _concurrent_locks(concurrent_locks), _out(NULL), _deadlocks(NULL) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
335 VM_FindDeadlocks(outputStream* st) : _concurrent_locks(true), _out(st), _deadlocks(NULL) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
336 ~VM_FindDeadlocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 DeadlockCycle* result() { return _deadlocks; };
a61af66fc99e Initial load
duke
parents:
diff changeset
339 VMOp_Type type() const { return VMOp_FindDeadlocks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
340 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
341 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
342 };
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 class ThreadDumpResult;
a61af66fc99e Initial load
duke
parents:
diff changeset
345 class ThreadSnapshot;
a61af66fc99e Initial load
duke
parents:
diff changeset
346 class ThreadConcurrentLocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 class VM_ThreadDump : public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
349 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
350 ThreadDumpResult* _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
351 int _num_threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 GrowableArray<instanceHandle>* _threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 int _max_depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 bool _with_locked_monitors;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 bool _with_locked_synchronizers;
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 ThreadSnapshot* snapshot_thread(JavaThread* java_thread, ThreadConcurrentLocks* tcl);
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
360 VM_ThreadDump(ThreadDumpResult* result,
a61af66fc99e Initial load
duke
parents:
diff changeset
361 int max_depth, // -1 indicates entire stack
a61af66fc99e Initial load
duke
parents:
diff changeset
362 bool with_locked_monitors,
a61af66fc99e Initial load
duke
parents:
diff changeset
363 bool with_locked_synchronizers);
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 VM_ThreadDump(ThreadDumpResult* result,
a61af66fc99e Initial load
duke
parents:
diff changeset
366 GrowableArray<instanceHandle>* threads,
a61af66fc99e Initial load
duke
parents:
diff changeset
367 int num_threads, // -1 indicates entire stack
a61af66fc99e Initial load
duke
parents:
diff changeset
368 int max_depth,
a61af66fc99e Initial load
duke
parents:
diff changeset
369 bool with_locked_monitors,
a61af66fc99e Initial load
duke
parents:
diff changeset
370 bool with_locked_synchronizers);
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 VMOp_Type type() const { return VMOp_ThreadDump; }
a61af66fc99e Initial load
duke
parents:
diff changeset
373 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
374 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
375 void doit_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
376 };
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 class VM_Exit: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
380 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
381 int _exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 static volatile bool _vm_exited;
a61af66fc99e Initial load
duke
parents:
diff changeset
383 static Thread * _shutdown_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
384 static void wait_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
385 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
386 VM_Exit(int exit_code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 _exit_code = exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
389 static int wait_for_threads_in_native_to_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
390 static int set_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
391 static bool vm_exited() { return _vm_exited; }
a61af66fc99e Initial load
duke
parents:
diff changeset
392 static void block_if_vm_exited() {
a61af66fc99e Initial load
duke
parents:
diff changeset
393 if (_vm_exited) {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 wait_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
397 VMOp_Type type() const { return VMOp_Exit; }
a61af66fc99e Initial load
duke
parents:
diff changeset
398 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
399 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
400
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
401 #endif // SHARE_VM_RUNTIME_VM_OPERATIONS_HPP