annotate src/share/vm/runtime/vm_operations.hpp @ 3979:4dfb2df418f2

6484982: G1: process references during evacuation pauses Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate. Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
author johnc
date Thu, 22 Sep 2011 10:57:37 -0700
parents 1d1603768966
children 94ec88ca68e2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2426
1d1603768966 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 2177
diff changeset
2 * Copyright (c) 1997, 2011, 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) \
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
54 template(HandleFullCodeCache) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
55 template(Verify) \
a61af66fc99e Initial load
duke
parents:
diff changeset
56 template(PrintJNI) \
a61af66fc99e Initial load
duke
parents:
diff changeset
57 template(HeapDumper) \
a61af66fc99e Initial load
duke
parents:
diff changeset
58 template(DeoptimizeTheWorld) \
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) \
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
63 template(GenCollectForPermanentAllocation) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
64 template(ParallelGCFailedAllocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
65 template(ParallelGCFailedPermanentAllocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
66 template(ParallelGCSystemGC) \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
67 template(CGC_Operation) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
68 template(CMS_Initial_Mark) \
a61af66fc99e Initial load
duke
parents:
diff changeset
69 template(CMS_Final_Remark) \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
70 template(G1CollectFull) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
71 template(G1CollectForAllocation) \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 139
diff changeset
72 template(G1IncCollectionPause) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
73 template(EnableBiasedLocking) \
a61af66fc99e Initial load
duke
parents:
diff changeset
74 template(RevokeBias) \
a61af66fc99e Initial load
duke
parents:
diff changeset
75 template(BulkRevokeBias) \
a61af66fc99e Initial load
duke
parents:
diff changeset
76 template(PopulateDumpSharedSpace) \
a61af66fc99e Initial load
duke
parents:
diff changeset
77 template(JNIFunctionTableCopier) \
a61af66fc99e Initial load
duke
parents:
diff changeset
78 template(RedefineClasses) \
a61af66fc99e Initial load
duke
parents:
diff changeset
79 template(GetOwnedMonitorInfo) \
a61af66fc99e Initial load
duke
parents:
diff changeset
80 template(GetObjectMonitorUsage) \
a61af66fc99e Initial load
duke
parents:
diff changeset
81 template(GetCurrentContendedMonitor) \
a61af66fc99e Initial load
duke
parents:
diff changeset
82 template(GetStackTrace) \
a61af66fc99e Initial load
duke
parents:
diff changeset
83 template(GetMultipleStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
84 template(GetAllStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
85 template(GetThreadListStackTraces) \
a61af66fc99e Initial load
duke
parents:
diff changeset
86 template(GetFrameCount) \
a61af66fc99e Initial load
duke
parents:
diff changeset
87 template(GetFrameLocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
88 template(ChangeBreakpoints) \
a61af66fc99e Initial load
duke
parents:
diff changeset
89 template(GetOrSetLocal) \
a61af66fc99e Initial load
duke
parents:
diff changeset
90 template(GetCurrentLocation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
91 template(EnterInterpOnlyMode) \
a61af66fc99e Initial load
duke
parents:
diff changeset
92 template(ChangeSingleStep) \
a61af66fc99e Initial load
duke
parents:
diff changeset
93 template(HeapWalkOperation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
94 template(HeapIterateOperation) \
a61af66fc99e Initial load
duke
parents:
diff changeset
95 template(ReportJavaOutOfMemory) \
a61af66fc99e Initial load
duke
parents:
diff changeset
96 template(Exit) \
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 class VM_Operation: public CHeapObj {
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
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void print_on_error(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
182 const char* name() const { return _names[type()]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
183 static const char* name(int type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
184 assert(type >= 0 && type < VMOp_Terminating, "invalid VM operation type");
a61af66fc99e Initial load
duke
parents:
diff changeset
185 return _names[type];
a61af66fc99e Initial load
duke
parents:
diff changeset
186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
187 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
188 void print_on(outputStream* st) const { print_on_error(st); }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
190 };
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 class VM_ThreadStop: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
194 oop _thread; // The Thread that the Throwable is thrown against
a61af66fc99e Initial load
duke
parents:
diff changeset
195 oop _throwable; // The Throwable thrown at the target Thread
a61af66fc99e Initial load
duke
parents:
diff changeset
196 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // 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
198 // VM operation is executed.
a61af66fc99e Initial load
duke
parents:
diff changeset
199 VM_ThreadStop(oop thread, oop throwable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 _throwable = throwable;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
203 VMOp_Type type() const { return VMOp_ThreadStop; }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 oop target_thread() const { return _thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 oop throwable() const { return _throwable;}
a61af66fc99e Initial load
duke
parents:
diff changeset
206 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // We deoptimize if top-most frame is compiled - this might require a C2I adapter to be generated
a61af66fc99e Initial load
duke
parents:
diff changeset
208 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 Mode evaluation_mode() const { return _async_safepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
210 bool is_cheap_allocated() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
213 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 f->do_oop(&_thread); f->do_oop(&_throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 };
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // dummy vm op, evaluated just to force a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
219 class VM_ForceSafepoint: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
221 VM_ForceSafepoint() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
222 void doit() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
223 VMOp_Type type() const { return VMOp_ForceSafepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
224 };
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // dummy vm op, evaluated just to force a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
227 class VM_ForceAsyncSafepoint: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
229 VM_ForceAsyncSafepoint() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
230 void doit() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
231 VMOp_Type type() const { return VMOp_ForceAsyncSafepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 Mode evaluation_mode() const { return _async_safepoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
233 bool is_cheap_allocated() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 };
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 class VM_Deoptimize: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
238 VM_Deoptimize() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
239 VMOp_Type type() const { return VMOp_Deoptimize; }
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
1905
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
244
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
245 // 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
246 // current thread. Only used through Deoptimization::deoptimize_frame.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
247 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
248 friend class Deoptimization;
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
249
0
a61af66fc99e Initial load
duke
parents:
diff changeset
250 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
251 JavaThread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
252 intptr_t* _id;
1905
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
253 VM_DeoptimizeFrame(JavaThread* thread, intptr_t* id);
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
254
0
a61af66fc99e Initial load
duke
parents:
diff changeset
255 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
256 VMOp_Type type() const { return VMOp_DeoptimizeFrame; }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
258 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
259 };
a61af66fc99e Initial load
duke
parents:
diff changeset
260
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
261 class VM_HandleFullCodeCache: public VM_Operation {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
262 private:
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
263 bool _is_full;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
264 public:
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
265 VM_HandleFullCodeCache(bool is_full) { _is_full = is_full; }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
266 VMOp_Type type() const { return VMOp_HandleFullCodeCache; }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
267 void doit();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
268 bool allow_nested_vm_operations() const { return true; }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
269 };
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 844
diff changeset
270
0
a61af66fc99e Initial load
duke
parents:
diff changeset
271 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
272 class VM_DeoptimizeAll: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
274 KlassHandle _dependee;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
276 VM_DeoptimizeAll() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
277 VMOp_Type type() const { return VMOp_DeoptimizeAll; }
a61af66fc99e Initial load
duke
parents:
diff changeset
278 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
279 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 };
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 class VM_ZombieAll: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
284 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
285 VM_ZombieAll() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
286 VMOp_Type type() const { return VMOp_ZombieAll; }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
288 bool allow_nested_vm_operations() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 };
a61af66fc99e Initial load
duke
parents:
diff changeset
290 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
291
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
292 class VM_UnlinkSymbols: public VM_Operation {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
293 public:
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
294 VM_UnlinkSymbols() {}
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
295 VMOp_Type type() const { return VMOp_UnlinkSymbols; }
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
296 void doit();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
297 bool allow_nested_vm_operations() const { return true; }
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
298 };
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
299
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 class VM_Verify: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
302 KlassHandle _dependee;
a61af66fc99e Initial load
duke
parents:
diff changeset
303 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
304 VM_Verify() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
305 VMOp_Type type() const { return VMOp_Verify; }
a61af66fc99e Initial load
duke
parents:
diff changeset
306 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
307 };
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 class VM_PrintThreads: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
312 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
313 bool _print_concurrent_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
314 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
315 VM_PrintThreads() { _out = tty; _print_concurrent_locks = PrintConcurrentLocks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
316 VM_PrintThreads(outputStream* out, bool print_concurrent_locks) { _out = out; _print_concurrent_locks = print_concurrent_locks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 VMOp_Type type() const { return VMOp_PrintThreads; }
a61af66fc99e Initial load
duke
parents:
diff changeset
318 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
319 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
320 void doit_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
321 };
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 class VM_PrintJNI: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
324 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
325 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
326 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
327 VM_PrintJNI() { _out = tty; }
a61af66fc99e Initial load
duke
parents:
diff changeset
328 VM_PrintJNI(outputStream* out) { _out = out; }
a61af66fc99e Initial load
duke
parents:
diff changeset
329 VMOp_Type type() const { return VMOp_PrintJNI; }
a61af66fc99e Initial load
duke
parents:
diff changeset
330 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
331 };
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 class DeadlockCycle;
a61af66fc99e Initial load
duke
parents:
diff changeset
334 class VM_FindDeadlocks: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
335 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
336 bool _concurrent_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
337 DeadlockCycle* _deadlocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 outputStream* _out;
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
341 VM_FindDeadlocks(bool concurrent_locks) : _concurrent_locks(concurrent_locks), _out(NULL), _deadlocks(NULL) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
342 VM_FindDeadlocks(outputStream* st) : _concurrent_locks(true), _out(st), _deadlocks(NULL) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
343 ~VM_FindDeadlocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 DeadlockCycle* result() { return _deadlocks; };
a61af66fc99e Initial load
duke
parents:
diff changeset
346 VMOp_Type type() const { return VMOp_FindDeadlocks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
347 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
348 bool doit_prologue();
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 ThreadDumpResult;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 class ThreadSnapshot;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 class ThreadConcurrentLocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 class VM_ThreadDump : public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
356 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
357 ThreadDumpResult* _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
358 int _num_threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
359 GrowableArray<instanceHandle>* _threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 int _max_depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
361 bool _with_locked_monitors;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 bool _with_locked_synchronizers;
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 ThreadSnapshot* snapshot_thread(JavaThread* java_thread, ThreadConcurrentLocks* tcl);
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
367 VM_ThreadDump(ThreadDumpResult* result,
a61af66fc99e Initial load
duke
parents:
diff changeset
368 int max_depth, // -1 indicates entire stack
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 VM_ThreadDump(ThreadDumpResult* result,
a61af66fc99e Initial load
duke
parents:
diff changeset
373 GrowableArray<instanceHandle>* threads,
a61af66fc99e Initial load
duke
parents:
diff changeset
374 int num_threads, // -1 indicates entire stack
a61af66fc99e Initial load
duke
parents:
diff changeset
375 int max_depth,
a61af66fc99e Initial load
duke
parents:
diff changeset
376 bool with_locked_monitors,
a61af66fc99e Initial load
duke
parents:
diff changeset
377 bool with_locked_synchronizers);
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 VMOp_Type type() const { return VMOp_ThreadDump; }
a61af66fc99e Initial load
duke
parents:
diff changeset
380 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
381 bool doit_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
382 void doit_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
383 };
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 class VM_Exit: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
388 int _exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
389 static volatile bool _vm_exited;
a61af66fc99e Initial load
duke
parents:
diff changeset
390 static Thread * _shutdown_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
391 static void wait_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
392 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
393 VM_Exit(int exit_code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 _exit_code = exit_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
396 static int wait_for_threads_in_native_to_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 static int set_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
398 static bool vm_exited() { return _vm_exited; }
a61af66fc99e Initial load
duke
parents:
diff changeset
399 static void block_if_vm_exited() {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 if (_vm_exited) {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 wait_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404 VMOp_Type type() const { return VMOp_Exit; }
a61af66fc99e Initial load
duke
parents:
diff changeset
405 void doit();
a61af66fc99e Initial load
duke
parents:
diff changeset
406 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
407
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
408 #endif // SHARE_VM_RUNTIME_VM_OPERATIONS_HPP