annotate src/share/vm/runtime/vmThread.cpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents da91efe96a93
children d0aa87f04bd5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4006
diff changeset
2 * Copyright (c) 1998, 2012, 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: 1490
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
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: 1490
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: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "compiler/compileBroker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "gc_interface/collectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "memory/resourceArea.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6008
diff changeset
29 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "runtime/os.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "runtime/vmThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "runtime/vm_operations.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #include "services/runtimeService.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37 #include "utilities/dtrace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
39 #include "utilities/xmlstream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
40 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
41 # include "thread_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
42 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
43 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
44 # include "thread_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
45 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
46 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
47 # include "thread_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
48 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3293
diff changeset
49 #ifdef TARGET_OS_FAMILY_bsd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3293
diff changeset
50 # include "thread_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3293
diff changeset
51 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
53 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
54 HS_DTRACE_PROBE_DECL3(hotspot, vmops__request, char *, uintptr_t, int);
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
55 HS_DTRACE_PROBE_DECL3(hotspot, vmops__begin, char *, uintptr_t, int);
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
56 HS_DTRACE_PROBE_DECL3(hotspot, vmops__end, char *, uintptr_t, int);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
57 #endif /* !USDT2 */
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
58
0
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // Dummy VM operation to act as first element in our circular double-linked list
a61af66fc99e Initial load
duke
parents:
diff changeset
60 class VM_Dummy: public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
61 VMOp_Type type() const { return VMOp_Dummy; }
a61af66fc99e Initial load
duke
parents:
diff changeset
62 void doit() {};
a61af66fc99e Initial load
duke
parents:
diff changeset
63 };
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 VMOperationQueue::VMOperationQueue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // The queue is a circular doubled-linked list, which always contains
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // one element (i.e., one element means empty).
a61af66fc99e Initial load
duke
parents:
diff changeset
68 for(int i = 0; i < nof_priorities; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
69 _queue_length[i] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 _queue_counter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 _queue[i] = new VM_Dummy();
a61af66fc99e Initial load
duke
parents:
diff changeset
72 _queue[i]->set_next(_queue[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
73 _queue[i]->set_prev(_queue[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 }
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _drain_list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 bool VMOperationQueue::queue_empty(int prio) {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // It is empty if there is exactly one element
a61af66fc99e Initial load
duke
parents:
diff changeset
81 bool empty = (_queue[prio] == _queue[prio]->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
82 assert( (_queue_length[prio] == 0 && empty) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
83 (_queue_length[prio] > 0 && !empty), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
84 return _queue_length[prio] == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 }
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // Inserts an element to the right of the q element
a61af66fc99e Initial load
duke
parents:
diff changeset
88 void VMOperationQueue::insert(VM_Operation* q, VM_Operation* n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 assert(q->next()->prev() == q && q->prev()->next() == q, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
90 n->set_prev(q);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 n->set_next(q->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
92 q->next()->set_prev(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 q->set_next(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 void VMOperationQueue::queue_add_front(int prio, VM_Operation *op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 _queue_length[prio]++;
a61af66fc99e Initial load
duke
parents:
diff changeset
98 insert(_queue[prio]->next(), op);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 void VMOperationQueue::queue_add_back(int prio, VM_Operation *op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _queue_length[prio]++;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 insert(_queue[prio]->prev(), op);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 void VMOperationQueue::unlink(VM_Operation* q) {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 assert(q->next()->prev() == q && q->prev()->next() == q, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
109 q->prev()->set_next(q->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
110 q->next()->set_prev(q->prev());
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 VM_Operation* VMOperationQueue::queue_remove_front(int prio) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 if (queue_empty(prio)) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 assert(_queue_length[prio] >= 0, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
116 _queue_length[prio]--;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 VM_Operation* r = _queue[prio]->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
118 assert(r != _queue[prio], "cannot remove base element");
a61af66fc99e Initial load
duke
parents:
diff changeset
119 unlink(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 return r;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 VM_Operation* VMOperationQueue::queue_drain(int prio) {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 if (queue_empty(prio)) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 DEBUG_ONLY(int length = _queue_length[prio];);
a61af66fc99e Initial load
duke
parents:
diff changeset
126 assert(length >= 0, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
127 _queue_length[prio] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 VM_Operation* r = _queue[prio]->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
129 assert(r != _queue[prio], "cannot remove base element");
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // remove links to base element from head and tail
a61af66fc99e Initial load
duke
parents:
diff changeset
131 r->set_prev(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 _queue[prio]->prev()->set_next(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // restore queue to empty state
a61af66fc99e Initial load
duke
parents:
diff changeset
134 _queue[prio]->set_next(_queue[prio]);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 _queue[prio]->set_prev(_queue[prio]);
1489
cff162798819 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 1324
diff changeset
136 assert(queue_empty(prio), "drain corrupted queue");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
137 #ifdef DEBUG
a61af66fc99e Initial load
duke
parents:
diff changeset
138 int len = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 VM_Operation* cur;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 for(cur = r; cur != NULL; cur=cur->next()) len++;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 assert(len == length, "drain lost some ops");
a61af66fc99e Initial load
duke
parents:
diff changeset
142 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
143 return r;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 void VMOperationQueue::queue_oops_do(int queue, OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
147 VM_Operation* cur = _queue[queue];
a61af66fc99e Initial load
duke
parents:
diff changeset
148 cur = cur->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
149 while (cur != _queue[queue]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 cur->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 cur = cur->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 void VMOperationQueue::drain_list_oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
156 VM_Operation* cur = _drain_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
157 while (cur != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 cur->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 cur = cur->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 //-----------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // High-level interface
a61af66fc99e Initial load
duke
parents:
diff changeset
165 bool VMOperationQueue::add(VM_Operation *op) {
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
166
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
167 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
168 HS_DTRACE_PROBE3(hotspot, vmops__request, op->name(), strlen(op->name()),
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
169 op->evaluation_mode());
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
170 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
171 HOTSPOT_VMOPS_REQUEST(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
172 (char *) op->name(), strlen(op->name()),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
173 op->evaluation_mode());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
174 #endif /* USDT2 */
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
175
0
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // Encapsulates VM queue policy. Currently, that
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // only involves putting them on the right list
a61af66fc99e Initial load
duke
parents:
diff changeset
178 if (op->evaluate_at_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 queue_add_back(SafepointPriority, op);
a61af66fc99e Initial load
duke
parents:
diff changeset
180 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 queue_add_back(MediumPriority, op);
a61af66fc99e Initial load
duke
parents:
diff changeset
184 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 VM_Operation* VMOperationQueue::remove_next() {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Assuming VMOperation queue is two-level priority queue. If there are
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // more than two priorities, we need a different scheduling algorithm.
a61af66fc99e Initial load
duke
parents:
diff changeset
190 assert(SafepointPriority == 0 && MediumPriority == 1 && nof_priorities == 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
191 "current algorithm does not work");
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // simple counter based scheduling to prevent starvation of lower priority
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // queue. -- see 4390175
a61af66fc99e Initial load
duke
parents:
diff changeset
195 int high_prio, low_prio;
a61af66fc99e Initial load
duke
parents:
diff changeset
196 if (_queue_counter++ < 10) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 high_prio = SafepointPriority;
a61af66fc99e Initial load
duke
parents:
diff changeset
198 low_prio = MediumPriority;
a61af66fc99e Initial load
duke
parents:
diff changeset
199 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 _queue_counter = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 high_prio = MediumPriority;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 low_prio = SafepointPriority;
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 return queue_remove_front(queue_empty(high_prio) ? low_prio : high_prio);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 void VMOperationQueue::oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 for(int i = 0; i < nof_priorities; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 queue_oops_do(i, f);
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 drain_list_oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 //------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // Implementation of VMThread stuff
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 bool VMThread::_should_terminate = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 bool VMThread::_terminated = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
221 Monitor* VMThread::_terminate_lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
222 VMThread* VMThread::_vm_thread = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 VM_Operation* VMThread::_cur_vm_operation = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 VMOperationQueue* VMThread::_vm_queue = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 PerfCounter* VMThread::_perf_accumulated_vm_operation_time = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 void VMThread::create() {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 assert(vm_thread() == NULL, "we can only allocate one VMThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
230 _vm_thread = new VMThread();
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Create VM operation queue
a61af66fc99e Initial load
duke
parents:
diff changeset
233 _vm_queue = new VMOperationQueue();
a61af66fc99e Initial load
duke
parents:
diff changeset
234 guarantee(_vm_queue != NULL, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 _terminate_lock = new Monitor(Mutex::safepoint, "VMThread::_terminate_lock", true);
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // jvmstat performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
240 Thread* THREAD = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
241 _perf_accumulated_vm_operation_time =
a61af66fc99e Initial load
duke
parents:
diff changeset
242 PerfDataManager::create_counter(SUN_THREADS, "vmOperationTime",
a61af66fc99e Initial load
duke
parents:
diff changeset
243 PerfData::U_Ticks, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247
1119
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
248 VMThread::VMThread() : NamedThread() {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 989
diff changeset
249 set_name("VM Thread");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 void VMThread::destroy() {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 if (_vm_thread != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 delete _vm_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 _vm_thread = NULL; // VM thread is gone
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 void VMThread::run() {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 assert(this == vm_thread(), "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 this->initialize_thread_local_storage();
a61af66fc99e Initial load
duke
parents:
diff changeset
263 this->record_stack_base_and_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // Notify_lock wait checks on active_handles() to rewait in
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // case of spurious wakeup, it should wait on the last
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // value set prior to the notify
a61af66fc99e Initial load
duke
parents:
diff changeset
267 this->set_active_handles(JNIHandleBlock::allocate_block());
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 MutexLocker ml(Notify_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
271 Notify_lock->notify();
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // Notify_lock is destroyed by Threads::create_vm()
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 int prio = (VMThreadPriority == -1)
a61af66fc99e Initial load
duke
parents:
diff changeset
276 ? os::java_to_os_priority[NearMaxPriority]
a61af66fc99e Initial load
duke
parents:
diff changeset
277 : VMThreadPriority;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // Note that I cannot call os::set_priority because it expects Java
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // priorities and I am *explicitly* using OS priorities so that it's
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // possible to set the VM thread priority higher than any Java thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
281 os::set_native_priority( this, prio );
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // Wait for VM_Operations until termination
a61af66fc99e Initial load
duke
parents:
diff changeset
284 this->loop();
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // Note the intention to exit before safepointing.
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // 6295565 This has the effect of waiting for any large tty
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // outputs to finish.
a61af66fc99e Initial load
duke
parents:
diff changeset
289 if (xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 xtty->begin_elem("destroy_vm");
a61af66fc99e Initial load
duke
parents:
diff changeset
292 xtty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
293 xtty->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
294 assert(should_terminate(), "termination flag must be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // 4526887 let VM thread exit at Safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
298 SafepointSynchronize::begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 if (VerifyBeforeExit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 HandleMark hm(VMThread::vm_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // Among other things, this ensures that Eden top is correct.
a61af66fc99e Initial load
duke
parents:
diff changeset
303 Universe::heap()->prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
304 os::check_heap();
3293
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 1972
diff changeset
305 // Silent verification so as not to pollute normal output,
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 1972
diff changeset
306 // unless we really asked for it.
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4006
diff changeset
307 Universe::verify(!(PrintGCDetails || Verbose));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 CompileBroker::set_should_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // wait for threads (compiler threads or daemon threads) in the
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // _thread_in_native state to block.
a61af66fc99e Initial load
duke
parents:
diff changeset
314 VM_Exit::wait_for_threads_in_native_to_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // signal other threads that VM process is gone
a61af66fc99e Initial load
duke
parents:
diff changeset
317 {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Note: we must have the _no_safepoint_check_flag. Mutex::lock() allows
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // VM thread to enter any lock at Safepoint as long as its _owner is NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // If that happens after _terminate_lock->wait() has unset _owner
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // but before it actually drops the lock and waits, the notification below
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // may get lost and we will have a hang. To avoid this, we need to use
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // Mutex::lock_without_safepoint_check().
a61af66fc99e Initial load
duke
parents:
diff changeset
324 MutexLockerEx ml(_terminate_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 _terminated = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
326 _terminate_lock->notify();
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // Deletion must be done synchronously by the JNI DestroyJavaVM thread
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // so that the VMThread deletion completes before the main thread frees
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // up the CodeHeap.
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // Notify the VMThread that the last non-daemon JavaThread has terminated,
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // and wait until operation is performed.
a61af66fc99e Initial load
duke
parents:
diff changeset
338 void VMThread::wait_for_vm_thread_exit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 { MutexLocker mu(VMOperationQueue_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
340 _should_terminate = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
341 VMOperationQueue_lock->notify();
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // Note: VM thread leaves at Safepoint. We are not stopped by Safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // because this thread has been removed from the threads list. But anything
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // that could get blocked by Safepoint should not be used after this point,
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // otherwise we will hang, since there is no one can end the safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // Wait until VM thread is terminated
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // Note: it should be OK to use Terminator_lock here. But this is called
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // at a very delicate time (VM shutdown) and we are operating in non- VM
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // thread at Safepoint. It's safer to not share lock with other threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
353 { MutexLockerEx ml(_terminate_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 while(!VMThread::is_terminated()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
355 _terminate_lock->wait(Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
358 }
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360 void VMThread::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
361 st->print("\"%s\" ", name());
a61af66fc99e Initial load
duke
parents:
diff changeset
362 Thread::print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
363 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 void VMThread::evaluate_operation(VM_Operation* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 {
a61af66fc99e Initial load
duke
parents:
diff changeset
370 PerfTraceTime vm_op_timer(perf_accumulated_vm_operation_time());
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
371 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
372 HS_DTRACE_PROBE3(hotspot, vmops__begin, op->name(), strlen(op->name()),
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
373 op->evaluation_mode());
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
374 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
375 HOTSPOT_VMOPS_BEGIN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
376 (char *) op->name(), strlen(op->name()),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
377 op->evaluation_mode());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
378 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
379 op->evaluate();
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
380 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
381 HS_DTRACE_PROBE3(hotspot, vmops__end, op->name(), strlen(op->name()),
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1260
diff changeset
382 op->evaluation_mode());
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
383 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
384 HOTSPOT_VMOPS_END(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
385 (char *) op->name(), strlen(op->name()),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
386 op->evaluation_mode());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
387 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // Last access of info in _cur_vm_operation!
a61af66fc99e Initial load
duke
parents:
diff changeset
391 bool c_heap_allocated = op->is_cheap_allocated();
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // Mark as completed
a61af66fc99e Initial load
duke
parents:
diff changeset
394 if (!op->evaluate_concurrently()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
395 op->calling_thread()->increment_vm_operation_completed_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // It is unsafe to access the _cur_vm_operation after the 'increment_vm_operation_completed_count' call,
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // since if it is stack allocated the calling thread might have deallocated
a61af66fc99e Initial load
duke
parents:
diff changeset
399 if (c_heap_allocated) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 delete _cur_vm_operation;
a61af66fc99e Initial load
duke
parents:
diff changeset
401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 void VMThread::loop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 assert(_cur_vm_operation == NULL, "no current one should be executing");
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 while(true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
409 VM_Operation* safepoint_ops = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
410 //
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // Wait for VM operation
a61af66fc99e Initial load
duke
parents:
diff changeset
412 //
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // use no_safepoint_check to get lock without attempting to "sneak"
a61af66fc99e Initial load
duke
parents:
diff changeset
414 { MutexLockerEx mu_queue(VMOperationQueue_lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
415 Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // Look for new operation
a61af66fc99e Initial load
duke
parents:
diff changeset
418 assert(_cur_vm_operation == NULL, "no current one should be executing");
a61af66fc99e Initial load
duke
parents:
diff changeset
419 _cur_vm_operation = _vm_queue->remove_next();
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // Stall time tracking code
a61af66fc99e Initial load
duke
parents:
diff changeset
422 if (PrintVMQWaitTime && _cur_vm_operation != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
423 !_cur_vm_operation->evaluate_concurrently()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
424 long stall = os::javaTimeMillis() - _cur_vm_operation->timestamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
425 if (stall > 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
426 tty->print_cr("%s stall: %Ld", _cur_vm_operation->name(), stall);
a61af66fc99e Initial load
duke
parents:
diff changeset
427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 while (!should_terminate() && _cur_vm_operation == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // wait with a timeout to guarantee safepoints at regular intervals
a61af66fc99e Initial load
duke
parents:
diff changeset
431 bool timedout =
a61af66fc99e Initial load
duke
parents:
diff changeset
432 VMOperationQueue_lock->wait(Mutex::_no_safepoint_check_flag,
a61af66fc99e Initial load
duke
parents:
diff changeset
433 GuaranteedSafepointInterval);
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // Support for self destruction
a61af66fc99e Initial load
duke
parents:
diff changeset
436 if ((SelfDestructTimer != 0) && !is_error_reported() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
437 (os::elapsedTime() > SelfDestructTimer * 60)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
438 tty->print_cr("VM self-destructed");
a61af66fc99e Initial load
duke
parents:
diff changeset
439 exit(-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 if (timedout && (SafepointALot ||
a61af66fc99e Initial load
duke
parents:
diff changeset
443 SafepointSynchronize::is_cleanup_needed())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
444 MutexUnlockerEx mul(VMOperationQueue_lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
445 Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // Force a safepoint since we have not had one for at least
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // 'GuaranteedSafepointInterval' milliseconds. This will run all
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // the clean-up processing that needs to be done regularly at a
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
450 SafepointSynchronize::begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
451 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
452 if (GCALotAtAllSafepoints) InterfaceSupport::check_gc_alot();
a61af66fc99e Initial load
duke
parents:
diff changeset
453 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
454 SafepointSynchronize::end();
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456 _cur_vm_operation = _vm_queue->remove_next();
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // If we are at a safepoint we will evaluate all the operations that
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // follow that also require a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
460 if (_cur_vm_operation != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
461 _cur_vm_operation->evaluate_at_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
462 safepoint_ops = _vm_queue->drain_at_safepoint_priority();
a61af66fc99e Initial load
duke
parents:
diff changeset
463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 if (should_terminate()) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
467 } // Release mu_queue_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 //
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // Execute VM operation
a61af66fc99e Initial load
duke
parents:
diff changeset
471 //
a61af66fc99e Initial load
duke
parents:
diff changeset
472 { HandleMark hm(VMThread::vm_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 EventMark em("Executing VM operation: %s", vm_operation()->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
475 assert(_cur_vm_operation != NULL, "we should have found an operation to execute");
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // Give the VM thread an extra quantum. Jobs tend to be bursty and this
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // helps the VM thread to finish up the job.
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // FIXME: When this is enabled and there are many threads, this can degrade
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // performance significantly.
a61af66fc99e Initial load
duke
parents:
diff changeset
481 if( VMThreadHintNoPreempt )
a61af66fc99e Initial load
duke
parents:
diff changeset
482 os::hint_no_preempt();
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // If we are at a safepoint we will evaluate all the operations that
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // follow that also require a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
486 if (_cur_vm_operation->evaluate_at_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 _vm_queue->set_drain_list(safepoint_ops); // ensure ops can be scanned
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 SafepointSynchronize::begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
491 evaluate_operation(_cur_vm_operation);
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // now process all queued safepoint ops, iteratively draining
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // the queue until there are none left
a61af66fc99e Initial load
duke
parents:
diff changeset
494 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
495 _cur_vm_operation = safepoint_ops;
a61af66fc99e Initial load
duke
parents:
diff changeset
496 if (_cur_vm_operation != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
498 // evaluate_operation deletes the op object so we have
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // to grab the next op now
a61af66fc99e Initial load
duke
parents:
diff changeset
500 VM_Operation* next = _cur_vm_operation->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
501 _vm_queue->set_drain_list(next);
a61af66fc99e Initial load
duke
parents:
diff changeset
502 evaluate_operation(_cur_vm_operation);
a61af66fc99e Initial load
duke
parents:
diff changeset
503 _cur_vm_operation = next;
a61af66fc99e Initial load
duke
parents:
diff changeset
504 if (PrintSafepointStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
505 SafepointSynchronize::inc_vmop_coalesced_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507 } while (_cur_vm_operation != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // There is a chance that a thread enqueued a safepoint op
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // since we released the op-queue lock and initiated the safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // So we drain the queue again if there is anything there, as an
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // optimization to try and reduce the number of safepoints.
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // As the safepoint synchronizes us with JavaThreads we will see
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // any enqueue made by a JavaThread, but the peek will not
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // necessarily detect a concurrent enqueue by a GC thread, but
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // that simply means the op will wait for the next major cycle of the
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // VMThread - just as it would if the GC thread lost the race for
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // the lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
519 if (_vm_queue->peek_at_safepoint_priority()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // must hold lock while draining queue
a61af66fc99e Initial load
duke
parents:
diff changeset
521 MutexLockerEx mu_queue(VMOperationQueue_lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
522 Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
523 safepoint_ops = _vm_queue->drain_at_safepoint_priority();
a61af66fc99e Initial load
duke
parents:
diff changeset
524 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
525 safepoint_ops = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
527 } while(safepoint_ops != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529 _vm_queue->set_drain_list(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // Complete safepoint synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
532 SafepointSynchronize::end();
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 } else { // not a safepoint operation
a61af66fc99e Initial load
duke
parents:
diff changeset
535 if (TraceLongCompiles) {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 elapsedTimer t;
a61af66fc99e Initial load
duke
parents:
diff changeset
537 t.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
538 evaluate_operation(_cur_vm_operation);
a61af66fc99e Initial load
duke
parents:
diff changeset
539 t.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
540 double secs = t.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
541 if (secs * 1e3 > LongCompileThreshold) {
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // XXX - _cur_vm_operation should not be accessed after
a61af66fc99e Initial load
duke
parents:
diff changeset
543 // the completed count has been incremented; the waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
544 // thread may have already freed this memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
545 tty->print_cr("vm %s: %3.7f secs]", _cur_vm_operation->name(), secs);
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
548 evaluate_operation(_cur_vm_operation);
a61af66fc99e Initial load
duke
parents:
diff changeset
549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 _cur_vm_operation = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
554
a61af66fc99e Initial load
duke
parents:
diff changeset
555 //
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // Notify (potential) waiting Java thread(s) - lock without safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // check so that sneaking is not possible
a61af66fc99e Initial load
duke
parents:
diff changeset
558 { MutexLockerEx mu(VMOperationRequest_lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
559 Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
560 VMOperationRequest_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 //
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // We want to make sure that we get to a safepoint regularly.
a61af66fc99e Initial load
duke
parents:
diff changeset
565 //
a61af66fc99e Initial load
duke
parents:
diff changeset
566 if (SafepointALot || SafepointSynchronize::is_cleanup_needed()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
567 long interval = SafepointSynchronize::last_non_safepoint_interval();
a61af66fc99e Initial load
duke
parents:
diff changeset
568 bool max_time_exceeded = GuaranteedSafepointInterval != 0 && (interval > GuaranteedSafepointInterval);
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (SafepointALot || max_time_exceeded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
570 HandleMark hm(VMThread::vm_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
571 SafepointSynchronize::begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
572 SafepointSynchronize::end();
a61af66fc99e Initial load
duke
parents:
diff changeset
573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
574 }
a61af66fc99e Initial load
duke
parents:
diff changeset
575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
576 }
a61af66fc99e Initial load
duke
parents:
diff changeset
577
a61af66fc99e Initial load
duke
parents:
diff changeset
578 void VMThread::execute(VM_Operation* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
579 Thread* t = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
580
a61af66fc99e Initial load
duke
parents:
diff changeset
581 if (!t->is_VM_thread()) {
806
821269eca479 6820167: GCALotAtAllSafepoints + FullGCALot(ScavengeALot) options crash JVM
ysr
parents: 0
diff changeset
582 SkipGCALot sgcalot(t); // avoid re-entrant attempts to gc-a-lot
0
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // JavaThread or WatcherThread
a61af66fc99e Initial load
duke
parents:
diff changeset
584 t->check_for_valid_safepoint_state(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
585
a61af66fc99e Initial load
duke
parents:
diff changeset
586 // New request from Java thread, evaluate prologue
a61af66fc99e Initial load
duke
parents:
diff changeset
587 if (!op->doit_prologue()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
588 return; // op was cancelled
a61af66fc99e Initial load
duke
parents:
diff changeset
589 }
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // Setup VM_operations for execution
a61af66fc99e Initial load
duke
parents:
diff changeset
592 op->set_calling_thread(t, Thread::get_priority(t));
a61af66fc99e Initial load
duke
parents:
diff changeset
593
a61af66fc99e Initial load
duke
parents:
diff changeset
594 // It does not make sense to execute the epilogue, if the VM operation object is getting
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // deallocated by the VM thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
596 bool concurrent = op->evaluate_concurrently();
a61af66fc99e Initial load
duke
parents:
diff changeset
597 bool execute_epilog = !op->is_cheap_allocated();
a61af66fc99e Initial load
duke
parents:
diff changeset
598 assert(!concurrent || op->is_cheap_allocated(), "concurrent => cheap_allocated");
a61af66fc99e Initial load
duke
parents:
diff changeset
599
a61af66fc99e Initial load
duke
parents:
diff changeset
600 // Get ticket number for non-concurrent VM operations
a61af66fc99e Initial load
duke
parents:
diff changeset
601 int ticket = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
602 if (!concurrent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
603 ticket = t->vm_operation_ticket();
a61af66fc99e Initial load
duke
parents:
diff changeset
604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
605
a61af66fc99e Initial load
duke
parents:
diff changeset
606 // Add VM operation to list of waiting threads. We are guaranteed not to block while holding the
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // VMOperationQueue_lock, so we can block without a safepoint check. This allows vm operation requests
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // to be queued up during a safepoint synchronization.
a61af66fc99e Initial load
duke
parents:
diff changeset
609 {
a61af66fc99e Initial load
duke
parents:
diff changeset
610 VMOperationQueue_lock->lock_without_safepoint_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
611 bool ok = _vm_queue->add(op);
a61af66fc99e Initial load
duke
parents:
diff changeset
612 op->set_timestamp(os::javaTimeMillis());
a61af66fc99e Initial load
duke
parents:
diff changeset
613 VMOperationQueue_lock->notify();
a61af66fc99e Initial load
duke
parents:
diff changeset
614 VMOperationQueue_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // VM_Operation got skipped
a61af66fc99e Initial load
duke
parents:
diff changeset
616 if (!ok) {
a61af66fc99e Initial load
duke
parents:
diff changeset
617 assert(concurrent, "can only skip concurrent tasks");
a61af66fc99e Initial load
duke
parents:
diff changeset
618 if (op->is_cheap_allocated()) delete op;
a61af66fc99e Initial load
duke
parents:
diff changeset
619 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623 if (!concurrent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // Wait for completion of request (non-concurrent)
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // Note: only a JavaThread triggers the safepoint check when locking
a61af66fc99e Initial load
duke
parents:
diff changeset
626 MutexLocker mu(VMOperationRequest_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
627 while(t->vm_operation_completed_count() < ticket) {
a61af66fc99e Initial load
duke
parents:
diff changeset
628 VMOperationRequest_lock->wait(!t->is_Java_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
631
a61af66fc99e Initial load
duke
parents:
diff changeset
632 if (execute_epilog) {
a61af66fc99e Initial load
duke
parents:
diff changeset
633 op->doit_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
635 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // invoked by VM thread; usually nested VM operation
a61af66fc99e Initial load
duke
parents:
diff changeset
637 assert(t->is_VM_thread(), "must be a VM thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
638 VM_Operation* prev_vm_operation = vm_operation();
a61af66fc99e Initial load
duke
parents:
diff changeset
639 if (prev_vm_operation != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // Check the VM operation allows nested VM operation. This normally not the case, e.g., the compiler
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // does not allow nested scavenges or compiles.
a61af66fc99e Initial load
duke
parents:
diff changeset
642 if (!prev_vm_operation->allow_nested_vm_operations()) {
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1489
diff changeset
643 fatal(err_msg("Nested VM operation %s requested by operation %s",
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1489
diff changeset
644 op->name(), vm_operation()->name()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
646 op->set_calling_thread(prev_vm_operation->calling_thread(), prev_vm_operation->priority());
a61af66fc99e Initial load
duke
parents:
diff changeset
647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
648
a61af66fc99e Initial load
duke
parents:
diff changeset
649 EventMark em("Executing %s VM operation: %s", prev_vm_operation ? "nested" : "", op->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 // Release all internal handles after operation is evaluated
a61af66fc99e Initial load
duke
parents:
diff changeset
652 HandleMark hm(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
653 _cur_vm_operation = op;
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 if (op->evaluate_at_safepoint() && !SafepointSynchronize::is_at_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
656 SafepointSynchronize::begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
657 op->evaluate();
a61af66fc99e Initial load
duke
parents:
diff changeset
658 SafepointSynchronize::end();
a61af66fc99e Initial load
duke
parents:
diff changeset
659 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 op->evaluate();
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
662
a61af66fc99e Initial load
duke
parents:
diff changeset
663 // Free memory if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
664 if (op->is_cheap_allocated()) delete op;
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666 _cur_vm_operation = prev_vm_operation;
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
669
a61af66fc99e Initial load
duke
parents:
diff changeset
670
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
671 void VMThread::oops_do(OopClosure* f, CodeBlobClosure* cf) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
672 Thread::oops_do(f, cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
673 _vm_queue->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
675
a61af66fc99e Initial load
duke
parents:
diff changeset
676 //------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
677 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
678
a61af66fc99e Initial load
duke
parents:
diff changeset
679 void VMOperationQueue::verify_queue(int prio) {
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // Check that list is correctly linked
a61af66fc99e Initial load
duke
parents:
diff changeset
681 int length = _queue_length[prio];
a61af66fc99e Initial load
duke
parents:
diff changeset
682 VM_Operation *cur = _queue[prio];
a61af66fc99e Initial load
duke
parents:
diff changeset
683 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // Check forward links
a61af66fc99e Initial load
duke
parents:
diff changeset
686 for(i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
687 cur = cur->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
688 assert(cur != _queue[prio], "list to short (forward)");
a61af66fc99e Initial load
duke
parents:
diff changeset
689 }
a61af66fc99e Initial load
duke
parents:
diff changeset
690 assert(cur->next() == _queue[prio], "list to long (forward)");
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // Check backwards links
a61af66fc99e Initial load
duke
parents:
diff changeset
693 cur = _queue[prio];
a61af66fc99e Initial load
duke
parents:
diff changeset
694 for(i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
695 cur = cur->prev();
a61af66fc99e Initial load
duke
parents:
diff changeset
696 assert(cur != _queue[prio], "list to short (backwards)");
a61af66fc99e Initial load
duke
parents:
diff changeset
697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
698 assert(cur->prev() == _queue[prio], "list to long (backwards)");
a61af66fc99e Initial load
duke
parents:
diff changeset
699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
700
a61af66fc99e Initial load
duke
parents:
diff changeset
701 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 void VMThread::verify() {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
704 oops_do(&VerifyOopClosure::verify_oop, NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
705 }