annotate src/share/vm/runtime/thread.cpp @ 13212:eb03a7335eb0

Use fixed instead of virtual register for target in far foreign call, since the register allocator does not support virtual registers to be used at call sites.
author Christian Wimmer <christian.wimmer@oracle.com>
date Mon, 02 Dec 2013 14:20:32 -0800
parents 6b2d8d20ecbd
children 5a9afbf72714
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
7951
8b46b0196eb0 8000692: Remove old KERNEL code
zgu
parents: 7615
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1320
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1320
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: 1320
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: 1922
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
26 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
27 #include "classfile/javaClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
28 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
29 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
30 #include "code/scopeDesc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
31 #include "compiler/compileBroker.hpp"
4559
723df37192d6 Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 4137
diff changeset
32 #ifdef GRAAL
3064
8b0236cbed14 Make sure that the compiler is initialized at startup (and not on the first compiled method).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2925
diff changeset
33 #include "graal/graalCompiler.hpp"
4559
723df37192d6 Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 4137
diff changeset
34 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
35 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
36 #include "interpreter/linkResolver.hpp"
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
37 #include "interpreter/oopMapCache.hpp"
2126
db2b0f8c1cef 6814943: getcpool001 catches more than one JvmtiThreadState problem
kamg
parents: 2100
diff changeset
38 #include "jvmtifiles/jvmtiEnv.hpp"
4873
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
39 #include "memory/gcLocker.inline.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
40 #include "memory/metaspaceShared.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
41 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
42 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
43 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
44 #include "oops/objArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
45 #include "oops/oop.inline.hpp"
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
46 #include "oops/symbol.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
47 #include "prims/jvm_misc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
48 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
49 #include "prims/jvmtiThreadState.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
50 #include "prims/privilegedStack.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
51 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
52 #include "runtime/biasedLocking.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
53 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
54 #include "runtime/fprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
55 #include "runtime/frame.inline.hpp"
9430
147162b27799 GRAAL-234 - PTX code loading
Morris Meyer <morris.meyer@oracle.com>
parents: 9088
diff changeset
56 #include "runtime/gpu.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
57 #include "runtime/init.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
58 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
59 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
60 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
61 #include "runtime/jniPeriodicChecker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
62 #include "runtime/memprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
63 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
64 #include "runtime/objectMonitor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
65 #include "runtime/osThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
66 #include "runtime/safepoint.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
67 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
68 #include "runtime/statSampler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
69 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
70 #include "runtime/task.hpp"
7180
f34d701e952e 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 7179
diff changeset
71 #include "runtime/thread.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
72 #include "runtime/threadCritical.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
73 #include "runtime/threadLocalStorage.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
74 #include "runtime/vframe.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
75 #include "runtime/vframeArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
76 #include "runtime/vframe_hp.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
77 #include "runtime/vmThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
78 #include "runtime/vm_operations.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
79 #include "services/attachListener.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
80 #include "services/management.hpp"
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
81 #include "services/memTracker.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
82 #include "services/threadService.hpp"
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
83 #include "trace/tracing.hpp"
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
84 #include "trace/traceMacros.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
85 #include "utilities/defaultStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
86 #include "utilities/dtrace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
87 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
88 #include "utilities/preserveException.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
89 #include "utilities/macros.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
90 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
91 # include "os_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
92 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
93 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
94 # include "os_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
95 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
96 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
97 # include "os_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
98 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
99 #ifdef TARGET_OS_FAMILY_bsd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
100 # include "os_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
101 #endif
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
102 #if INCLUDE_ALL_GCS
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
103 #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
104 #include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
105 #include "gc_implementation/parallelScavenge/pcTasks.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
106 #endif // INCLUDE_ALL_GCS
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
107 #ifdef COMPILER1
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
108 #include "c1/c1_Compiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
109 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
110 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
111 #include "opto/c2compiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
112 #include "opto/idealGraphPrinter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1922
diff changeset
113 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 #ifdef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // Only bother with this argument setup if dtrace is available
a61af66fc99e Initial load
duke
parents:
diff changeset
118
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
119 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120 HS_DTRACE_PROBE_DECL(hotspot, vm__init__begin);
a61af66fc99e Initial load
duke
parents:
diff changeset
121 HS_DTRACE_PROBE_DECL(hotspot, vm__init__end);
a61af66fc99e Initial load
duke
parents:
diff changeset
122 HS_DTRACE_PROBE_DECL5(hotspot, thread__start, char*, intptr_t,
a61af66fc99e Initial load
duke
parents:
diff changeset
123 intptr_t, intptr_t, bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
124 HS_DTRACE_PROBE_DECL5(hotspot, thread__stop, char*, intptr_t,
a61af66fc99e Initial load
duke
parents:
diff changeset
125 intptr_t, intptr_t, bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 #define DTRACE_THREAD_PROBE(probe, javathread) \
a61af66fc99e Initial load
duke
parents:
diff changeset
128 { \
a61af66fc99e Initial load
duke
parents:
diff changeset
129 ResourceMark rm(this); \
a61af66fc99e Initial load
duke
parents:
diff changeset
130 int len = 0; \
a61af66fc99e Initial load
duke
parents:
diff changeset
131 const char* name = (javathread)->get_thread_name(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
132 len = strlen(name); \
a61af66fc99e Initial load
duke
parents:
diff changeset
133 HS_DTRACE_PROBE5(hotspot, thread__##probe, \
a61af66fc99e Initial load
duke
parents:
diff changeset
134 name, len, \
a61af66fc99e Initial load
duke
parents:
diff changeset
135 java_lang_Thread::thread_id((javathread)->threadObj()), \
a61af66fc99e Initial load
duke
parents:
diff changeset
136 (javathread)->osthread()->thread_id(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
137 java_lang_Thread::is_daemon((javathread)->threadObj())); \
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
140 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
141
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
142 #define HOTSPOT_THREAD_PROBE_start HOTSPOT_THREAD_PROBE_START
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
143 #define HOTSPOT_THREAD_PROBE_stop HOTSPOT_THREAD_PROBE_STOP
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
144
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
145 #define DTRACE_THREAD_PROBE(probe, javathread) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
146 { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
147 ResourceMark rm(this); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
148 int len = 0; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
149 const char* name = (javathread)->get_thread_name(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
150 len = strlen(name); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
151 HOTSPOT_THREAD_PROBE_##probe( /* probe = start, stop */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
152 (char *) name, len, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
153 java_lang_Thread::thread_id((javathread)->threadObj()), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
154 (uintptr_t) (javathread)->osthread()->thread_id(), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
155 java_lang_Thread::is_daemon((javathread)->threadObj())); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
156 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
157
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
158 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
159
0
a61af66fc99e Initial load
duke
parents:
diff changeset
160 #else // ndef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 #define DTRACE_THREAD_PROBE(probe, javathread)
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 #endif // ndef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
165
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
166
0
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // Class hierarchy
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // - Thread
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // - VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // - WatcherThread
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // - ConcurrentMarkSweepThread
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // - JavaThread
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // - CompilerThread
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // ======= Thread ========
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // Support for forcing alignment of thread objects for biased locking
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
177 void* Thread::allocate(size_t size, bool throw_excpt, MEMFLAGS flags) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
178 if (UseBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 const int alignment = markOopDesc::biased_lock_alignment;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 size_t aligned_size = size + (alignment - sizeof(intptr_t));
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
181 void* real_malloc_addr = throw_excpt? AllocateHeap(aligned_size, flags, CURRENT_PC)
6872
7b5885dadbdc 8000617: It should be possible to allocate memory without the VM dying.
nloodin
parents: 6857
diff changeset
182 : AllocateHeap(aligned_size, flags, CURRENT_PC,
7b5885dadbdc 8000617: It should be possible to allocate memory without the VM dying.
nloodin
parents: 6857
diff changeset
183 AllocFailStrategy::RETURN_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
184 void* aligned_addr = (void*) align_size_up((intptr_t) real_malloc_addr, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
185 assert(((uintptr_t) aligned_addr + (uintptr_t) size) <=
a61af66fc99e Initial load
duke
parents:
diff changeset
186 ((uintptr_t) real_malloc_addr + (uintptr_t) aligned_size),
a61af66fc99e Initial load
duke
parents:
diff changeset
187 "JavaThread alignment code overflowed allocated storage");
a61af66fc99e Initial load
duke
parents:
diff changeset
188 if (TraceBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
189 if (aligned_addr != real_malloc_addr)
a61af66fc99e Initial load
duke
parents:
diff changeset
190 tty->print_cr("Aligned thread " INTPTR_FORMAT " to " INTPTR_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
191 real_malloc_addr, aligned_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193 ((Thread*) aligned_addr)->_real_malloc_address = real_malloc_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
194 return aligned_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
195 } else {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
196 return throw_excpt? AllocateHeap(size, flags, CURRENT_PC)
6872
7b5885dadbdc 8000617: It should be possible to allocate memory without the VM dying.
nloodin
parents: 6857
diff changeset
197 : AllocateHeap(size, flags, CURRENT_PC, AllocFailStrategy::RETURN_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 void Thread::operator delete(void* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 if (UseBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 void* real_malloc_addr = ((Thread*) p)->_real_malloc_address;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
204 FreeHeap(real_malloc_addr, mtThread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
205 } else {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
206 FreeHeap(p, mtThread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Base class for all threads: VMThread, WatcherThread, ConcurrentMarkSweepThread,
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // JavaThread
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 Thread::Thread() {
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
216 // stack and get_thread
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
217 set_stack_base(NULL);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
218 set_stack_size(0);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
219 set_self_raw_id(0);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
220 set_lgrp_id(-1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // allocated data structures
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
223 set_osthread(NULL);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
224 set_resource_area(new (mtThread)ResourceArea());
11136
dbc0b5dc08f5 7143807: ResourceMark nesting problem in stringStream
fparain
parents: 11096
diff changeset
225 DEBUG_ONLY(_current_resource_mark = NULL;)
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
226 set_handle_area(new (mtThread) HandleArea(NULL));
11027
b9f4c4ec0f50 8008964: NPG: Memory regression: Thread::_metadata_handles uses 1 KB per thread.
iklam
parents: 10405
diff changeset
227 set_metadata_handles(new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(30, true));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
228 set_active_handles(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 set_free_handle_block(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 set_last_handle_mark(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // This initial value ==> never claimed.
a61af66fc99e Initial load
duke
parents:
diff changeset
233 _oops_do_parity = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // the handle mark links itself to last_handle_mark
10135
5a9fa2ba85f0 8012907: anti-delta fix for 8010992
dcubed
parents: 10130
diff changeset
236 new HandleMark(this);
5a9fa2ba85f0 8012907: anti-delta fix for 8010992
dcubed
parents: 10130
diff changeset
237
0
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // plain initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
239 debug_only(_owned_locks = NULL;)
a61af66fc99e Initial load
duke
parents:
diff changeset
240 debug_only(_allow_allocation_count = 0;)
a61af66fc99e Initial load
duke
parents:
diff changeset
241 NOT_PRODUCT(_allow_safepoint_count = 0;)
806
821269eca479 6820167: GCALotAtAllSafepoints + FullGCALot(ScavengeALot) options crash JVM
ysr
parents: 702
diff changeset
242 NOT_PRODUCT(_skip_gcalot = false;)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
243 CHECK_UNHANDLED_OOPS_ONLY(_gc_locked_out_count = 0;)
a61af66fc99e Initial load
duke
parents:
diff changeset
244 _jvmti_env_iteration_count = 0;
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2014
diff changeset
245 set_allocated_bytes(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246 _vm_operation_started_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 _vm_operation_completed_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
248 _current_pending_monitor = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
249 _current_pending_monitor_is_from_java = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
250 _current_waiting_monitor = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 _num_nested_signal = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
252 omFreeList = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 omFreeCount = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 omFreeProvision = 32 ;
1587
b96a3e44582f 6852873: Reduce safepoint cleanup time
acorn
parents: 1320
diff changeset
255 omInUseList = NULL ;
b96a3e44582f 6852873: Reduce safepoint cleanup time
acorn
parents: 1320
diff changeset
256 omInUseCount = 0 ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257
5928
541c4a5e7b88 7150390: JFR test crashed on assert(_jni_lock_count == count) failed: must be equal
never
parents: 4932
diff changeset
258 #ifdef ASSERT
541c4a5e7b88 7150390: JFR test crashed on assert(_jni_lock_count == count) failed: must be equal
never
parents: 4932
diff changeset
259 _visited_for_critical_count = false;
541c4a5e7b88 7150390: JFR test crashed on assert(_jni_lock_count == count) failed: must be equal
never
parents: 4932
diff changeset
260 #endif
541c4a5e7b88 7150390: JFR test crashed on assert(_jni_lock_count == count) failed: must be equal
never
parents: 4932
diff changeset
261
0
a61af66fc99e Initial load
duke
parents:
diff changeset
262 _SR_lock = new Monitor(Mutex::suspend_resume, "SR_lock", true);
a61af66fc99e Initial load
duke
parents:
diff changeset
263 _suspend_flags = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // thread-specific hashCode stream generator state - Marsaglia shift-xor form
a61af66fc99e Initial load
duke
parents:
diff changeset
266 _hashStateX = os::random() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
267 _hashStateY = 842502087 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 _hashStateZ = 0x8767 ; // (int)(3579807591LL & 0xffff) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
269 _hashStateW = 273326509 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 _OnTrap = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 _schedctl = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 _Stalled = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
274 _TypeTag = 0x2BAD ;
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // Many of the following fields are effectively final - immutable
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // Note that nascent threads can't use the Native Monitor-Mutex
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // construct until the _MutexEvent is initialized ...
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // CONSIDER: instead of using a fixed set of purpose-dedicated ParkEvents
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // we might instead use a stack of ParkEvents that we could provision on-demand.
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // The stack would act as a cache to avoid calls to ParkEvent::Allocate()
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // and ::Release()
a61af66fc99e Initial load
duke
parents:
diff changeset
283 _ParkEvent = ParkEvent::Allocate (this) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 _SleepEvent = ParkEvent::Allocate (this) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 _MutexEvent = ParkEvent::Allocate (this) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 _MuxEvent = ParkEvent::Allocate (this) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 #ifdef CHECK_UNHANDLED_OOPS
a61af66fc99e Initial load
duke
parents:
diff changeset
289 if (CheckUnhandledOops) {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 _unhandled_oops = new UnhandledOops(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292 #endif // CHECK_UNHANDLED_OOPS
a61af66fc99e Initial load
duke
parents:
diff changeset
293 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
294 if (UseBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 assert((((uintptr_t) this) & (markOopDesc::biased_lock_alignment - 1)) == 0, "forced alignment of thread object failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
296 assert(this == _real_malloc_address ||
a61af66fc99e Initial load
duke
parents:
diff changeset
297 this == (void*) align_size_up((intptr_t) _real_malloc_address, markOopDesc::biased_lock_alignment),
a61af66fc99e Initial load
duke
parents:
diff changeset
298 "bug in forced alignment of thread objects");
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300 #endif /* ASSERT */
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 void Thread::initialize_thread_local_storage() {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // Note: Make sure this method only calls
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // non-blocking operations. Otherwise, it might not work
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // with the thread-startup/safepoint interaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // During Java thread startup, safepoint code should allow this
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // method to complete because it may need to allocate memory to
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // store information for the new thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // initialize structure dependent on thread local storage
a61af66fc99e Initial load
duke
parents:
diff changeset
313 ThreadLocalStorage::set_thread(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 void Thread::record_stack_base_and_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 set_stack_base(os::current_stack_base());
a61af66fc99e Initial load
duke
parents:
diff changeset
318 set_stack_size(os::current_stack_size());
6768
716e6ef4482a 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 6745
diff changeset
319 // CR 7190089: on Solaris, primordial thread's stack is adjusted
716e6ef4482a 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 6745
diff changeset
320 // in initialize_thread(). Without the adjustment, stack size is
716e6ef4482a 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 6745
diff changeset
321 // incorrect if stack is set to unlimited (ulimit -s unlimited).
716e6ef4482a 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 6745
diff changeset
322 // So far, only Solaris has real implementation of initialize_thread().
716e6ef4482a 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 6745
diff changeset
323 //
716e6ef4482a 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 6745
diff changeset
324 // set up any platform-specific state.
716e6ef4482a 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 6745
diff changeset
325 os::initialize_thread(this);
716e6ef4482a 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 6745
diff changeset
326
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
327 #if INCLUDE_NMT
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
328 // record thread's native stack, stack grows downward
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
329 address stack_low_addr = stack_base() - stack_size();
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
330 MemTracker::record_thread_stack(stack_low_addr, stack_size(), this,
6768
716e6ef4482a 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 6745
diff changeset
331 CURRENT_PC);
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
332 #endif // INCLUDE_NMT
0
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 Thread::~Thread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // Reclaim the objectmonitors from the omFreeList of the moribund thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
338 ObjectSynchronizer::omFlush (this) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
339
12205
623d923529df 8021353: Event based tracing is missing thread exit
mgronlun
parents: 12117
diff changeset
340 EVENT_THREAD_DESTRUCT(this);
623d923529df 8021353: Event based tracing is missing thread exit
mgronlun
parents: 12117
diff changeset
341
6745
6dfc6a541338 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 6741
diff changeset
342 // stack_base can be NULL if the thread is never started or exited before
6dfc6a541338 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 6741
diff changeset
343 // record_stack_base_and_size called. Although, we would like to ensure
6dfc6a541338 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 6741
diff changeset
344 // that all started threads do call record_stack_base_and_size(), there is
6dfc6a541338 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 6741
diff changeset
345 // not proper way to enforce that.
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
346 #if INCLUDE_NMT
6745
6dfc6a541338 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 6741
diff changeset
347 if (_stack_base != NULL) {
6dfc6a541338 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 6741
diff changeset
348 address low_stack_addr = stack_base() - stack_size();
6dfc6a541338 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 6741
diff changeset
349 MemTracker::release_thread_stack(low_stack_addr, stack_size(), this);
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
350 #ifdef ASSERT
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
351 set_stack_base(NULL);
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
352 #endif
6745
6dfc6a541338 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 6741
diff changeset
353 }
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
354 #endif // INCLUDE_NMT
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
355
0
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // deallocate data structures
a61af66fc99e Initial load
duke
parents:
diff changeset
357 delete resource_area();
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // since the handle marks are using the handle area, we have to deallocated the root
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // handle mark before deallocating the thread's handle area,
a61af66fc99e Initial load
duke
parents:
diff changeset
360 assert(last_handle_mark() != NULL, "check we have an element");
10135
5a9fa2ba85f0 8012907: anti-delta fix for 8010992
dcubed
parents: 10130
diff changeset
361 delete last_handle_mark();
5a9fa2ba85f0 8012907: anti-delta fix for 8010992
dcubed
parents: 10130
diff changeset
362 assert(last_handle_mark() == NULL, "check we have reached the end");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // It's possible we can encounter a null _ParkEvent, etc., in stillborn threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // We NULL out the fields for good hygiene.
a61af66fc99e Initial load
duke
parents:
diff changeset
366 ParkEvent::Release (_ParkEvent) ; _ParkEvent = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
367 ParkEvent::Release (_SleepEvent) ; _SleepEvent = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 ParkEvent::Release (_MutexEvent) ; _MutexEvent = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
369 ParkEvent::Release (_MuxEvent) ; _MuxEvent = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 delete handle_area();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
372 delete metadata_handles();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // osthread() can be NULL, if creation of thread failed.
a61af66fc99e Initial load
duke
parents:
diff changeset
375 if (osthread() != NULL) os::free_thread(osthread());
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 delete _SR_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // clear thread local storage if the Thread is deleting itself
a61af66fc99e Initial load
duke
parents:
diff changeset
380 if (this == Thread::current()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 ThreadLocalStorage::set_thread(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
382 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // In the case where we're not the current thread, invalidate all the
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // caches in case some code tries to get the current thread or the
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // thread that was destroyed, and gets stale information.
a61af66fc99e Initial load
duke
parents:
diff changeset
386 ThreadLocalStorage::invalidate_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
388 CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) delete unhandled_oops();)
a61af66fc99e Initial load
duke
parents:
diff changeset
389 }
a61af66fc99e Initial load
duke
parents:
diff changeset
390
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // NOTE: dummy function for assertion purpose.
a61af66fc99e Initial load
duke
parents:
diff changeset
392 void Thread::run() {
a61af66fc99e Initial load
duke
parents:
diff changeset
393 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // Private method to check for dangling thread pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
398 void check_for_dangling_thread_pointer(Thread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
399 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
a61af66fc99e Initial load
duke
parents:
diff changeset
400 "possibility of dangling Thread pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
402 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // Tracing method for basic thread operations
a61af66fc99e Initial load
duke
parents:
diff changeset
407 void Thread::trace(const char* msg, const Thread* const thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
408 if (!TraceThreadEvents) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
409 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
410 ThreadCritical tc;
a61af66fc99e Initial load
duke
parents:
diff changeset
411 const char *name = "non-Java thread";
a61af66fc99e Initial load
duke
parents:
diff changeset
412 int prio = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
413 if (thread->is_Java_thread()
a61af66fc99e Initial load
duke
parents:
diff changeset
414 && !thread->is_Compiler_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // The Threads_lock must be held to get information about
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // this thread but may not be in some situations when
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // tracing thread events.
a61af66fc99e Initial load
duke
parents:
diff changeset
418 bool release_Threads_lock = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
419 if (!Threads_lock->owned_by_self()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
420 Threads_lock->lock();
a61af66fc99e Initial load
duke
parents:
diff changeset
421 release_Threads_lock = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
423 JavaThread* jt = (JavaThread *)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
424 name = (char *)jt->get_thread_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
425 oop thread_oop = jt->threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
426 if (thread_oop != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
427 prio = java_lang_Thread::priority(thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
429 if (release_Threads_lock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
430 Threads_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
432 }
a61af66fc99e Initial load
duke
parents:
diff changeset
433 tty->print_cr("Thread::%s " INTPTR_FORMAT " [%lx] %s (prio: %d)", msg, thread, thread->osthread()->thread_id(), name, prio);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 ThreadPriority Thread::get_priority(const Thread* const thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 trace("get priority", thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
440 ThreadPriority priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // Can return an error!
a61af66fc99e Initial load
duke
parents:
diff changeset
442 (void)os::get_priority(thread, priority);
a61af66fc99e Initial load
duke
parents:
diff changeset
443 assert(MinPriority <= priority && priority <= MaxPriority, "non-Java priority found");
a61af66fc99e Initial load
duke
parents:
diff changeset
444 return priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 void Thread::set_priority(Thread* thread, ThreadPriority priority) {
a61af66fc99e Initial load
duke
parents:
diff changeset
448 trace("set priority", thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
449 debug_only(check_for_dangling_thread_pointer(thread);)
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // Can return an error!
a61af66fc99e Initial load
duke
parents:
diff changeset
451 (void)os::set_priority(thread, priority);
a61af66fc99e Initial load
duke
parents:
diff changeset
452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455 void Thread::start(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
456 trace("start", thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // Start is different from resume in that its safety is guaranteed by context or
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // being called from a Java method synchronized on the Thread object.
a61af66fc99e Initial load
duke
parents:
diff changeset
459 if (!DisableStartThread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 if (thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // Initialize the thread state to RUNNABLE before starting this thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
462 // Can not set it after the thread started because we do not know the
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // exact thread state at that time. It could be in MONITOR_WAIT or
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // in SLEEPING or some other state.
a61af66fc99e Initial load
duke
parents:
diff changeset
465 java_lang_Thread::set_thread_status(((JavaThread*)thread)->threadObj(),
a61af66fc99e Initial load
duke
parents:
diff changeset
466 java_lang_Thread::RUNNABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
468 os::start_thread(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // Enqueue a VM_Operation to do the job for us - sometime later
a61af66fc99e Initial load
duke
parents:
diff changeset
473 void Thread::send_async_exception(oop java_thread, oop java_throwable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 VM_ThreadStop* vm_stop = new VM_ThreadStop(java_thread, java_throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
475 VMThread::execute(vm_stop);
a61af66fc99e Initial load
duke
parents:
diff changeset
476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 //
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // Check if an external suspend request has completed (or has been
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // cancelled). Returns true if the thread is externally suspended and
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // false otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
483 //
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // The bits parameter returns information about the code path through
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // the routine. Useful for debugging:
a61af66fc99e Initial load
duke
parents:
diff changeset
486 //
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // set in is_ext_suspend_completed():
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // 0x00000001 - routine was entered
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // 0x00000010 - routine return false at end
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // 0x00000100 - thread exited (return false)
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // 0x00000200 - suspend request cancelled (return false)
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // 0x00000400 - thread suspended (return true)
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // 0x00001000 - thread is in a suspend equivalent state (return true)
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // 0x00002000 - thread is native and walkable (return true)
a61af66fc99e Initial load
duke
parents:
diff changeset
495 // 0x00004000 - thread is native_trans and walkable (needed retry)
a61af66fc99e Initial load
duke
parents:
diff changeset
496 //
a61af66fc99e Initial load
duke
parents:
diff changeset
497 // set in wait_for_ext_suspend_completion():
a61af66fc99e Initial load
duke
parents:
diff changeset
498 // 0x00010000 - routine was entered
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // 0x00020000 - suspend request cancelled before loop (return false)
a61af66fc99e Initial load
duke
parents:
diff changeset
500 // 0x00040000 - thread suspended before loop (return true)
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // 0x00080000 - suspend request cancelled in loop (return false)
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // 0x00100000 - thread suspended in loop (return true)
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // 0x00200000 - suspend not completed during retry loop (return false)
a61af66fc99e Initial load
duke
parents:
diff changeset
504 //
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 // Helper class for tracing suspend wait debug bits.
a61af66fc99e Initial load
duke
parents:
diff changeset
507 //
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // 0x00000100 indicates that the target thread exited before it could
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // self-suspend which is not a wait failure. 0x00000200, 0x00020000 and
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // 0x00080000 each indicate a cancelled suspend request so they don't
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // count as wait failures either.
a61af66fc99e Initial load
duke
parents:
diff changeset
512 #define DEBUG_FALSE_BITS (0x00000010 | 0x00200000)
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 class TraceSuspendDebugBits : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
515 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
516 JavaThread * jt;
a61af66fc99e Initial load
duke
parents:
diff changeset
517 bool is_wait;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 bool called_by_wait; // meaningful when !is_wait
a61af66fc99e Initial load
duke
parents:
diff changeset
519 uint32_t * bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
522 TraceSuspendDebugBits(JavaThread *_jt, bool _is_wait, bool _called_by_wait,
a61af66fc99e Initial load
duke
parents:
diff changeset
523 uint32_t *_bits) {
a61af66fc99e Initial load
duke
parents:
diff changeset
524 jt = _jt;
a61af66fc99e Initial load
duke
parents:
diff changeset
525 is_wait = _is_wait;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 called_by_wait = _called_by_wait;
a61af66fc99e Initial load
duke
parents:
diff changeset
527 bits = _bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 ~TraceSuspendDebugBits() {
a61af66fc99e Initial load
duke
parents:
diff changeset
531 if (!is_wait) {
a61af66fc99e Initial load
duke
parents:
diff changeset
532 #if 1
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // By default, don't trace bits for is_ext_suspend_completed() calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // That trace is very chatty.
a61af66fc99e Initial load
duke
parents:
diff changeset
535 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
537 if (!called_by_wait) {
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // If tracing for is_ext_suspend_completed() is enabled, then only
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // trace calls to it from wait_for_ext_suspend_completion()
a61af66fc99e Initial load
duke
parents:
diff changeset
540 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
542 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 if (AssertOnSuspendWaitFailure || TraceSuspendWaitFailures) {
a61af66fc99e Initial load
duke
parents:
diff changeset
546 if (bits != NULL && (*bits & DEBUG_FALSE_BITS) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
547 MutexLocker ml(Threads_lock); // needed for get_thread_name()
a61af66fc99e Initial load
duke
parents:
diff changeset
548 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
549
a61af66fc99e Initial load
duke
parents:
diff changeset
550 tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
551 "Failed wait_for_ext_suspend_completion(thread=%s, debug_bits=%x)",
a61af66fc99e Initial load
duke
parents:
diff changeset
552 jt->get_thread_name(), *bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 guarantee(!AssertOnSuspendWaitFailure, "external suspend wait failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
555 }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
558 };
a61af66fc99e Initial load
duke
parents:
diff changeset
559 #undef DEBUG_FALSE_BITS
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 bool JavaThread::is_ext_suspend_completed(bool called_by_wait, int delay, uint32_t *bits) {
a61af66fc99e Initial load
duke
parents:
diff changeset
563 TraceSuspendDebugBits tsdb(this, false /* !is_wait */, called_by_wait, bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
564
a61af66fc99e Initial load
duke
parents:
diff changeset
565 bool did_trans_retry = false; // only do thread_in_native_trans retry once
a61af66fc99e Initial load
duke
parents:
diff changeset
566 bool do_trans_retry; // flag to force the retry
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 *bits |= 0x00000001;
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
571 do_trans_retry = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 if (is_exiting()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
574 // Thread is in the process of exiting. This is always checked
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // first to reduce the risk of dereferencing a freed JavaThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
576 *bits |= 0x00000100;
a61af66fc99e Initial load
duke
parents:
diff changeset
577 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 if (!is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 // Suspend request is cancelled. This is always checked before
a61af66fc99e Initial load
duke
parents:
diff changeset
582 // is_ext_suspended() to reduce the risk of a rogue resume
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // confusing the thread that made the suspend request.
a61af66fc99e Initial load
duke
parents:
diff changeset
584 *bits |= 0x00000200;
a61af66fc99e Initial load
duke
parents:
diff changeset
585 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 if (is_ext_suspended()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
589 // thread is suspended
a61af66fc99e Initial load
duke
parents:
diff changeset
590 *bits |= 0x00000400;
a61af66fc99e Initial load
duke
parents:
diff changeset
591 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
592 }
a61af66fc99e Initial load
duke
parents:
diff changeset
593
a61af66fc99e Initial load
duke
parents:
diff changeset
594 // Now that we no longer do hard suspends of threads running
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // native code, the target thread can be changing thread state
a61af66fc99e Initial load
duke
parents:
diff changeset
596 // while we are in this routine:
a61af66fc99e Initial load
duke
parents:
diff changeset
597 //
a61af66fc99e Initial load
duke
parents:
diff changeset
598 // _thread_in_native -> _thread_in_native_trans -> _thread_blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
599 //
a61af66fc99e Initial load
duke
parents:
diff changeset
600 // We save a copy of the thread state as observed at this moment
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // and make our decision about suspend completeness based on the
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // copy. This closes the race where the thread state is seen as
a61af66fc99e Initial load
duke
parents:
diff changeset
603 // _thread_in_native_trans in the if-thread_blocked check, but is
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // seen as _thread_blocked in if-thread_in_native_trans check.
a61af66fc99e Initial load
duke
parents:
diff changeset
605 JavaThreadState save_state = thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
606
a61af66fc99e Initial load
duke
parents:
diff changeset
607 if (save_state == _thread_blocked && is_suspend_equivalent()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // If the thread's state is _thread_blocked and this blocking
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // condition is known to be equivalent to a suspend, then we can
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // consider the thread to be externally suspended. This means that
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // the code that sets _thread_blocked has been modified to do
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // self-suspension if the blocking condition releases. We also
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // used to check for CONDVAR_WAIT here, but that is now covered by
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // the _thread_blocked with self-suspension check.
a61af66fc99e Initial load
duke
parents:
diff changeset
615 //
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // Return true since we wouldn't be here unless there was still an
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // external suspend request.
a61af66fc99e Initial load
duke
parents:
diff changeset
618 *bits |= 0x00001000;
a61af66fc99e Initial load
duke
parents:
diff changeset
619 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
620 } else if (save_state == _thread_in_native && frame_anchor()->walkable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
621 // Threads running native code will self-suspend on native==>VM/Java
a61af66fc99e Initial load
duke
parents:
diff changeset
622 // transitions. If its stack is walkable (should always be the case
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // unless this function is called before the actual java_suspend()
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // call), then the wait is done.
a61af66fc99e Initial load
duke
parents:
diff changeset
625 *bits |= 0x00002000;
a61af66fc99e Initial load
duke
parents:
diff changeset
626 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
627 } else if (!called_by_wait && !did_trans_retry &&
a61af66fc99e Initial load
duke
parents:
diff changeset
628 save_state == _thread_in_native_trans &&
a61af66fc99e Initial load
duke
parents:
diff changeset
629 frame_anchor()->walkable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // The thread is transitioning from thread_in_native to another
a61af66fc99e Initial load
duke
parents:
diff changeset
631 // thread state. check_safepoint_and_suspend_for_native_trans()
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // will force the thread to self-suspend. If it hasn't gotten
a61af66fc99e Initial load
duke
parents:
diff changeset
633 // there yet we may have caught the thread in-between the native
a61af66fc99e Initial load
duke
parents:
diff changeset
634 // code check above and the self-suspend. Lucky us. If we were
a61af66fc99e Initial load
duke
parents:
diff changeset
635 // called by wait_for_ext_suspend_completion(), then it
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // will be doing the retries so we don't have to.
a61af66fc99e Initial load
duke
parents:
diff changeset
637 //
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // Since we use the saved thread state in the if-statement above,
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // there is a chance that the thread has already transitioned to
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // _thread_blocked by the time we get here. In that case, we will
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // make a single unnecessary pass through the logic below. This
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // doesn't hurt anything since we still do the trans retry.
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 *bits |= 0x00004000;
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // Once the thread leaves thread_in_native_trans for another
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // thread state, we break out of this retry loop. We shouldn't
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // need this flag to prevent us from getting back here, but
a61af66fc99e Initial load
duke
parents:
diff changeset
649 // sometimes paranoia is good.
a61af66fc99e Initial load
duke
parents:
diff changeset
650 did_trans_retry = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // We wait for the thread to transition to a more usable state.
a61af66fc99e Initial load
duke
parents:
diff changeset
653 for (int i = 1; i <= SuspendRetryCount; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
654 // We used to do an "os::yield_all(i)" call here with the intention
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // that yielding would increase on each retry. However, the parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // is ignored on Linux which means the yield didn't scale up. Waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // on the SR_lock below provides a much more predictable scale up for
a61af66fc99e Initial load
duke
parents:
diff changeset
658 // the delay. It also provides a simple/direct point to check for any
a61af66fc99e Initial load
duke
parents:
diff changeset
659 // safepoint requests from the VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661 // temporarily drops SR_lock while doing wait with safepoint check
a61af66fc99e Initial load
duke
parents:
diff changeset
662 // (if we're a JavaThread - the WatcherThread can also call this)
a61af66fc99e Initial load
duke
parents:
diff changeset
663 // and increase delay with each retry
a61af66fc99e Initial load
duke
parents:
diff changeset
664 SR_lock()->wait(!Thread::current()->is_Java_thread(), i * delay);
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666 // check the actual thread state instead of what we saved above
a61af66fc99e Initial load
duke
parents:
diff changeset
667 if (thread_state() != _thread_in_native_trans) {
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // the thread has transitioned to another thread state so
a61af66fc99e Initial load
duke
parents:
diff changeset
669 // try all the checks (except this one) one more time.
a61af66fc99e Initial load
duke
parents:
diff changeset
670 do_trans_retry = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
671 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
673 } // end retry loop
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 } while (do_trans_retry);
a61af66fc99e Initial load
duke
parents:
diff changeset
678
a61af66fc99e Initial load
duke
parents:
diff changeset
679 *bits |= 0x00000010;
a61af66fc99e Initial load
duke
parents:
diff changeset
680 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 //
a61af66fc99e Initial load
duke
parents:
diff changeset
684 // Wait for an external suspend request to complete (or be cancelled).
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // Returns true if the thread is externally suspended and false otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
686 //
a61af66fc99e Initial load
duke
parents:
diff changeset
687 bool JavaThread::wait_for_ext_suspend_completion(int retries, int delay,
a61af66fc99e Initial load
duke
parents:
diff changeset
688 uint32_t *bits) {
a61af66fc99e Initial load
duke
parents:
diff changeset
689 TraceSuspendDebugBits tsdb(this, true /* is_wait */,
a61af66fc99e Initial load
duke
parents:
diff changeset
690 false /* !called_by_wait */, bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // local flag copies to minimize SR_lock hold time
a61af66fc99e Initial load
duke
parents:
diff changeset
693 bool is_suspended;
a61af66fc99e Initial load
duke
parents:
diff changeset
694 bool pending;
a61af66fc99e Initial load
duke
parents:
diff changeset
695 uint32_t reset_bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
696
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // set a marker so is_ext_suspend_completed() knows we are the caller
a61af66fc99e Initial load
duke
parents:
diff changeset
698 *bits |= 0x00010000;
a61af66fc99e Initial load
duke
parents:
diff changeset
699
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // We use reset_bits to reinitialize the bits value at the top of
a61af66fc99e Initial load
duke
parents:
diff changeset
701 // each retry loop. This allows the caller to make use of any
a61af66fc99e Initial load
duke
parents:
diff changeset
702 // unused bits for their own marking purposes.
a61af66fc99e Initial load
duke
parents:
diff changeset
703 reset_bits = *bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
704
a61af66fc99e Initial load
duke
parents:
diff changeset
705 {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
707 is_suspended = is_ext_suspend_completed(true /* called_by_wait */,
a61af66fc99e Initial load
duke
parents:
diff changeset
708 delay, bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
709 pending = is_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // must release SR_lock to allow suspension to complete
a61af66fc99e Initial load
duke
parents:
diff changeset
712
a61af66fc99e Initial load
duke
parents:
diff changeset
713 if (!pending) {
a61af66fc99e Initial load
duke
parents:
diff changeset
714 // A cancelled suspend request is the only false return from
a61af66fc99e Initial load
duke
parents:
diff changeset
715 // is_ext_suspend_completed() that keeps us from entering the
a61af66fc99e Initial load
duke
parents:
diff changeset
716 // retry loop.
a61af66fc99e Initial load
duke
parents:
diff changeset
717 *bits |= 0x00020000;
a61af66fc99e Initial load
duke
parents:
diff changeset
718 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721 if (is_suspended) {
a61af66fc99e Initial load
duke
parents:
diff changeset
722 *bits |= 0x00040000;
a61af66fc99e Initial load
duke
parents:
diff changeset
723 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
725
a61af66fc99e Initial load
duke
parents:
diff changeset
726 for (int i = 1; i <= retries; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
727 *bits = reset_bits; // reinit to only track last retry
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 // We used to do an "os::yield_all(i)" call here with the intention
a61af66fc99e Initial load
duke
parents:
diff changeset
730 // that yielding would increase on each retry. However, the parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
731 // is ignored on Linux which means the yield didn't scale up. Waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
732 // on the SR_lock below provides a much more predictable scale up for
a61af66fc99e Initial load
duke
parents:
diff changeset
733 // the delay. It also provides a simple/direct point to check for any
a61af66fc99e Initial load
duke
parents:
diff changeset
734 // safepoint requests from the VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736 {
a61af66fc99e Initial load
duke
parents:
diff changeset
737 MutexLocker ml(SR_lock());
a61af66fc99e Initial load
duke
parents:
diff changeset
738 // wait with safepoint check (if we're a JavaThread - the WatcherThread
a61af66fc99e Initial load
duke
parents:
diff changeset
739 // can also call this) and increase delay with each retry
a61af66fc99e Initial load
duke
parents:
diff changeset
740 SR_lock()->wait(!Thread::current()->is_Java_thread(), i * delay);
a61af66fc99e Initial load
duke
parents:
diff changeset
741
a61af66fc99e Initial load
duke
parents:
diff changeset
742 is_suspended = is_ext_suspend_completed(true /* called_by_wait */,
a61af66fc99e Initial load
duke
parents:
diff changeset
743 delay, bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // It is possible for the external suspend request to be cancelled
a61af66fc99e Initial load
duke
parents:
diff changeset
746 // (by a resume) before the actual suspend operation is completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
747 // Refresh our local copy to see if we still need to wait.
a61af66fc99e Initial load
duke
parents:
diff changeset
748 pending = is_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
750
a61af66fc99e Initial load
duke
parents:
diff changeset
751 if (!pending) {
a61af66fc99e Initial load
duke
parents:
diff changeset
752 // A cancelled suspend request is the only false return from
a61af66fc99e Initial load
duke
parents:
diff changeset
753 // is_ext_suspend_completed() that keeps us from staying in the
a61af66fc99e Initial load
duke
parents:
diff changeset
754 // retry loop.
a61af66fc99e Initial load
duke
parents:
diff changeset
755 *bits |= 0x00080000;
a61af66fc99e Initial load
duke
parents:
diff changeset
756 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
757 }
a61af66fc99e Initial load
duke
parents:
diff changeset
758
a61af66fc99e Initial load
duke
parents:
diff changeset
759 if (is_suspended) {
a61af66fc99e Initial load
duke
parents:
diff changeset
760 *bits |= 0x00100000;
a61af66fc99e Initial load
duke
parents:
diff changeset
761 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
762 }
a61af66fc99e Initial load
duke
parents:
diff changeset
763 } // end retry loop
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // thread did not suspend after all our retries
a61af66fc99e Initial load
duke
parents:
diff changeset
766 *bits |= 0x00200000;
a61af66fc99e Initial load
duke
parents:
diff changeset
767 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
769
a61af66fc99e Initial load
duke
parents:
diff changeset
770 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
771 void JavaThread::record_jump(address target, address instr, const char* file, int line) {
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // This should not need to be atomic as the only way for simultaneous
a61af66fc99e Initial load
duke
parents:
diff changeset
774 // updates is via interrupts. Even then this should be rare or non-existant
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // and we don't care that much anyway.
a61af66fc99e Initial load
duke
parents:
diff changeset
776
a61af66fc99e Initial load
duke
parents:
diff changeset
777 int index = _jmp_ring_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
778 _jmp_ring_index = (index + 1 ) & (jump_ring_buffer_size - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
779 _jmp_ring[index]._target = (intptr_t) target;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 _jmp_ring[index]._instruction = (intptr_t) instr;
a61af66fc99e Initial load
duke
parents:
diff changeset
781 _jmp_ring[index]._file = file;
a61af66fc99e Initial load
duke
parents:
diff changeset
782 _jmp_ring[index]._line = line;
a61af66fc99e Initial load
duke
parents:
diff changeset
783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
784 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // Called by flat profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
787 // Callers have already called wait_for_ext_suspend_completion
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // The assertion for that is currently too complex to put here:
a61af66fc99e Initial load
duke
parents:
diff changeset
789 bool JavaThread::profile_last_Java_frame(frame* _fr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 bool gotframe = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
791 // self suspension saves needed state.
a61af66fc99e Initial load
duke
parents:
diff changeset
792 if (has_last_Java_frame() && _anchor.walkable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
793 *_fr = pd_last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
794 gotframe = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
795 }
a61af66fc99e Initial load
duke
parents:
diff changeset
796 return gotframe;
a61af66fc99e Initial load
duke
parents:
diff changeset
797 }
a61af66fc99e Initial load
duke
parents:
diff changeset
798
a61af66fc99e Initial load
duke
parents:
diff changeset
799 void Thread::interrupt(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
800 trace("interrupt", thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
801 debug_only(check_for_dangling_thread_pointer(thread);)
a61af66fc99e Initial load
duke
parents:
diff changeset
802 os::interrupt(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
803 }
a61af66fc99e Initial load
duke
parents:
diff changeset
804
a61af66fc99e Initial load
duke
parents:
diff changeset
805 bool Thread::is_interrupted(Thread* thread, bool clear_interrupted) {
a61af66fc99e Initial load
duke
parents:
diff changeset
806 trace("is_interrupted", thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
807 debug_only(check_for_dangling_thread_pointer(thread);)
a61af66fc99e Initial load
duke
parents:
diff changeset
808 // Note: If clear_interrupted==false, this simply fetches and
a61af66fc99e Initial load
duke
parents:
diff changeset
809 // returns the value of the field osthread()->interrupted().
a61af66fc99e Initial load
duke
parents:
diff changeset
810 return os::is_interrupted(thread, clear_interrupted);
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812
a61af66fc99e Initial load
duke
parents:
diff changeset
813
a61af66fc99e Initial load
duke
parents:
diff changeset
814 // GC Support
a61af66fc99e Initial load
duke
parents:
diff changeset
815 bool Thread::claim_oops_do_par_case(int strong_roots_parity) {
a61af66fc99e Initial load
duke
parents:
diff changeset
816 jint thread_parity = _oops_do_parity;
a61af66fc99e Initial load
duke
parents:
diff changeset
817 if (thread_parity != strong_roots_parity) {
a61af66fc99e Initial load
duke
parents:
diff changeset
818 jint res = Atomic::cmpxchg(strong_roots_parity, &_oops_do_parity, thread_parity);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3938
diff changeset
819 if (res == thread_parity) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3938
diff changeset
820 return true;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3938
diff changeset
821 } else {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
822 guarantee(res == strong_roots_parity, "Or else what?");
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
823 assert(SharedHeap::heap()->workers()->active_workers() > 0,
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
824 "Should only fail when parallel.");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
825 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
826 }
a61af66fc99e Initial load
duke
parents:
diff changeset
827 }
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
828 assert(SharedHeap::heap()->workers()->active_workers() > 0,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
829 "Should only fail when parallel.");
a61af66fc99e Initial load
duke
parents:
diff changeset
830 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
832
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
833 void Thread::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
834 active_handles()->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
835 // Do oop for ThreadShadow
a61af66fc99e Initial load
duke
parents:
diff changeset
836 f->do_oop((oop*)&_pending_exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
837 handle_area()->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
839
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
840 void Thread::nmethods_do(CodeBlobClosure* cf) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
841 // no nmethods in a generic thread...
0
a61af66fc99e Initial load
duke
parents:
diff changeset
842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
843
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
844 void Thread::metadata_do(void f(Metadata*)) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
845 if (metadata_handles() != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
846 for (int i = 0; i< metadata_handles()->length(); i++) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
847 f(metadata_handles()->at(i));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
848 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
849 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
850 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
851
0
a61af66fc99e Initial load
duke
parents:
diff changeset
852 void Thread::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
853 // get_priority assumes osthread initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
854 if (osthread() != NULL) {
6766
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
855 int os_prio;
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
856 if (os::get_native_priority(this, &os_prio) == OS_OK) {
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
857 st->print("os_prio=%d ", os_prio);
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
858 }
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
859 st->print("tid=" INTPTR_FORMAT " ", this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
860 osthread()->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
861 }
a61af66fc99e Initial load
duke
parents:
diff changeset
862 debug_only(if (WizardMode) print_owned_locks_on(st);)
a61af66fc99e Initial load
duke
parents:
diff changeset
863 }
a61af66fc99e Initial load
duke
parents:
diff changeset
864
a61af66fc99e Initial load
duke
parents:
diff changeset
865 // Thread::print_on_error() is called by fatal error handler. Don't use
a61af66fc99e Initial load
duke
parents:
diff changeset
866 // any lock or allocate memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
867 void Thread::print_on_error(outputStream* st, char* buf, int buflen) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
868 if (is_VM_thread()) st->print("VMThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
869 else if (is_Compiler_thread()) st->print("CompilerThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
870 else if (is_Java_thread()) st->print("JavaThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
871 else if (is_GC_task_thread()) st->print("GCTaskThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
872 else if (is_Watcher_thread()) st->print("WatcherThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
873 else if (is_ConcurrentGC_thread()) st->print("ConcurrentGCThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
874 else st->print("Thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
875
a61af66fc99e Initial load
duke
parents:
diff changeset
876 st->print(" [stack: " PTR_FORMAT "," PTR_FORMAT "]",
a61af66fc99e Initial load
duke
parents:
diff changeset
877 _stack_base - _stack_size, _stack_base);
a61af66fc99e Initial load
duke
parents:
diff changeset
878
a61af66fc99e Initial load
duke
parents:
diff changeset
879 if (osthread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
880 st->print(" [id=%d]", osthread()->thread_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
881 }
a61af66fc99e Initial load
duke
parents:
diff changeset
882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
883
a61af66fc99e Initial load
duke
parents:
diff changeset
884 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
885 void Thread::print_owned_locks_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
886 Monitor *cur = _owned_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
887 if (cur == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
888 st->print(" (no locks) ");
a61af66fc99e Initial load
duke
parents:
diff changeset
889 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
890 st->print_cr(" Locks owned:");
a61af66fc99e Initial load
duke
parents:
diff changeset
891 while(cur) {
a61af66fc99e Initial load
duke
parents:
diff changeset
892 cur->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
893 cur = cur->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
894 }
a61af66fc99e Initial load
duke
parents:
diff changeset
895 }
a61af66fc99e Initial load
duke
parents:
diff changeset
896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 static int ref_use_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 bool Thread::owns_locks_but_compiled_lock() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
901 for(Monitor *cur = _owned_locks; cur; cur = cur->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
902 if (cur != Compile_lock) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
903 }
a61af66fc99e Initial load
duke
parents:
diff changeset
904 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
905 }
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907
a61af66fc99e Initial load
duke
parents:
diff changeset
908 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // The flag: potential_vm_operation notifies if this particular safepoint state could potential
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // invoke the vm-thread (i.e., and oop allocation). In that case, we also have to make sure that
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // no threads which allow_vm_block's are held
a61af66fc99e Initial load
duke
parents:
diff changeset
915 void Thread::check_for_valid_safepoint_state(bool potential_vm_operation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // Check if current thread is allowed to block at a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
917 if (!(_allow_safepoint_count == 0))
a61af66fc99e Initial load
duke
parents:
diff changeset
918 fatal("Possible safepoint reached by thread that does not allow it");
a61af66fc99e Initial load
duke
parents:
diff changeset
919 if (is_Java_thread() && ((JavaThread*)this)->thread_state() != _thread_in_vm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
920 fatal("LEAF method calling lock?");
a61af66fc99e Initial load
duke
parents:
diff changeset
921 }
a61af66fc99e Initial load
duke
parents:
diff changeset
922
a61af66fc99e Initial load
duke
parents:
diff changeset
923 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
924 if (potential_vm_operation && is_Java_thread()
a61af66fc99e Initial load
duke
parents:
diff changeset
925 && !Universe::is_bootstrapping()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
926 // Make sure we do not hold any locks that the VM thread also uses.
a61af66fc99e Initial load
duke
parents:
diff changeset
927 // This could potentially lead to deadlocks
a61af66fc99e Initial load
duke
parents:
diff changeset
928 for(Monitor *cur = _owned_locks; cur; cur = cur->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
929 // Threads_lock is special, since the safepoint synchronization will not start before this is
a61af66fc99e Initial load
duke
parents:
diff changeset
930 // acquired. Hence, a JavaThread cannot be holding it at a safepoint. So is VMOperationRequest_lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
931 // since it is used to transfer control between JavaThreads and the VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
932 // Do not *exclude* any locks unless you are absolutly sure it is correct. Ask someone else first!
a61af66fc99e Initial load
duke
parents:
diff changeset
933 if ( (cur->allow_vm_block() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
934 cur != Threads_lock &&
a61af66fc99e Initial load
duke
parents:
diff changeset
935 cur != Compile_lock && // Temporary: should not be necessary when we get spearate compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
936 cur != VMOperationRequest_lock &&
a61af66fc99e Initial load
duke
parents:
diff changeset
937 cur != VMOperationQueue_lock) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
938 cur->rank() == Mutex::special) {
a61af66fc99e Initial load
duke
parents:
diff changeset
939 warning("Thread holding lock at safepoint that vm can block on: %s", cur->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
940 }
a61af66fc99e Initial load
duke
parents:
diff changeset
941 }
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944 if (GCALotAtAllSafepoints) {
a61af66fc99e Initial load
duke
parents:
diff changeset
945 // We could enter a safepoint here and thus have a gc
a61af66fc99e Initial load
duke
parents:
diff changeset
946 InterfaceSupport::check_gc_alot();
a61af66fc99e Initial load
duke
parents:
diff changeset
947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
948 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
949 }
a61af66fc99e Initial load
duke
parents:
diff changeset
950 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
951
a61af66fc99e Initial load
duke
parents:
diff changeset
952 bool Thread::is_in_stack(address adr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
953 assert(Thread::current() == this, "is_in_stack can only be called from current thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
954 address end = os::current_stack_pointer();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
955 // Allow non Java threads to call this without stack_base
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
956 if (_stack_base == NULL) return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
957 if (stack_base() >= adr && adr >= end) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
958
a61af66fc99e Initial load
duke
parents:
diff changeset
959 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
960 }
a61af66fc99e Initial load
duke
parents:
diff changeset
961
a61af66fc99e Initial load
duke
parents:
diff changeset
962
11146
e619a2766bcc 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 11139
diff changeset
963 bool Thread::is_in_usable_stack(address adr) const {
e619a2766bcc 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 11139
diff changeset
964 size_t stack_guard_size = os::uses_stack_guard_pages() ? (StackYellowPages + StackRedPages) * os::vm_page_size() : 0;
e619a2766bcc 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 11139
diff changeset
965 size_t usable_stack_size = _stack_size - stack_guard_size;
e619a2766bcc 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 11139
diff changeset
966
e619a2766bcc 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 11139
diff changeset
967 return ((adr < stack_base()) && (adr >= stack_base() - usable_stack_size));
e619a2766bcc 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 11139
diff changeset
968 }
e619a2766bcc 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 11139
diff changeset
969
e619a2766bcc 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 11139
diff changeset
970
0
a61af66fc99e Initial load
duke
parents:
diff changeset
971 // We had to move these methods here, because vm threads get into ObjectSynchronizer::enter
a61af66fc99e Initial load
duke
parents:
diff changeset
972 // However, there is a note in JavaThread::is_lock_owned() about the VM threads not being
a61af66fc99e Initial load
duke
parents:
diff changeset
973 // used for compilation in the future. If that change is made, the need for these methods
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // should be revisited, and they should be removed if possible.
a61af66fc99e Initial load
duke
parents:
diff changeset
975
a61af66fc99e Initial load
duke
parents:
diff changeset
976 bool Thread::is_lock_owned(address adr) const {
1688
2dfd013a7465 6975078: assert(allocated_on_res_area() || allocated_on_C_heap() || allocated_on_arena()
kvn
parents: 1608
diff changeset
977 return on_local_stack(adr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
979
a61af66fc99e Initial load
duke
parents:
diff changeset
980 bool Thread::set_as_starting_thread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
981 // NOTE: this must be called inside the main thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
982 return os::create_main_thread((JavaThread*)this);
a61af66fc99e Initial load
duke
parents:
diff changeset
983 }
a61af66fc99e Initial load
duke
parents:
diff changeset
984
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
985 static void initialize_class(Symbol* class_name, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
986 Klass* klass = SystemDictionary::resolve_or_fail(class_name, true, CHECK);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
987 InstanceKlass::cast(klass)->initialize(CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
988 }
a61af66fc99e Initial load
duke
parents:
diff changeset
989
a61af66fc99e Initial load
duke
parents:
diff changeset
990
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // Creates the initial ThreadGroup
a61af66fc99e Initial load
duke
parents:
diff changeset
992 static Handle create_initial_thread_group(TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
993 Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ThreadGroup(), true, CHECK_NH);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
994 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
995
a61af66fc99e Initial load
duke
parents:
diff changeset
996 Handle system_instance = klass->allocate_instance_handle(CHECK_NH);
a61af66fc99e Initial load
duke
parents:
diff changeset
997 {
a61af66fc99e Initial load
duke
parents:
diff changeset
998 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
999 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 system_instance,
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1002 vmSymbols::object_initializer_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1003 vmSymbols::void_method_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 CHECK_NH);
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 Universe::set_system_thread_group(system_instance());
a61af66fc99e Initial load
duke
parents:
diff changeset
1007
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 Handle main_instance = klass->allocate_instance_handle(CHECK_NH);
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 Handle string = java_lang_String::create_from_str("main", CHECK_NH);
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 main_instance,
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1015 vmSymbols::object_initializer_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1016 vmSymbols::threadgroup_string_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 system_instance,
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 string,
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 CHECK_NH);
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 return main_instance;
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1023
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 // Creates the initial Thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 static oop create_initial_thread(Handle thread_group, JavaThread* thread, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
1026 Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1029
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 java_lang_Thread::set_thread(thread_oop(), thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 java_lang_Thread::set_priority(thread_oop(), NormPriority);
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 thread->set_threadObj(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
1033
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 Handle string = java_lang_String::create_from_str("main", CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 JavaCalls::call_special(&result, thread_oop,
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1039 vmSymbols::object_initializer_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1040 vmSymbols::threadgroup_string_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 thread_group,
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 string,
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 return thread_oop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1046
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 static void call_initializeSystemClass(TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
1048 Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 JavaValue result(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1052 JavaCalls::call_static(&result, klass, vmSymbols::initializeSystemClass_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1053 vmSymbols::void_method_signature(), CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1055
6181
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1056 char java_runtime_name[128] = "";
6921
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1057 char java_runtime_version[128] = "";
6181
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1058
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1059 // extract the JRE name from sun.misc.Version.java_runtime_name
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1060 static const char* get_java_runtime_name(TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
1061 Klass* k = SystemDictionary::find(vmSymbols::sun_misc_Version(),
6181
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1062 Handle(), Handle(), CHECK_AND_CLEAR_NULL);
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1063 fieldDescriptor fd;
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1064 bool found = k != NULL &&
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
1065 InstanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_name_name(),
6181
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1066 vmSymbols::string_signature(), &fd);
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1067 if (found) {
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1068 oop name_oop = k->java_mirror()->obj_field(fd.offset());
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1069 if (name_oop == NULL)
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1070 return NULL;
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1071 const char* name = java_lang_String::as_utf8_string(name_oop,
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1072 java_runtime_name,
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1073 sizeof(java_runtime_name));
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1074 return name;
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1075 } else {
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1076 return NULL;
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1077 }
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1078 }
f8de958e5b2c 7176856: add the JRE name to the error log
twisti
parents: 6002
diff changeset
1079
6921
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1080 // extract the JRE version from sun.misc.Version.java_runtime_version
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1081 static const char* get_java_runtime_version(TRAPS) {
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1082 Klass* k = SystemDictionary::find(vmSymbols::sun_misc_Version(),
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1083 Handle(), Handle(), CHECK_AND_CLEAR_NULL);
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1084 fieldDescriptor fd;
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1085 bool found = k != NULL &&
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1086 InstanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_version_name(),
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1087 vmSymbols::string_signature(), &fd);
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1088 if (found) {
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1089 oop name_oop = k->java_mirror()->obj_field(fd.offset());
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1090 if (name_oop == NULL)
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1091 return NULL;
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1092 const char* name = java_lang_String::as_utf8_string(name_oop,
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1093 java_runtime_version,
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1094 sizeof(java_runtime_version));
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1095 return name;
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1096 } else {
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1097 return NULL;
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1098 }
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1099 }
a1b8cf9cf970 8002078: hs_err_pid file should report full JDK version string
sla
parents: 6882
diff changeset
1100
2129
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
1101 // General purpose hook into Java code, run once when the VM is initialized.
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
1102 // The Java library method itself may be changed independently from the VM.
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
1103 static void call_postVMInitHook(TRAPS) {
13004
292050e5d5ea 8026877: Error in opening JAR file when invalid jar specified with -Xbootclasspath/a on OpenJDK build
dholmes
parents: 12880
diff changeset
1104 Klass* k = SystemDictionary::resolve_or_null(vmSymbols::sun_misc_PostVMInitHook(), THREAD);
2129
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
1105 instanceKlassHandle klass (THREAD, k);
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
1106 if (klass.not_null()) {
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
1107 JavaValue result(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1108 JavaCalls::call_static(&result, klass, vmSymbols::run_method_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1109 vmSymbols::void_method_signature(),
2129
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
1110 CHECK);
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
1111 }
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
1112 }
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
1113
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 static void reset_vm_info_property(TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 // the vm info string
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 const char *vm_info = VM_Version::vm_info_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
1118
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 // java.lang.System class
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
1120 Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 // setProperty arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 Handle key_str = java_lang_String::create_from_str("java.vm.info", CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 Handle value_str = java_lang_String::create_from_str(vm_info, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1126
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 // return value
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 JavaValue r(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1129
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 // public static String setProperty(String key, String value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 JavaCalls::call_static(&r,
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1133 vmSymbols::setProperty_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1134 vmSymbols::string_string_string_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 key_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 value_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1139
a61af66fc99e Initial load
duke
parents:
diff changeset
1140
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 void JavaThread::allocate_threadObj(Handle thread_group, char* thread_name, bool daemon, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 assert(thread_group.not_null(), "thread group should be specified");
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 assert(threadObj() == NULL, "should only create Java thread object once");
a61af66fc99e Initial load
duke
parents:
diff changeset
1144
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
1145 Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1148
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 java_lang_Thread::set_thread(thread_oop(), this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 java_lang_Thread::set_priority(thread_oop(), NormPriority);
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 set_threadObj(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
1152
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 if (thread_name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 Handle name = java_lang_String::create_from_str(thread_name, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 // Thread gets assigned specified name and null target
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 thread_oop,
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1160 vmSymbols::object_initializer_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1161 vmSymbols::threadgroup_string_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 thread_group, // Argument 1
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 name, // Argument 2
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 // Thread gets assigned name "Thread-nnn" and null target
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 // (java.lang.Thread doesn't have a constructor taking only a ThreadGroup argument)
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 thread_oop,
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1171 vmSymbols::object_initializer_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1172 vmSymbols::threadgroup_runnable_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 thread_group, // Argument 1
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 Handle(), // Argument 2
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1177
a61af66fc99e Initial load
duke
parents:
diff changeset
1178
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 if (daemon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 java_lang_Thread::set_daemon(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1182
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1186
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1187 KlassHandle group(this, SystemDictionary::ThreadGroup_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 Handle threadObj(this, this->threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
1189
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 thread_group,
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 group,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1193 vmSymbols::add_method_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1194 vmSymbols::thread_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 threadObj, // Arg 1
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1197
a61af66fc99e Initial load
duke
parents:
diff changeset
1198
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1200
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 // NamedThread -- non-JavaThread subclasses with multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // uniquely named instances should derive from this.
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 NamedThread::NamedThread() : Thread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 _name = NULL;
1119
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
1205 _processed_thread = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1207
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 NamedThread::~NamedThread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 if (_name != NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
1210 FREE_C_HEAP_ARRAY(char, _name, mtThread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 _name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1214
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 void NamedThread::set_name(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 guarantee(_name == NULL, "Only get to set name once.");
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
1217 _name = NEW_C_HEAP_ARRAY(char, max_name_len, mtThread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 guarantee(_name != NULL, "alloc failure");
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 jio_vsnprintf(_name, max_name_len, format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1224
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 // ======= WatcherThread ========
a61af66fc99e Initial load
duke
parents:
diff changeset
1226
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 // The watcher thread exists to simulate timer interrupts. It should
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // be replaced by an abstraction over whatever native support for
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // timer interrupts exists on the platform.
a61af66fc99e Initial load
duke
parents:
diff changeset
1230
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 WatcherThread* WatcherThread::_watcher_thread = NULL;
6939
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1232 bool WatcherThread::_startable = false;
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1608
diff changeset
1233 volatile bool WatcherThread::_should_terminate = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1234
11151
5e3b6f79d280 8020701: Avoid crashes in WatcherThread
rbackman
parents: 11146
diff changeset
1235 WatcherThread::WatcherThread() : Thread(), _crash_protection(NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 assert(watcher_thread() == NULL, "we can only allocate one WatcherThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 if (os::create_thread(this, os::watcher_thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 _watcher_thread = this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1239
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 // Set the watcher thread to the highest OS priority which should not be
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 // used, unless a Java thread with priority java.lang.Thread.MAX_PRIORITY
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 // is created. The only normal thread using this priority is the reference
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 // handler thread, which runs for very short intervals only.
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // If the VMThread's priority is not lower than the WatcherThread profiling
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 // will be inaccurate.
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 os::set_priority(this, MaxPriority);
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 if (!DisableStartThread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 os::start_thread(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1252
6939
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1253 int WatcherThread::sleep() const {
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1254 MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag);
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1255
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1256 // remaining will be zero if there are no tasks,
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1257 // causing the WatcherThread to sleep until a task is
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1258 // enrolled
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1259 int remaining = PeriodicTask::time_to_wait();
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1260 int time_slept = 0;
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1261
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1262 // we expect this to timeout - we only ever get unparked when
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1263 // we should terminate or when a new task has been enrolled
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1264 OSThreadWaitState osts(this->osthread(), false /* not Object.wait() */);
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1265
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1266 jlong time_before_loop = os::javaTimeNanos();
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1267
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1268 for (;;) {
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1269 bool timedout = PeriodicTask_lock->wait(Mutex::_no_safepoint_check_flag, remaining);
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1270 jlong now = os::javaTimeNanos();
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1271
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1272 if (remaining == 0) {
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1273 // if we didn't have any tasks we could have waited for a long time
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1274 // consider the time_slept zero and reset time_before_loop
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1275 time_slept = 0;
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1276 time_before_loop = now;
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1277 } else {
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1278 // need to recalulate since we might have new tasks in _tasks
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1279 time_slept = (int) ((now - time_before_loop) / 1000000);
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1280 }
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1281
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1282 // Change to task list or spurious wakeup of some kind
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1283 if (timedout || _should_terminate) {
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1284 break;
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1285 }
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1286
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1287 remaining = PeriodicTask::time_to_wait();
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1288 if (remaining == 0) {
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1289 // Last task was just disenrolled so loop around and wait until
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1290 // another task gets enrolled
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1291 continue;
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1292 }
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1293
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1294 remaining -= time_slept;
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1295 if (remaining <= 0)
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1296 break;
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1297 }
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1298
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1299 return time_slept;
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1300 }
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1301
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 void WatcherThread::run() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 assert(this == watcher_thread(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1304
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 this->record_stack_base_and_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 this->initialize_thread_local_storage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 this->set_active_handles(JNIHandleBlock::allocate_block());
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 while(!_should_terminate) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 assert(watcher_thread() == Thread::current(), "thread consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 assert(watcher_thread() == this, "thread consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1311
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 // Calculate how long it'll be until the next PeriodicTask work
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 // should be done, and sleep that amount of time.
6939
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1314 int time_waited = sleep();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1315
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 if (is_error_reported()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 // A fatal error has happened, the error handler(VMError::report_and_die)
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 // should abort JVM after creating an error log file. However in some
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 // rare cases, the error handler itself might deadlock. Here we try to
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 // kill JVM if the fatal error handler fails to abort in 2 minutes.
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 // This code is in WatcherThread because WatcherThread wakes up
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 // periodically so the fatal error handler doesn't need to do anything;
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 // also because the WatcherThread is less likely to crash than other
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 // threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
1326
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 if (!ShowMessageBoxOnError
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 && (OnError == NULL || OnError[0] == '\0')
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 && Arguments::abort_hook() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 os::sleep(this, 2 * 60 * 1000, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 fdStream err(defaultStream::output_fd());
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 err.print_raw_cr("# [ timer expired, abort... ]");
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 // skip atexit/vm_exit/vm_abort hooks
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 os::die();
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1337
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 // Wake up 5 seconds later, the fatal handler may reset OnError or
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 // ShowMessageBoxOnError when it is ready to abort.
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 os::sleep(this, 5 * 1000, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1343
6939
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1344 PeriodicTask::real_time_tick(time_waited);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1346
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 // Signal that it is terminated
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 MutexLockerEx mu(Terminator_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 _watcher_thread = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 Terminator_lock->notify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1353
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 // Thread destructor usually does this..
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 ThreadLocalStorage::set_thread(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1357
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 void WatcherThread::start() {
6939
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1359 assert(PeriodicTask_lock->owned_by_self(), "PeriodicTask_lock required");
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1360
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1361 if (watcher_thread() == NULL && _startable) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 _should_terminate = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 // Create the single instance of WatcherThread
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 new WatcherThread();
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1367
6939
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1368 void WatcherThread::make_startable() {
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1369 assert(PeriodicTask_lock->owned_by_self(), "PeriodicTask_lock required");
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1370 _startable = true;
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1371 }
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1372
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 void WatcherThread::stop() {
6939
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1374 {
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1375 MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag);
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1376 _should_terminate = true;
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1377 OrderAccess::fence(); // ensure WatcherThread sees update in main loop
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1378
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1379 WatcherThread* watcher = watcher_thread();
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1380 if (watcher != NULL)
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1381 watcher->unpark();
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1382 }
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1383
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 // it is ok to take late safepoints here, if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 MutexLocker mu(Terminator_lock);
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1608
diff changeset
1386
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 while(watcher_thread() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 // This wait should make safepoint checks, wait without a timeout,
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 // and wait as a suspend-equivalent condition.
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 // Note: If the FlatProfiler is running, then this thread is waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 // for the WatcherThread to terminate and the WatcherThread, via the
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 // FlatProfiler task, is waiting for the external suspend request on
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 // this thread to complete. wait_for_ext_suspend_completion() will
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 // eventually timeout, but that takes time. Making this wait a
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 // suspend-equivalent condition solves that timeout problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 Terminator_lock->wait(!Mutex::_no_safepoint_check_flag, 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 Mutex::_as_suspend_equivalent_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1402
6939
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1403 void WatcherThread::unpark() {
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1404 MutexLockerEx ml(PeriodicTask_lock->owned_by_self() ? NULL : PeriodicTask_lock, Mutex::_no_safepoint_check_flag);
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1405 PeriodicTask_lock->notify();
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1406 }
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
1407
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 void WatcherThread::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 st->print("\"%s\" ", name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 Thread::print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1413
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 // ======= JavaThread ========
a61af66fc99e Initial load
duke
parents:
diff changeset
1415
11852
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1416 #ifdef GRAAL
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1417
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1418 #if GRAAL_COUNTERS_SIZE > 0
11893
ec267141f753 more javadoc and output tweaks for dynamic counters
Lukas Stadler <lukas.stadler@jku.at>
parents: 11852
diff changeset
1419 jlong JavaThread::_graal_old_thread_counters[GRAAL_COUNTERS_SIZE];
11852
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1420
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1421 bool graal_counters_include(oop threadObj) {
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1422 return !GRAAL_COUNTERS_EXCLUDE_COMPILER_THREADS || threadObj == NULL || threadObj->klass() != SystemDictionary::CompilerThread_klass();
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1423 }
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1424
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1425 void JavaThread::collect_counters(typeArrayOop array) {
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1426 MutexLocker tl(Threads_lock);
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1427 for (int i = 0; i < array->length(); i++) {
11893
ec267141f753 more javadoc and output tweaks for dynamic counters
Lukas Stadler <lukas.stadler@jku.at>
parents: 11852
diff changeset
1428 array->long_at_put(i, _graal_old_thread_counters[i]);
11852
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1429 }
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1430 for (JavaThread* tp = Threads::first(); tp != NULL; tp = tp->next()) {
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1431 if (graal_counters_include(tp->threadObj())) {
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1432 for (int i = 0; i < array->length(); i++) {
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1433 array->long_at_put(i, array->long_at(i) + tp->_graal_counters[i]);
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1434 }
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1435 }
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1436 }
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1437 }
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1438 #else
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1439 void JavaThread::collect_counters(typeArrayOop array) {
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1440 // empty
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1441 }
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1442 #endif // GRAAL_COUNTERS_SIZE > 0
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1443
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1444 #endif // GRAAL
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1445
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 // A JavaThread is a normal Java thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1447
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 void JavaThread::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 // Initialize fields
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1450
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1451 // Set the claimed par_id to -1 (ie not claiming any par_ids)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1452 set_claimed_par_id(-1);
3555
22d11b3bc561 Various hacks to be able to install machine code from a Java thread.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 3464
diff changeset
1453
22d11b3bc561 Various hacks to be able to install machine code from a Java thread.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 3464
diff changeset
1454 _buffer_blob = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 set_saved_exception_pc(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 set_threadObj(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 _anchor.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 set_entry_point(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 set_jni_functions(jni_functions());
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 set_callee_target(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 set_vm_result(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 set_vm_result_2(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 set_vframe_array_head(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 set_vframe_array_last(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 set_deferred_locals(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 set_deopt_mark(NULL);
1814
fd5d4527cdf5 6986270: guarantee(*bcp != Bytecodes::_monitorenter || exec_mode != Deoptimization::Unpack_exception) fails
iveresov
parents: 1731
diff changeset
1467 set_deopt_nmethod(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 clear_must_deopt_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 set_monitor_chunks(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 set_next(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 set_thread_state(_thread_new);
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
1472 #if INCLUDE_NMT
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
1473 set_recorder(NULL);
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
1474 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 _terminated = _not_terminated;
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 _privileged_stack_top = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 _array_for_gc = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 _suspend_equivalent = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 _in_deopt_handler = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 _doing_unsafe_access = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 _stack_guard_state = stack_guard_unused;
5747
120820e30baa added basic high-level interpreter support to HotSpot
Christian Haeubl <haeubl@ssw.jku.at>
parents: 5111
diff changeset
1482 #ifdef GRAAL
4993
897b7d18bebc added RiCompiledMethod.execute and the required VM infrastructure
Lukas Stadler <lukas.stadler@jku.at>
parents: 4981
diff changeset
1483 _graal_alternate_call_target = NULL;
13089
77fbf02f701c re-enabled protection against recursive Graal compilation requests with Graal specific _graal_compiling field in JavaThread
Doug Simon <doug.simon@oracle.com>
parents: 13086
diff changeset
1484 _graal_implicit_exception_pc = NULL;
77fbf02f701c re-enabled protection against recursive Graal compilation requests with Graal specific _graal_compiling field in JavaThread
Doug Simon <doug.simon@oracle.com>
parents: 13086
diff changeset
1485 _graal_compiling = false;
11893
ec267141f753 more javadoc and output tweaks for dynamic counters
Lukas Stadler <lukas.stadler@jku.at>
parents: 11852
diff changeset
1486 #if GRAAL_COUNTERS_SIZE > 0
11852
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1487 for (int i = 0; i < GRAAL_COUNTERS_SIZE; i++) {
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1488 _graal_counters[i] = 0;
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1489 }
11893
ec267141f753 more javadoc and output tweaks for dynamic counters
Lukas Stadler <lukas.stadler@jku.at>
parents: 11852
diff changeset
1490 #endif // GRAAL_COUNTER_SIZE > 0
ec267141f753 more javadoc and output tweaks for dynamic counters
Lukas Stadler <lukas.stadler@jku.at>
parents: 11852
diff changeset
1491 #endif // GRAAL
12316
190899198332 7195622: CheckUnhandledOops has limited usefulness now
hseigel
parents: 12253
diff changeset
1492 (void)const_cast<oop&>(_exception_oop = NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 _exception_pc = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 _exception_handler_pc = 0;
1903
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1843
diff changeset
1495 _is_method_handle_return = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 _jvmti_thread_state= NULL;
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1166
diff changeset
1497 _should_post_on_exceptions_flag = JNI_FALSE;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 _jvmti_get_loaded_classes_closure = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 _interp_only_mode = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 _special_runtime_exit_condition = _no_async_condition;
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 _pending_async_exception = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 _thread_stat = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 _thread_stat = new ThreadStatistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 _blocked_on_compilation = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 _jni_active_critical = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 _do_not_unlock_if_synchronized = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 _cached_monitor_info = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 _parker = Parker::Allocate(this) ;
3696
dc7902820c9b Make NMethodSweeper work on any JavaThread
Gilles Duboscq <gilles.m.duboscq@gmail.com>
parents: 3650
diff changeset
1509 _scanned_nmethod = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1510
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 _jmp_ring_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 for (int ji = 0 ; ji < jump_ring_buffer_size ; ji++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 record_jump(NULL, NULL, NULL, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
1517
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 set_thread_profiler(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 if (FlatProfiler::is_active()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 // This is where we would decide to either give each thread it's own profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 // or use one global one from FlatProfiler,
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 // or up to some count of the number of profiled threads, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 ThreadProfiler* pp = new ThreadProfiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 pp->engage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 set_thread_profiler(pp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1527
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 // Setup safepoint state info for this thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 ThreadSafepointState::create(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1530
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 debug_only(_java_call_counter = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1532
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 // JVMTI PopFrame support
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 _popframe_condition = popframe_inactive;
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 _popframe_preserved_args = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 _popframe_preserved_args_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1537
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 pd_initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1540
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
1541 #if INCLUDE_ALL_GCS
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1542 SATBMarkQueueSet JavaThread::_satb_mark_queue_set;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1543 DirtyCardQueueSet JavaThread::_dirty_card_queue_set;
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
1544 #endif // INCLUDE_ALL_GCS
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1545
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1546 JavaThread::JavaThread(bool is_attaching_via_jni) :
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1547 Thread()
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
1548 #if INCLUDE_ALL_GCS
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1549 , _satb_mark_queue(&_satb_mark_queue_set),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1550 _dirty_card_queue(&_dirty_card_queue_set)
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
1551 #endif // INCLUDE_ALL_GCS
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1552 {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 initialize();
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1554 if (is_attaching_via_jni) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1555 _jni_attach_state = _attaching_via_jni;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1556 } else {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1557 _jni_attach_state = _not_attaching_via_jni;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1558 }
8011
06fd03af6ce4 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 7615
diff changeset
1559 assert(deferred_card_mark().is_empty(), "Default MemRegion ctor");
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
1560 _safepoint_visible = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1562
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 bool JavaThread::reguard_stack(address cur_sp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 if (_stack_guard_state != stack_guard_yellow_disabled) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 return true; // Stack already guarded or guard pages not needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1567
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 if (register_stack_overflow()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 // For those architectures which have separate register and
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 // memory stacks, we must check the register stack to see if
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 // it has overflowed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1574
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 // Java code never executes within the yellow zone: the latter is only
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 // there to provoke an exception during stack banging. If java code
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 // is executing there, either StackShadowPages should be larger, or
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 // some exception code in c1, c2 or the interpreter isn't unwinding
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 // when it should.
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 guarantee(cur_sp > stack_yellow_zone_base(), "not enough space to reguard - increase StackShadowPages");
a61af66fc99e Initial load
duke
parents:
diff changeset
1581
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 enable_stack_yellow_zone();
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1585
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 bool JavaThread::reguard_stack(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 return reguard_stack(os::current_stack_pointer());
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1589
a61af66fc99e Initial load
duke
parents:
diff changeset
1590
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 void JavaThread::block_if_vm_exited() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 if (_terminated == _vm_exited) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 // _vm_exited is set at safepoint, and Threads_lock is never released
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 // we will block here forever
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 Threads_lock->lock_without_safepoint_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1599
a61af66fc99e Initial load
duke
parents:
diff changeset
1600
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 // Remove this ifdef when C1 is ported to the compiler interface.
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 static void compiler_thread_entry(JavaThread* thread, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
1603
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1604 JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1605 Thread()
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
1606 #if INCLUDE_ALL_GCS
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1607 , _satb_mark_queue(&_satb_mark_queue_set),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1608 _dirty_card_queue(&_dirty_card_queue_set)
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
1609 #endif // INCLUDE_ALL_GCS
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1610 {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 if (TraceThreadEvents) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 tty->print_cr("creating thread %p", this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 initialize();
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1615 _jni_attach_state = _not_attaching_via_jni;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 set_entry_point(entry_point);
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 // Create the native thread itself.
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 // %note runtime_23
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 os::ThreadType thr_type = os::java_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread :
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 os::java_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 os::create_thread(this, thr_type, stack_sz);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
1623 _safepoint_visible = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 // The _osthread may be NULL here because we ran out of memory (too many threads active).
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 // We need to throw and OutOfMemoryError - however we cannot do this here because the caller
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 // may hold a lock and all locks must be unlocked before throwing the exception (throwing
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 // the exception consists of creating the exception object & initializing it, initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 // will leave the VM via a JavaCall and then all locks must be unlocked).
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 // The thread is still suspended when we reach here. Thread must be explicit started
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 // by creator! Furthermore, the thread must also explicitly be added to the Threads list
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 // by calling Threads:add. The reason why this is not done here, is because the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 // object must be fully initialized (take a look at JVM_Start)
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1635
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 JavaThread::~JavaThread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 if (TraceThreadEvents) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 tty->print_cr("terminate thread %p", this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1640
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
1641 // By now, this thread should already be invisible to safepoint,
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
1642 // and its per-thread recorder also collected.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
1643 assert(!is_safepoint_visible(), "wrong state");
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
1644 #if INCLUDE_NMT
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
1645 assert(get_recorder() == NULL, "Already collected");
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
1646 #endif // INCLUDE_NMT
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
1647
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 // JSR166 -- return the parker to the free list
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 Parker::Release(_parker);
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 _parker = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1651
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 // Free any remaining previous UnrollBlock
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 vframeArray* old_array = vframe_array_last();
a61af66fc99e Initial load
duke
parents:
diff changeset
1654
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 if (old_array != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 Deoptimization::UnrollBlock* old_info = old_array->unroll_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 old_array->set_unroll_block(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 delete old_info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 delete old_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1661
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 GrowableArray<jvmtiDeferredLocalVariableSet*>* deferred = deferred_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 if (deferred != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 // This can only happen if thread is destroyed before deoptimization occurs.
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 assert(deferred->length() != 0, "empty array!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 jvmtiDeferredLocalVariableSet* dlv = deferred->at(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 deferred->remove_at(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 // individual jvmtiDeferredLocalVariableSet are CHeapObj's
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 delete dlv;
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 } while (deferred->length() != 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 delete deferred;
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1674
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 // All Java related clean up happens in exit
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 ThreadSafepointState::destroy(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 if (_thread_profiler != NULL) delete _thread_profiler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 if (_thread_stat != NULL) delete _thread_stat;
11852
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1679
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1680 #if defined(GRAAL) && (GRAAL_COUNTERS_SIZE > 0)
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1681 if (graal_counters_include(threadObj())) {
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1682 for (int i = 0; i < GRAAL_COUNTERS_SIZE; i++) {
11893
ec267141f753 more javadoc and output tweaks for dynamic counters
Lukas Stadler <lukas.stadler@jku.at>
parents: 11852
diff changeset
1683 _graal_old_thread_counters[i] += _graal_counters[i];
11852
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1684 }
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1685 }
d7964e96b0b0 move benchmark counters into separate class and make them correct for multithreaded applications
Lukas Stadler <lukas.stadler@jku.at>
parents: 11173
diff changeset
1686 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1688
a61af66fc99e Initial load
duke
parents:
diff changeset
1689
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 // The first routine called by a new Java thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 void JavaThread::run() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 // initialize thread-local alloc buffer related fields
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 this->initialize_tlab();
a61af66fc99e Initial load
duke
parents:
diff changeset
1694
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 // used to test validitity of stack trace backs
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 this->record_base_of_stack_pointer();
a61af66fc99e Initial load
duke
parents:
diff changeset
1697
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 // Record real stack base and size.
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 this->record_stack_base_and_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1700
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 // Initialize thread local storage; set before calling MutexLocker
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 this->initialize_thread_local_storage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1703
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 this->create_stack_guard_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
1705
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1608
diff changeset
1706 this->cache_global_variables();
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1608
diff changeset
1707
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 // Thread is now sufficient initialized to be handled by the safepoint code as being
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 // in the VM. Change thread state from _thread_new to _thread_in_vm
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 ThreadStateTransition::transition_and_fence(this, _thread_new, _thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1711
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 assert(JavaThread::current() == this, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 assert(!Thread::current()->owns_locks(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1714
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 DTRACE_THREAD_PROBE(start, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1716
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 // This operation might block. We call that after all safepoint checks for a new thread has
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 // been completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 this->set_active_handles(JNIHandleBlock::allocate_block());
a61af66fc99e Initial load
duke
parents:
diff changeset
1720
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 JvmtiExport::post_thread_start(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1724
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
1725 EventThreadStart event;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
1726 if (event.should_commit()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
1727 event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj()));
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
1728 event.commit();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
1729 }
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4095
diff changeset
1730
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 // We call another function to do the rest so we are sure that the stack addresses used
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 // from there will be lower than the stack base just computed
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 thread_main_inner();
a61af66fc99e Initial load
duke
parents:
diff changeset
1734
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 // Note, thread is no longer valid at this point!
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1737
a61af66fc99e Initial load
duke
parents:
diff changeset
1738
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 void JavaThread::thread_main_inner() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 assert(JavaThread::current() == this, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 assert(this->threadObj() != NULL, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1742
2162
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 2129
diff changeset
1743 // Execute thread entry point unless this thread has a pending exception
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 2129
diff changeset
1744 // or has been stopped before starting.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 // Note: Due to JVM_StopThread we can have pending exceptions already!
2162
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 2129
diff changeset
1746 if (!this->has_pending_exception() &&
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 2129
diff changeset
1747 !java_lang_Thread::is_stillborn(this->threadObj())) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1748 {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1749 ResourceMark rm(this);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1750 this->set_native_thread_name(this->get_thread_name());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1751 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 HandleMark hm(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 this->entry_point()(this, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1755
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 DTRACE_THREAD_PROBE(stop, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1757
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 this->exit(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 delete this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1761
a61af66fc99e Initial load
duke
parents:
diff changeset
1762
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 static void ensure_join(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 // We do not need to grap the Threads_lock, since we are operating on ourself.
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 Handle threadObj(thread, thread->threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 assert(threadObj.not_null(), "java thread object must exist");
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 ObjectLocker lock(threadObj, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 // Ignore pending exception (ThreadDeath), since we are exiting anyway
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 thread->clear_pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 // Thread is exiting. So set thread_status field in java.lang.Thread class to TERMINATED.
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED);
2162
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 2129
diff changeset
1772 // Clear the native thread instance - this makes isAlive return false and allows the join()
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 2129
diff changeset
1773 // to complete once we've done the notify_all below
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 java_lang_Thread::set_thread(threadObj(), NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 lock.notify_all(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 // Ignore pending exception (ThreadDeath), since we are exiting anyway
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 thread->clear_pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1779
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1780
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 // For any new cleanup additions, please check to see if they need to be applied to
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 // cleanup_failed_attach_current_thread as well.
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 void JavaThread::exit(bool destroy_vm, ExitType exit_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 assert(this == JavaThread::current(), "thread consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1785
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 HandleMark hm(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 Handle uncaught_exception(this, this->pending_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 this->clear_pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 Handle threadObj(this, this->threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 assert(threadObj.not_null(), "Java thread object should be created");
a61af66fc99e Initial load
duke
parents:
diff changeset
1791
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 if (get_thread_profiler() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 get_thread_profiler()->disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 get_thread_profiler()->print(get_thread_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1797
a61af66fc99e Initial load
duke
parents:
diff changeset
1798
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 // FIXIT: This code should be moved into else part, when reliable 1.2/1.3 check is in place
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1802
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 // FIXIT: The is_null check is only so it works better on JDK1.2 VM's. This
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 // has to be fixed by a runtime query method
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 if (!destroy_vm || JDK_Version::is_jdk12x_version()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 // JSR-166: change call from from ThreadGroup.uncaughtException to
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 // java.lang.Thread.dispatchUncaughtException
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 if (uncaught_exception.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 Handle group(this, java_lang_Thread::threadGroup(threadObj()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 // Check if the method Thread.dispatchUncaughtException() exists. If so
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 // call it. Otherwise we have an older library without the JSR-166 changes,
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 // so call ThreadGroup.uncaughtException()
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 KlassHandle recvrKlass(THREAD, threadObj->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 CallInfo callinfo;
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1819 KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 LinkResolver::resolve_virtual_call(callinfo, threadObj, recvrKlass, thread_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1821 vmSymbols::dispatchUncaughtException_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1822 vmSymbols::throwable_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 KlassHandle(), false, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 methodHandle method = callinfo.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 if (method.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 JavaCalls::call_virtual(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 threadObj, thread_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1830 vmSymbols::dispatchUncaughtException_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1831 vmSymbols::throwable_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 uncaught_exception,
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 } else {
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1835 KlassHandle thread_group(THREAD, SystemDictionary::ThreadGroup_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 JavaCalls::call_virtual(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 group, thread_group,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1839 vmSymbols::uncaughtException_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1840 vmSymbols::thread_throwable_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 threadObj, // Arg 1
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 uncaught_exception, // Arg 2
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 }
2200
fb539912d338 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 2177
diff changeset
1845 if (HAS_PENDING_EXCEPTION) {
fb539912d338 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 2177
diff changeset
1846 ResourceMark rm(this);
fb539912d338 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 2177
diff changeset
1847 jio_fprintf(defaultStream::error_stream(),
fb539912d338 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 2177
diff changeset
1848 "\nException: %s thrown from the UncaughtExceptionHandler"
fb539912d338 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 2177
diff changeset
1849 " in thread \"%s\"\n",
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6939
diff changeset
1850 pending_exception()->klass()->external_name(),
2200
fb539912d338 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 2177
diff changeset
1851 get_thread_name());
fb539912d338 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 2177
diff changeset
1852 CLEAR_PENDING_EXCEPTION;
fb539912d338 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 2177
diff changeset
1853 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1856
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4095
diff changeset
1857 // Called before the java thread exit since we want to read info
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4095
diff changeset
1858 // from java_lang_Thread object
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
1859 EventThreadEnd event;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
1860 if (event.should_commit()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
1861 event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj()));
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
1862 event.commit();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
1863 }
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4095
diff changeset
1864
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4095
diff changeset
1865 // Call after last event on thread
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4095
diff changeset
1866 EVENT_THREAD_EXIT(this);
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4095
diff changeset
1867
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 // Call Thread.exit(). We try 3 times in case we got another Thread.stop during
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 // the execution of the method. If that is not enough, then we don't really care. Thread.stop
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 // is deprecated anyhow.
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12316
diff changeset
1871 if (!is_Compiler_thread()) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12316
diff changeset
1872 int count = 3;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 while (java_lang_Thread::threadGroup(threadObj()) != NULL && (count-- > 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 JavaValue result(T_VOID);
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1876 KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 JavaCalls::call_virtual(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 threadObj, thread_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1879 vmSymbols::exit_method_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1880 vmSymbols::void_method_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 // notify JVMTI
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 JvmtiExport::post_thread_end(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1889
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 // We have notified the agents that we are exiting, before we go on,
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 // we must check for a pending external suspend request and honor it
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 // in order to not surprise the thread that made the suspend request.
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 if (!is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 set_terminated(_thread_exiting);
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 ThreadService::current_thread_exiting(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 // Implied else:
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 // Things get a little tricky here. We have a pending external
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 // suspend request, but we are holding the SR_lock so we
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 // can't just self-suspend. So we temporarily drop the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 // and then self-suspend.
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1907
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 ThreadBlockInVM tbivm(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 java_suspend_self();
a61af66fc99e Initial load
duke
parents:
diff changeset
1910
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 // We're done with this suspend request, but we have to loop around
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 // and check again. Eventually we will get SR_lock without a pending
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 // external suspend request and will be able to mark ourselves as
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 // exiting.
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 // no more external suspends are allowed at this point
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 // before_exit() has already posted JVMTI THREAD_END events
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1920
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 // Notify waiters on thread object. This has to be done after exit() is called
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 // on the thread (if the thread is the last thread in a daemon ThreadGroup the
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 // group should have the destroyed bit set before waiters are notified).
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 ensure_join(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 assert(!this->has_pending_exception(), "ensure_join should have cleared");
a61af66fc99e Initial load
duke
parents:
diff changeset
1926
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 // 6282335 JNI DetachCurrentThread spec states that all Java monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 // held by this thread must be released. A detach operation must only
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 // get here if there are no Java frames on the stack. Therefore, any
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 // owned monitors at this point MUST be JNI-acquired monitors which are
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 // pre-inflated and in the monitor cache.
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 // ensure_join() ignores IllegalThreadStateExceptions, and so does this.
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 if (exit_type == jni_detach && JNIDetachReleasesMonitors) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 assert(!this->has_last_Java_frame(), "detaching with Java frames?");
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 ObjectSynchronizer::release_monitors_owned_by_thread(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 assert(!this->has_pending_exception(), "release_monitors should have cleared");
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1939
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 // These things needs to be done while we are still a Java Thread. Make sure that thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 // is in a consistent state, in case GC happens
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 assert(_privileged_stack_top == NULL, "must be NULL when we get here");
a61af66fc99e Initial load
duke
parents:
diff changeset
1943
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 if (active_handles() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 JNIHandleBlock* block = active_handles();
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 set_active_handles(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 JNIHandleBlock::release_block(block);
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1949
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 if (free_handle_block() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 JNIHandleBlock* block = free_handle_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 set_free_handle_block(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 JNIHandleBlock::release_block(block);
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1955
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 // These have to be removed while this is still a valid thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 remove_stack_guard_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
1958
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 if (UseTLAB) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 tlab().make_parsable(true); // retire TLAB
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1962
2126
db2b0f8c1cef 6814943: getcpool001 catches more than one JvmtiThreadState problem
kamg
parents: 2100
diff changeset
1963 if (JvmtiEnv::environments_might_exist()) {
49
31000d79ec71 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 0
diff changeset
1964 JvmtiExport::cleanup_thread(this);
31000d79ec71 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 0
diff changeset
1965 }
31000d79ec71 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 0
diff changeset
1966
8011
06fd03af6ce4 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 7615
diff changeset
1967 // We must flush any deferred card marks before removing a thread from
06fd03af6ce4 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 7615
diff changeset
1968 // the list of active threads.
06fd03af6ce4 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 7615
diff changeset
1969 Universe::heap()->flush_deferred_store_barrier(this);
06fd03af6ce4 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 7615
diff changeset
1970 assert(deferred_card_mark().is_empty(), "Should have been flushed");
06fd03af6ce4 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 7615
diff changeset
1971
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
1972 #if INCLUDE_ALL_GCS
8011
06fd03af6ce4 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 7615
diff changeset
1973 // We must flush the G1-related buffers before removing a thread
06fd03af6ce4 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 7615
diff changeset
1974 // from the list of active threads. We must do this after any deferred
06fd03af6ce4 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 7615
diff changeset
1975 // card marks have been flushed (above) so that any entries that are
06fd03af6ce4 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 7615
diff changeset
1976 // added to the thread's dirty card queue as a result are not lost.
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1977 if (UseG1GC) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1978 flush_barrier_queues();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1979 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
1980 #endif // INCLUDE_ALL_GCS
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1981
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 // Remove from list of active threads list, and notify VM thread if we are the last non-daemon thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 Threads::remove(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1985
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
1986 #if INCLUDE_ALL_GCS
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1987 // Flush G1-related queues.
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1988 void JavaThread::flush_barrier_queues() {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1989 satb_mark_queue().flush();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1990 dirty_card_queue().flush();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1991 }
1842
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
1992
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
1993 void JavaThread::initialize_queues() {
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
1994 assert(!SafepointSynchronize::is_at_safepoint(),
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
1995 "we should not be at a safepoint");
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
1996
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
1997 ObjPtrQueue& satb_queue = satb_mark_queue();
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
1998 SATBMarkQueueSet& satb_queue_set = satb_mark_queue_set();
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
1999 // The SATB queue should have been constructed with its active
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2000 // field set to false.
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2001 assert(!satb_queue.is_active(), "SATB queue should not be active");
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2002 assert(satb_queue.is_empty(), "SATB queue should be empty");
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2003 // If we are creating the thread during a marking cycle, we should
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2004 // set the active field of the SATB queue to true.
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2005 if (satb_queue_set.is_active()) {
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2006 satb_queue.set_active(true);
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2007 }
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2008
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2009 DirtyCardQueue& dirty_queue = dirty_card_queue();
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2010 // The dirty card queue should have been constructed with its
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2011 // active field set to true.
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2012 assert(dirty_queue.is_active(), "dirty card queue should be active");
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
2013 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
2014 #endif // INCLUDE_ALL_GCS
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2015
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 void JavaThread::cleanup_failed_attach_current_thread() {
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2017 if (get_thread_profiler() != NULL) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2018 get_thread_profiler()->disengage();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2019 ResourceMark rm;
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2020 get_thread_profiler()->print(get_thread_name());
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2021 }
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2022
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2023 if (active_handles() != NULL) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2024 JNIHandleBlock* block = active_handles();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2025 set_active_handles(NULL);
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2026 JNIHandleBlock::release_block(block);
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2027 }
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2028
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2029 if (free_handle_block() != NULL) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2030 JNIHandleBlock* block = free_handle_block();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2031 set_free_handle_block(NULL);
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2032 JNIHandleBlock::release_block(block);
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2033 }
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2034
1290
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1213
diff changeset
2035 // These have to be removed while this is still a valid thread.
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1213
diff changeset
2036 remove_stack_guard_pages();
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1213
diff changeset
2037
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2038 if (UseTLAB) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2039 tlab().make_parsable(true); // retire TLAB, if any
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2040 }
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2041
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
2042 #if INCLUDE_ALL_GCS
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2043 if (UseG1GC) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2044 flush_barrier_queues();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2045 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
2046 #endif // INCLUDE_ALL_GCS
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2047
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2048 Threads::remove(this);
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2049 delete this;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2051
a61af66fc99e Initial load
duke
parents:
diff changeset
2052
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2053
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
2054
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 JavaThread* JavaThread::active() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 Thread* thread = ThreadLocalStorage::thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 assert(thread != NULL, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 if (thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 return (JavaThread*) thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 assert(thread->is_VM_thread(), "this must be a vm thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 VM_Operation* op = ((VMThread*) thread)->vm_operation();
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 JavaThread *ret=op == NULL ? NULL : (JavaThread *)op->calling_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 assert(ret->is_Java_thread(), "must be a Java thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2068
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 bool JavaThread::is_lock_owned(address adr) const {
702
b9fba36710f2 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 669
diff changeset
2070 if (Thread::is_lock_owned(adr)) return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2071
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 for (MonitorChunk* chunk = monitor_chunks(); chunk != NULL; chunk = chunk->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 if (chunk->contains(adr)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2075
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2078
a61af66fc99e Initial load
duke
parents:
diff changeset
2079
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 void JavaThread::add_monitor_chunk(MonitorChunk* chunk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 chunk->set_next(monitor_chunks());
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 set_monitor_chunks(chunk);
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2084
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 void JavaThread::remove_monitor_chunk(MonitorChunk* chunk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 guarantee(monitor_chunks() != NULL, "must be non empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 if (monitor_chunks() == chunk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 set_monitor_chunks(chunk->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 MonitorChunk* prev = monitor_chunks();
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 while (prev->next() != chunk) prev = prev->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 prev->set_next(chunk->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2095
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 // JVM support.
a61af66fc99e Initial load
duke
parents:
diff changeset
2097
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 // Note: this function shouldn't block if it's called in
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 // _thread_in_native_trans state (such as from
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 // check_special_condition_for_native_trans()).
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 void JavaThread::check_and_handle_async_exceptions(bool check_unsafe_error) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2102
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 if (has_last_Java_frame() && has_async_condition()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 // If we are at a polling page safepoint (not a poll return)
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 // then we must defer async exception because live registers
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 // will be clobbered by the exception path. Poll return is
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 // ok because the call we a returning from already collides
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 // with exception handling registers and so there is no issue.
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 // (The exception handling path kills call result registers but
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 // this is ok since the exception kills the result anyway).
a61af66fc99e Initial load
duke
parents:
diff changeset
2111
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 if (is_at_poll_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 // if the code we are returning to has deoptimized we must defer
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 // the exception otherwise live registers get clobbered on the
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 // exception path before deoptimization is able to retrieve them.
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 RegisterMap map(this, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 frame caller_fr = last_frame().sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 assert(caller_fr.is_compiled_frame(), "what?");
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 if (caller_fr.is_deoptimized_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 if (TraceExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 tty->print_cr("deferred async exception at compiled safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2129
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 JavaThread::AsyncRequests condition = clear_special_runtime_exit_condition();
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 if (condition == _no_async_condition) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 // Conditions have changed since has_special_runtime_exit_condition()
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 // was called:
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 // - if we were here only because of an external suspend request,
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 // then that was taken care of above (or cancelled) so we are done
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 // - if we were here because of another async request, then it has
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 // been cleared between the has_special_runtime_exit_condition()
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 // and now so again we are done
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2141
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 // Check for pending async. exception
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 if (_pending_async_exception != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 // Only overwrite an already pending exception, if it is not a threadDeath.
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
2145 if (!has_pending_exception() || !pending_exception()->is_a(SystemDictionary::ThreadDeath_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2146
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 // We cannot call Exceptions::_throw(...) here because we cannot block
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 set_pending_exception(_pending_async_exception, __FILE__, __LINE__);
a61af66fc99e Initial load
duke
parents:
diff changeset
2149
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 if (TraceExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 tty->print("Async. exception installed at runtime exit (" INTPTR_FORMAT ")", this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 if (has_last_Java_frame() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 frame f = last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 tty->print(" (pc: " INTPTR_FORMAT " sp: " INTPTR_FORMAT " )", f.pc(), f.sp());
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2157 tty->print_cr(" of type: %s", InstanceKlass::cast(_pending_async_exception->klass())->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 _pending_async_exception = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 clear_has_async_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2163
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 if (check_unsafe_error &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 condition == _async_unsafe_access_error && !has_pending_exception()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 condition = _no_async_condition; // done
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 switch (thread_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 case _thread_in_vm:
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 JavaThread* THREAD = this;
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 THROW_MSG(vmSymbols::java_lang_InternalError(), "a fault occurred in an unsafe memory access operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 case _thread_in_native:
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 ThreadInVMfromNative tiv(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 JavaThread* THREAD = this;
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 THROW_MSG(vmSymbols::java_lang_InternalError(), "a fault occurred in an unsafe memory access operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 case _thread_in_Java:
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 ThreadInVMfromJava tiv(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 JavaThread* THREAD = this;
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 THROW_MSG(vmSymbols::java_lang_InternalError(), "a fault occurred in a recent unsafe memory access operation in compiled Java code");
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2189
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 assert(condition == _no_async_condition || has_pending_exception() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 (!check_unsafe_error && condition == _async_unsafe_access_error),
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 "must have handled the async condition, if no exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2194
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 void JavaThread::handle_special_runtime_exit_condition(bool check_asyncs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 // Check for pending external suspend. Internal suspend requests do
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 // not use handle_special_runtime_exit_condition().
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 // If JNIEnv proxies are allowed, don't self-suspend if the target
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 // thread is not the current thread. In older versions of jdbx, jdbx
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 // threads could call into the VM with another thread's JNIEnv so we
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 // can be here operating on behalf of a suspended thread (4432884).
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 bool do_self_suspend = is_external_suspend_with_lock();
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 if (do_self_suspend && (!AllowJNIEnvProxy || this == JavaThread::current())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 // Because thread is external suspended the safepoint code will count
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 // thread as at a safepoint. This can be odd because we can be here
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 // as _thread_in_Java which would normally transition to _thread_blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 // at a safepoint. We would like to mark the thread as _thread_blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 // before calling java_suspend_self like all other callers of it but
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 // we must then observe proper safepoint protocol. (We can't leave
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 // _thread_blocked with a safepoint in progress). However we can be
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 // here as _thread_in_native_trans so we can't use a normal transition
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 // constructor/destructor pair because they assert on that type of
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 // transition. We could do something like:
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 // JavaThreadState state = thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 // set_thread_state(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 // {
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 // ThreadBlockInVM tbivm(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 // java_suspend_self()
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 // set_thread_state(_thread_in_vm_trans);
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 // if (safepoint) block;
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 // set_thread_state(state);
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 // but that is pretty messy. Instead we just go with the way the
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 // code has worked before and note that this is the only path to
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 // java_suspend_self that doesn't put the thread in _thread_blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 // mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
2231
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 frame_anchor()->make_walkable(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 java_suspend_self();
a61af66fc99e Initial load
duke
parents:
diff changeset
2234
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 // We might be here for reasons in addition to the self-suspend request
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 // so check for other async requests.
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2238
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 if (check_asyncs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 check_and_handle_async_exceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2243
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 void JavaThread::send_thread_stop(oop java_throwable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 assert(Thread::current()->is_VM_thread(), "should be in the vm thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 assert(Threads_lock->is_locked(), "Threads_lock should be locked by safepoint code");
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 assert(SafepointSynchronize::is_at_safepoint(), "all threads are stopped");
a61af66fc99e Initial load
duke
parents:
diff changeset
2248
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 // Do not throw asynchronous exceptions against the compiler thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 // (the compiler thread should not be a Java thread -- fix in 1.4.2)
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 if (is_Compiler_thread()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2252
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 // Actually throw the Throwable against the target Thread - however
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 // only if there is no thread death exception installed already.
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
2256 if (_pending_async_exception == NULL || !_pending_async_exception->is_a(SystemDictionary::ThreadDeath_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 // If the topmost frame is a runtime stub, then we are calling into
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 // OptoRuntime from compiled code. Some runtime stubs (new, monitor_exit..)
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 // must deoptimize the caller before continuing, as the compiled exception handler table
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 // may not be valid
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 if (has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 frame f = last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 if (f.is_runtime_frame() || f.is_safepoint_blob_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 RegisterMap reg_map(this, UseBiasedLocking);
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 frame compiled_frame = f.sender(&reg_map);
7428
2d6c433b1f38 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 7206
diff changeset
2267 if (!StressCompiledExceptionHandlers && compiled_frame.can_be_deoptimized()) {
13188
6b2d8d20ecbd deoptimization: add helper to minimize hsx diff #resolve GRAAL-531
Bernhard Urban <bernhard.urban@jku.at>
parents: 13114
diff changeset
2268 Deoptimization::deoptimize(this, compiled_frame, &reg_map);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2272
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 // Set async. pending exception in thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 set_pending_async_exception(java_throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
2275
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 if (TraceExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 ResourceMark rm;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2278 tty->print_cr("Pending Async. exception installed of type: %s", InstanceKlass::cast(_pending_async_exception->klass())->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 // for AbortVMOnException flag
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2281 NOT_PRODUCT(Exceptions::debug_check_abort(InstanceKlass::cast(_pending_async_exception->klass())->external_name()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2284
a61af66fc99e Initial load
duke
parents:
diff changeset
2285
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 // Interrupt thread so it will wake up from a potential wait()
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 Thread::interrupt(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2289
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 // External suspension mechanism.
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 // Tell the VM to suspend a thread when ever it knows that it does not hold on
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 // to any VM_locks and it is at a transition
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 // Self-suspension will happen on the transition out of the vm.
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 // Catch "this" coming in from JNIEnv pointers when the thread has been freed
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 // Guarantees on return:
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 // + Target thread will not execute any new bytecode (that's why we need to
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 // force a safepoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 // + Target thread will not enter any new monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 void JavaThread::java_suspend() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 { MutexLocker mu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 if (!Threads::includes(this) || is_exiting() || this->threadObj() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2308
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 { MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 if (!is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 // a racing resume has cancelled us; bail out now
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2314
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 // suspend is done
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 // Warning: is_ext_suspend_completed() may temporarily drop the
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 // SR_lock to allow the thread to reach a stable thread state if
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 // it is currently in a transient thread state.
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 if (is_ext_suspend_completed(false /* !called_by_wait */,
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 SuspendRetryDelay, &debug_bits) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2325
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 VM_ForceSafepoint vm_suspend;
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 VMThread::execute(&vm_suspend);
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2329
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 // Part II of external suspension.
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 // A JavaThread self suspends when it detects a pending external suspend
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 // request. This is usually on transitions. It is also done in places
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 // where continuing to the next transition would surprise the caller,
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 // e.g., monitor entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 // Returns the number of times that the thread self-suspended.
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 // Note: DO NOT call java_suspend_self() when you just want to block current
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 // thread. java_suspend_self() is the second stage of cooperative
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 // suspension for external suspend requests and should only be used
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 // to complete an external suspend request.
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 int JavaThread::java_suspend_self() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 int ret = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2345
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 // we are in the process of exiting so don't suspend
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 if (is_exiting()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 clear_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2351
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 assert(_anchor.walkable() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 (is_Java_thread() && !((JavaThread*)this)->has_last_Java_frame()),
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 "must have walkable stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
2355
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2357
979
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 844
diff changeset
2358 assert(!this->is_ext_suspended(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 "a thread trying to self-suspend should not already be suspended");
a61af66fc99e Initial load
duke
parents:
diff changeset
2360
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 if (this->is_suspend_equivalent()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 // If we are self-suspending as a result of the lifting of a
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 // suspend equivalent condition, then the suspend_equivalent
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 // flag is not cleared until we set the ext_suspended flag so
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 // that wait_for_ext_suspend_completion() returns consistent
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 // results.
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 this->clear_suspend_equivalent();
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2369
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 // A racing resume may have cancelled us before we grabbed SR_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 // above. Or another external suspend request could be waiting for us
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 // by the time we return from SR_lock()->wait(). The thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 // that requested the suspension may already be trying to walk our
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 // stack and if we return now, we can change the stack out from under
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 // it. This would be a "bad thing (TM)" and cause the stack walker
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 // to crash. We stay self-suspended until there are no more pending
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 // external suspend requests.
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 while (is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 ret++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 this->set_ext_suspended();
a61af66fc99e Initial load
duke
parents:
diff changeset
2381
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 // _ext_suspended flag is cleared by java_resume()
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 while (is_ext_suspended()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 this->SR_lock()->wait(Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2387
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2390
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 // verify the JavaThread has not yet been published in the Threads::list, and
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 // hence doesn't need protection from concurrent access at this stage
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 void JavaThread::verify_not_published() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 if (!Threads_lock->owned_by_self()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 MutexLockerEx ml(Threads_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 assert( !Threads::includes(this),
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 "java thread shouldn't have been published yet!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2401 assert( !Threads::includes(this),
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 "java thread shouldn't have been published yet!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2406
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 // Slow path when the native==>VM/Java barriers detect a safepoint is in
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 // progress or when _suspend_flags is non-zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
2409 // Current thread needs to self-suspend if there is a suspend request and/or
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 // block if a safepoint is in progress.
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 // Async exception ISN'T checked.
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 // Note only the ThreadInVMfromNative transition can call this function
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 // directly and when thread state is _thread_in_native_trans
a61af66fc99e Initial load
duke
parents:
diff changeset
2414 void JavaThread::check_safepoint_and_suspend_for_native_trans(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 assert(thread->thread_state() == _thread_in_native_trans, "wrong state");
a61af66fc99e Initial load
duke
parents:
diff changeset
2416
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 JavaThread *curJT = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 bool do_self_suspend = thread->is_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
2419
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 assert(!curJT->has_last_Java_frame() || curJT->frame_anchor()->walkable(), "Unwalkable stack in native->vm transition");
a61af66fc99e Initial load
duke
parents:
diff changeset
2421
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 // If JNIEnv proxies are allowed, don't self-suspend if the target
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 // thread is not the current thread. In older versions of jdbx, jdbx
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 // threads could call into the VM with another thread's JNIEnv so we
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 // can be here operating on behalf of a suspended thread (4432884).
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 if (do_self_suspend && (!AllowJNIEnvProxy || curJT == thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2427 JavaThreadState state = thread->thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2428
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 // We mark this thread_blocked state as a suspend-equivalent so
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 // that a caller to is_ext_suspend_completed() won't be confused.
a61af66fc99e Initial load
duke
parents:
diff changeset
2431 // The suspend-equivalent state is cleared by java_suspend_self().
a61af66fc99e Initial load
duke
parents:
diff changeset
2432 thread->set_suspend_equivalent();
a61af66fc99e Initial load
duke
parents:
diff changeset
2433
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 // If the safepoint code sees the _thread_in_native_trans state, it will
a61af66fc99e Initial load
duke
parents:
diff changeset
2435 // wait until the thread changes to other thread state. There is no
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 // guarantee on how soon we can obtain the SR_lock and complete the
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 // self-suspend request. It would be a bad idea to let safepoint wait for
a61af66fc99e Initial load
duke
parents:
diff changeset
2438 // too long. Temporarily change the state to _thread_blocked to
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 // let the VM thread know that this thread is ready for GC. The problem
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 // of changing thread state is that safepoint could happen just after
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 // java_suspend_self() returns after being resumed, and VM thread will
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 // see the _thread_blocked state. We must check for safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 // after restoring the state and make sure we won't leave while a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 // is in progress.
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 thread->set_thread_state(_thread_blocked);
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 thread->java_suspend_self();
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 thread->set_thread_state(state);
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 // Make sure new state is seen by VM thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 if (UseMembar) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 // Force a fence between the write above and read below
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 OrderAccess::fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 // Must use this rather than serialization page in particular on Windows
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 InterfaceSupport::serialize_memory(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2459
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 if (SafepointSynchronize::do_call_back()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2461 // If we are safepointing, then block the caller which may not be
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 // the same as the target thread (see above).
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 SafepointSynchronize::block(curJT);
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2465
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 if (thread->is_deopt_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 thread->clear_deopt_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 frame f = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 while ( f.id() != thread->must_deopt_id() && ! f.is_first_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 f = f.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 if (f.id() == thread->must_deopt_id()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 thread->clear_must_deopt_id();
1727
da877bdc9000 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 1689
diff changeset
2475 f.deoptimize(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 fatal("missed deoptimization!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2481
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 // Slow path when the native==>VM/Java barriers detect a safepoint is in
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 // progress or when _suspend_flags is non-zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 // Current thread needs to self-suspend if there is a suspend request and/or
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 // block if a safepoint is in progress.
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 // Also check for pending async exception (not including unsafe access error).
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 // Note only the native==>VM/Java barriers can call this function and when
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 // thread state is _thread_in_native_trans.
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 void JavaThread::check_special_condition_for_native_trans(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 check_safepoint_and_suspend_for_native_trans(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2491
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 if (thread->has_async_exception()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 // We are in _thread_in_native_trans state, don't handle unsafe
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 // access error since that may block.
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 thread->check_and_handle_async_exceptions(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2498
4873
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2499 // This is a variant of the normal
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2500 // check_special_condition_for_native_trans with slightly different
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2501 // semantics for use by critical native wrappers. It does all the
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2502 // normal checks but also performs the transition back into
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2503 // thread_in_Java state. This is required so that critical natives
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2504 // can potentially block and perform a GC if they are the last thread
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2505 // exiting the GC_locker.
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2506 void JavaThread::check_special_condition_for_native_trans_and_transition(JavaThread *thread) {
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2507 check_special_condition_for_native_trans(thread);
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2508
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2509 // Finish the transition
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2510 thread->set_thread_state(_thread_in_Java);
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2511
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2512 if (thread->do_critical_native_unlock()) {
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2513 ThreadInVMfromJavaNoAsyncException tiv(thread);
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2514 GC_locker::unlock_critical(thread);
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2515 thread->clear_critical_native_unlock();
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2516 }
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2517 }
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4872
diff changeset
2518
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 // We need to guarantee the Threads_lock here, since resumes are not
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 // allowed during safepoint synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 // Can only resume from an external suspension
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 void JavaThread::java_resume() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 assert_locked_or_safepoint(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2524
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 // Sanity check: thread is gone, has started exiting or the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2526 // was not externally suspended.
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 if (!Threads::includes(this) || is_exiting() || !is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2530
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2532
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 clear_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
2534
a61af66fc99e Initial load
duke
parents:
diff changeset
2535 if (is_ext_suspended()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 clear_ext_suspended();
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 SR_lock()->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2540
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 void JavaThread::create_stack_guard_pages() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 if (! os::uses_stack_guard_pages() || _stack_guard_state != stack_guard_unused) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2543 address low_addr = stack_base() - stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2545
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 int allocate = os::allocate_stack_guard_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 // warning("Guarding at " PTR_FORMAT " for len " SIZE_FORMAT "\n", low_addr, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
2548
1320
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1290
diff changeset
2549 if (allocate && !os::create_stack_guard_pages((char *) low_addr, len)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 warning("Attempt to allocate stack guard pages failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2551 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2553
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 if (os::guard_memory((char *) low_addr, len)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2555 _stack_guard_state = stack_guard_enabled;
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 warning("Attempt to protect stack guard pages failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 if (os::uncommit_memory((char *) low_addr, len)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 warning("Attempt to deallocate stack guard pages failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2563
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 void JavaThread::remove_stack_guard_pages() {
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
2565 assert(Thread::current() == this, "from different thread");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 if (_stack_guard_state == stack_guard_unused) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2567 address low_addr = stack_base() - stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2569
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 if (os::allocate_stack_guard_pages()) {
1320
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1290
diff changeset
2571 if (os::remove_stack_guard_pages((char *) low_addr, len)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 _stack_guard_state = stack_guard_unused;
a61af66fc99e Initial load
duke
parents:
diff changeset
2573 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 warning("Attempt to deallocate stack guard pages failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 if (_stack_guard_state == stack_guard_unused) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 if (os::unguard_memory((char *) low_addr, len)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2579 _stack_guard_state = stack_guard_unused;
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 warning("Attempt to unprotect stack guard pages failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2585
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 void JavaThread::enable_stack_yellow_zone() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 assert(_stack_guard_state != stack_guard_enabled, "already enabled");
a61af66fc99e Initial load
duke
parents:
diff changeset
2589
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 // The base notation is from the stacks point of view, growing downward.
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 // We need to adjust it to work correctly with guard_memory()
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 address base = stack_yellow_zone_base() - stack_yellow_zone_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2593
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 guarantee(base < stack_base(),"Error calculating stack yellow zone");
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 guarantee(base < os::current_stack_pointer(),"Error calculating stack yellow zone");
a61af66fc99e Initial load
duke
parents:
diff changeset
2596
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 if (os::guard_memory((char *) base, stack_yellow_zone_size())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 _stack_guard_state = stack_guard_enabled;
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 warning("Attempt to guard stack yellow zone failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 enable_register_stack_guard();
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2604
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 void JavaThread::disable_stack_yellow_zone() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 assert(_stack_guard_state != stack_guard_yellow_disabled, "already disabled");
a61af66fc99e Initial load
duke
parents:
diff changeset
2608
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 // Simply return if called for a thread that does not use guard pages.
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 if (_stack_guard_state == stack_guard_unused) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2611
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 // The base notation is from the stacks point of view, growing downward.
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 // We need to adjust it to work correctly with guard_memory()
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 address base = stack_yellow_zone_base() - stack_yellow_zone_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2615
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 if (os::unguard_memory((char *)base, stack_yellow_zone_size())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 _stack_guard_state = stack_guard_yellow_disabled;
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 warning("Attempt to unguard stack yellow zone failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 disable_register_stack_guard();
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2623
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 void JavaThread::enable_stack_red_zone() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2625 // The base notation is from the stacks point of view, growing downward.
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 // We need to adjust it to work correctly with guard_memory()
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 address base = stack_red_zone_base() - stack_red_zone_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2629
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 guarantee(base < stack_base(),"Error calculating stack red zone");
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 guarantee(base < os::current_stack_pointer(),"Error calculating stack red zone");
a61af66fc99e Initial load
duke
parents:
diff changeset
2632
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 if(!os::guard_memory((char *) base, stack_red_zone_size())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 warning("Attempt to guard stack red zone failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2637
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 void JavaThread::disable_stack_red_zone() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 // The base notation is from the stacks point of view, growing downward.
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 // We need to adjust it to work correctly with guard_memory()
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 address base = stack_red_zone_base() - stack_red_zone_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 if (!os::unguard_memory((char *)base, stack_red_zone_size())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 warning("Attempt to unguard stack red zone failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2647
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 void JavaThread::frames_do(void f(frame*, const RegisterMap* map)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 // ignore is there is no stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 if (!has_last_Java_frame()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 // traverse the stack frames. Starts from top frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 frame* fr = fst.current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 f(fr, fst.register_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2657
a61af66fc99e Initial load
duke
parents:
diff changeset
2658
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 // Deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 // Function for testing deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
2662 void JavaThread::deoptimize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 StackFrameStream fst(this, UseBiasedLocking);
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 bool deopt = false; // Dump stack only if a deopt actually happens.
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 bool only_at = strlen(DeoptimizeOnlyAt) > 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 // Iterate over all frames in the thread and deoptimize
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 for(; !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 if(fst.current()->can_be_deoptimized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2670
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 if (only_at) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 // Deoptimize only at particular bcis. DeoptimizeOnlyAt
a61af66fc99e Initial load
duke
parents:
diff changeset
2673 // consists of comma or carriage return separated numbers so
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 // search for the current bci in that string.
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 address pc = fst.current()->pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 nmethod* nm = (nmethod*) fst.current()->cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 ScopeDesc* sd = nm->scope_desc_at( pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2678 char buffer[8];
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 jio_snprintf(buffer, sizeof(buffer), "%d", sd->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 size_t len = strlen(buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 const char * found = strstr(DeoptimizeOnlyAt, buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 while (found != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 if ((found[len] == ',' || found[len] == '\n' || found[len] == '\0') &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 (found == DeoptimizeOnlyAt || found[-1] == ',' || found[-1] == '\n')) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 // Check that the bci found is bracketed by terminators.
a61af66fc99e Initial load
duke
parents:
diff changeset
2686 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 found = strstr(found + 1, buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
2689 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 if (!found) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2694
a61af66fc99e Initial load
duke
parents:
diff changeset
2695 if (DebugDeoptimization && !deopt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2696 deopt = true; // One-time only print before deopt
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 tty->print_cr("[BEFORE Deoptimization]");
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 trace_frames();
a61af66fc99e Initial load
duke
parents:
diff changeset
2699 trace_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
2700 }
13188
6b2d8d20ecbd deoptimization: add helper to minimize hsx diff #resolve GRAAL-531
Bernhard Urban <bernhard.urban@jku.at>
parents: 13114
diff changeset
2701 Deoptimization::deoptimize(this, *fst.current(), fst.register_map());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2703 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2704
a61af66fc99e Initial load
duke
parents:
diff changeset
2705 if (DebugDeoptimization && deopt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2706 tty->print_cr("[AFTER Deoptimization]");
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 trace_frames();
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2710
a61af66fc99e Initial load
duke
parents:
diff changeset
2711
a61af66fc99e Initial load
duke
parents:
diff changeset
2712 // Make zombies
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 void JavaThread::make_zombies() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2714 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 if (fst.current()->can_be_deoptimized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 // it is a Java nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 nmethod* nm = CodeCache::find_nmethod(fst.current()->pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
2718 nm->make_not_entrant();
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2722 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2723
a61af66fc99e Initial load
duke
parents:
diff changeset
2724
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 void JavaThread::deoptimized_wrt_marked_nmethods() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 if (!has_last_Java_frame()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2727 // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 StackFrameStream fst(this, UseBiasedLocking);
a61af66fc99e Initial load
duke
parents:
diff changeset
2729 for(; !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 if (fst.current()->should_be_deoptimized()) {
6843
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6769
diff changeset
2731 if (LogCompilation && xtty != NULL) {
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6769
diff changeset
2732 nmethod* nm = fst.current()->cb()->as_nmethod_or_null();
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6769
diff changeset
2733 xtty->elem("deoptimized thread='" UINTX_FORMAT "' compile_id='%d'",
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6769
diff changeset
2734 this->name(), nm != NULL ? nm->compile_id() : -1);
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6769
diff changeset
2735 }
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6769
diff changeset
2736
13188
6b2d8d20ecbd deoptimization: add helper to minimize hsx diff #resolve GRAAL-531
Bernhard Urban <bernhard.urban@jku.at>
parents: 13114
diff changeset
2737 Deoptimization::deoptimize(this, *fst.current(), fst.register_map());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2741
a61af66fc99e Initial load
duke
parents:
diff changeset
2742
a61af66fc99e Initial load
duke
parents:
diff changeset
2743 // GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
2744 static void frame_gc_epilogue(frame* f, const RegisterMap* map) { f->gc_epilogue(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2745
a61af66fc99e Initial load
duke
parents:
diff changeset
2746 void JavaThread::gc_epilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2747 frames_do(frame_gc_epilogue);
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2749
a61af66fc99e Initial load
duke
parents:
diff changeset
2750
a61af66fc99e Initial load
duke
parents:
diff changeset
2751 static void frame_gc_prologue(frame* f, const RegisterMap* map) { f->gc_prologue(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2752
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 void JavaThread::gc_prologue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2754 frames_do(frame_gc_prologue);
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2756
1119
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2757 // If the caller is a NamedThread, then remember, in the current scope,
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2758 // the given JavaThread in its _processed_thread field.
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2759 class RememberProcessedThread: public StackObj {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2760 NamedThread* _cur_thr;
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2761 public:
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2762 RememberProcessedThread(JavaThread* jthr) {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2763 Thread* thread = Thread::current();
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2764 if (thread->is_Named_thread()) {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2765 _cur_thr = (NamedThread *)thread;
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2766 _cur_thr->set_processed_thread(jthr);
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2767 } else {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2768 _cur_thr = NULL;
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2769 }
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2770 }
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2771
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2772 ~RememberProcessedThread() {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2773 if (_cur_thr) {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2774 _cur_thr->set_processed_thread(NULL);
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2775 }
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2776 }
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2777 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2778
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
2779 void JavaThread::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) {
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1144
diff changeset
2780 // Verify that the deferred card marks have been flushed.
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1144
diff changeset
2781 assert(deferred_card_mark().is_empty(), "Should be empty during GC");
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 997
diff changeset
2782
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 // The ThreadProfiler oops_do is done from FlatProfiler::oops_do
a61af66fc99e Initial load
duke
parents:
diff changeset
2784 // since there may be more than one thread using each ThreadProfiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
2785
a61af66fc99e Initial load
duke
parents:
diff changeset
2786 // Traverse the GCHandles
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
2787 Thread::oops_do(f, cld_f, cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2788
a61af66fc99e Initial load
duke
parents:
diff changeset
2789 assert( (!has_last_Java_frame() && java_call_counter() == 0) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2791
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 if (has_last_Java_frame()) {
1119
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2793 // Record JavaThread to GC thread
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2794 RememberProcessedThread rpt(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2795
a61af66fc99e Initial load
duke
parents:
diff changeset
2796 // Traverse the privileged stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2797 if (_privileged_stack_top != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2798 _privileged_stack_top->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2800
a61af66fc99e Initial load
duke
parents:
diff changeset
2801 // traverse the registered growable array
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 if (_array_for_gc != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2803 for (int index = 0; index < _array_for_gc->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2804 f->do_oop(_array_for_gc->adr_at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2806 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2807
a61af66fc99e Initial load
duke
parents:
diff changeset
2808 // Traverse the monitor chunks
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 for (MonitorChunk* chunk = monitor_chunks(); chunk != NULL; chunk = chunk->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 chunk->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2812
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 // Traverse the execution stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
2815 fst.current()->oops_do(f, cld_f, cf, fst.register_map());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2816 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2817 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2818
a61af66fc99e Initial load
duke
parents:
diff changeset
2819 // callee_target is never live across a gc point so NULL it here should
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 // it still contain a methdOop.
a61af66fc99e Initial load
duke
parents:
diff changeset
2821
a61af66fc99e Initial load
duke
parents:
diff changeset
2822 set_callee_target(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2823
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 assert(vframe_array_head() == NULL, "deopt in progress at a safepoint!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2825 // If we have deferred set_locals there might be oops waiting to be
a61af66fc99e Initial load
duke
parents:
diff changeset
2826 // written
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 GrowableArray<jvmtiDeferredLocalVariableSet*>* list = deferred_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
2828 if (list != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 for (int i = 0; i < list->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2830 list->at(i)->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2833
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 // Traverse instance variables at the end since the GC may be moving things
a61af66fc99e Initial load
duke
parents:
diff changeset
2835 // around using this function
a61af66fc99e Initial load
duke
parents:
diff changeset
2836 f->do_oop((oop*) &_threadObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2837 f->do_oop((oop*) &_vm_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2838 f->do_oop((oop*) &_exception_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2839 f->do_oop((oop*) &_pending_async_exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
2840
a61af66fc99e Initial load
duke
parents:
diff changeset
2841 if (jvmti_thread_state() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2842 jvmti_thread_state()->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2843 }
3696
dc7902820c9b Make NMethodSweeper work on any JavaThread
Gilles Duboscq <gilles.m.duboscq@gmail.com>
parents: 3650
diff changeset
2844
dc7902820c9b Make NMethodSweeper work on any JavaThread
Gilles Duboscq <gilles.m.duboscq@gmail.com>
parents: 3650
diff changeset
2845 if (_scanned_nmethod != NULL && cf != NULL) {
7212
291ffc492eb6 Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 7125 7206
diff changeset
2846 // Safepoints can occur when the sweeper is scanning an nmethod so
291ffc492eb6 Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 7125 7206
diff changeset
2847 // process it here to make sure it isn't unloaded in the middle of
291ffc492eb6 Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 7125 7206
diff changeset
2848 // a scan.
291ffc492eb6 Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 7125 7206
diff changeset
2849 cf->do_code_blob(_scanned_nmethod);
291ffc492eb6 Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 7125 7206
diff changeset
2850 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2851 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2852
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
2853 void JavaThread::nmethods_do(CodeBlobClosure* cf) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
2854 Thread::nmethods_do(cf); // (super method is a no-op)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2855
a61af66fc99e Initial load
duke
parents:
diff changeset
2856 assert( (!has_last_Java_frame() && java_call_counter() == 0) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2857 (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2858
a61af66fc99e Initial load
duke
parents:
diff changeset
2859 if (has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2860 // Traverse the execution stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2861 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
2862 fst.current()->nmethods_do(cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2863 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2866
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2867 void JavaThread::metadata_do(void f(Metadata*)) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2868 Thread::metadata_do(f);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2869 if (has_last_Java_frame()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2870 // Traverse the execution stack to call f() on the methods in the stack
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2871 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2872 fst.current()->metadata_do(f);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2873 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2874 } else if (is_Compiler_thread()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2875 // need to walk ciMetadata in current compile tasks to keep alive.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2876 CompilerThread* ct = (CompilerThread*)this;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2877 if (ct->env() != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2878 ct->env()->metadata_do(f);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2879 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2880 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2881 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
2882
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2883 // Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
2884 const char* _get_thread_state_name(JavaThreadState _thread_state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2885 switch (_thread_state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2886 case _thread_uninitialized: return "_thread_uninitialized";
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 case _thread_new: return "_thread_new";
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 case _thread_new_trans: return "_thread_new_trans";
a61af66fc99e Initial load
duke
parents:
diff changeset
2889 case _thread_in_native: return "_thread_in_native";
a61af66fc99e Initial load
duke
parents:
diff changeset
2890 case _thread_in_native_trans: return "_thread_in_native_trans";
a61af66fc99e Initial load
duke
parents:
diff changeset
2891 case _thread_in_vm: return "_thread_in_vm";
a61af66fc99e Initial load
duke
parents:
diff changeset
2892 case _thread_in_vm_trans: return "_thread_in_vm_trans";
a61af66fc99e Initial load
duke
parents:
diff changeset
2893 case _thread_in_Java: return "_thread_in_Java";
a61af66fc99e Initial load
duke
parents:
diff changeset
2894 case _thread_in_Java_trans: return "_thread_in_Java_trans";
a61af66fc99e Initial load
duke
parents:
diff changeset
2895 case _thread_blocked: return "_thread_blocked";
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 case _thread_blocked_trans: return "_thread_blocked_trans";
a61af66fc99e Initial load
duke
parents:
diff changeset
2897 default: return "unknown thread state";
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2899 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2900
a61af66fc99e Initial load
duke
parents:
diff changeset
2901 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 void JavaThread::print_thread_state_on(outputStream *st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 st->print_cr(" JavaThread state: %s", _get_thread_state_name(_thread_state));
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2905 void JavaThread::print_thread_state() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 print_thread_state_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
2907 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2908 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2909
a61af66fc99e Initial load
duke
parents:
diff changeset
2910 // Called by Threads::print() for VM_PrintThreads operation
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 void JavaThread::print_on(outputStream *st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2912 st->print("\"%s\" ", get_thread_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
2913 oop thread_oop = threadObj();
6766
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
2914 if (thread_oop != NULL) {
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
2915 st->print("#" INT64_FORMAT " ", java_lang_Thread::thread_id(thread_oop));
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
2916 if (java_lang_Thread::is_daemon(thread_oop)) st->print("daemon ");
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
2917 st->print("prio=%d ", java_lang_Thread::priority(thread_oop));
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
2918 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2919 Thread::print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
2920 // print guess for valid stack memory region (assume 4K pages); helps lock debugging
702
b9fba36710f2 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 669
diff changeset
2921 st->print_cr("[" INTPTR_FORMAT "]", (intptr_t)last_Java_sp() & ~right_n_bits(12));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2922 if (thread_oop != NULL && JDK_Version::is_gte_jdk15x_version()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 st->print_cr(" java.lang.Thread.State: %s", java_lang_Thread::thread_status_name(thread_oop));
a61af66fc99e Initial load
duke
parents:
diff changeset
2924 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2925 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2926 print_thread_state_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
2927 _safepoint_state->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
2928 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2929 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2930
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 // Called by fatal error handler. The difference between this and
a61af66fc99e Initial load
duke
parents:
diff changeset
2932 // JavaThread::print() is that we can't grab lock or allocate memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 void JavaThread::print_on_error(outputStream* st, char *buf, int buflen) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2934 st->print("JavaThread \"%s\"", get_thread_name_string(buf, buflen));
a61af66fc99e Initial load
duke
parents:
diff changeset
2935 oop thread_obj = threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
2936 if (thread_obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2937 if (java_lang_Thread::is_daemon(thread_obj)) st->print(" daemon");
a61af66fc99e Initial load
duke
parents:
diff changeset
2938 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2939 st->print(" [");
a61af66fc99e Initial load
duke
parents:
diff changeset
2940 st->print("%s", _get_thread_state_name(_thread_state));
a61af66fc99e Initial load
duke
parents:
diff changeset
2941 if (osthread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2942 st->print(", id=%d", osthread()->thread_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
2943 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2944 st->print(", stack(" PTR_FORMAT "," PTR_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
2945 _stack_base - _stack_size, _stack_base);
a61af66fc99e Initial load
duke
parents:
diff changeset
2946 st->print("]");
a61af66fc99e Initial load
duke
parents:
diff changeset
2947 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2949
a61af66fc99e Initial load
duke
parents:
diff changeset
2950 // Verification
a61af66fc99e Initial load
duke
parents:
diff changeset
2951
a61af66fc99e Initial load
duke
parents:
diff changeset
2952 static void frame_verify(frame* f, const RegisterMap *map) { f->verify(map); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2953
a61af66fc99e Initial load
duke
parents:
diff changeset
2954 void JavaThread::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2955 // Verify oops in the thread.
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
2956 oops_do(&VerifyOopClosure::verify_oop, NULL, NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2957
a61af66fc99e Initial load
duke
parents:
diff changeset
2958 // Verify the stack frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
2959 frames_do(frame_verify);
a61af66fc99e Initial load
duke
parents:
diff changeset
2960 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2961
a61af66fc99e Initial load
duke
parents:
diff changeset
2962 // CR 6300358 (sub-CR 2137150)
a61af66fc99e Initial load
duke
parents:
diff changeset
2963 // Most callers of this method assume that it can't return NULL but a
a61af66fc99e Initial load
duke
parents:
diff changeset
2964 // thread may not have a name whilst it is in the process of attaching to
a61af66fc99e Initial load
duke
parents:
diff changeset
2965 // the VM - see CR 6412693, and there are places where a JavaThread can be
a61af66fc99e Initial load
duke
parents:
diff changeset
2966 // seen prior to having it's threadObj set (eg JNI attaching threads and
a61af66fc99e Initial load
duke
parents:
diff changeset
2967 // if vm exit occurs during initialization). These cases can all be accounted
a61af66fc99e Initial load
duke
parents:
diff changeset
2968 // for such that this method never returns NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
2969 const char* JavaThread::get_thread_name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2970 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2971 // early safepoints can hit while current thread does not yet have TLS
a61af66fc99e Initial load
duke
parents:
diff changeset
2972 if (!SafepointSynchronize::is_at_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2973 Thread *cur = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2974 if (!(cur->is_Java_thread() && cur == this)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2975 // Current JavaThreads are allowed to get their own name without
a61af66fc99e Initial load
duke
parents:
diff changeset
2976 // the Threads_lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
2977 assert_locked_or_safepoint(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2979 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2980 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2981 return get_thread_name_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2983
a61af66fc99e Initial load
duke
parents:
diff changeset
2984 // Returns a non-NULL representation of this thread's name, or a suitable
a61af66fc99e Initial load
duke
parents:
diff changeset
2985 // descriptive string if there is no set name
a61af66fc99e Initial load
duke
parents:
diff changeset
2986 const char* JavaThread::get_thread_name_string(char* buf, int buflen) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2987 const char* name_str;
a61af66fc99e Initial load
duke
parents:
diff changeset
2988 oop thread_obj = threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
2989 if (thread_obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2990 typeArrayOop name = java_lang_Thread::name(thread_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2991 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2992 if (buf == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 name_str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
2994 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2995 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2996 name_str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length(), buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
2997 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2998 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2999 else if (is_attaching_via_jni()) { // workaround for 6412693 - see 6404306
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3000 name_str = "<no-name - thread is attaching>";
a61af66fc99e Initial load
duke
parents:
diff changeset
3001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3002 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 name_str = Thread::name();
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3005 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3006 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3007 name_str = Thread::name();
a61af66fc99e Initial load
duke
parents:
diff changeset
3008 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3009 assert(name_str != NULL, "unexpected NULL thread name");
a61af66fc99e Initial load
duke
parents:
diff changeset
3010 return name_str;
a61af66fc99e Initial load
duke
parents:
diff changeset
3011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3012
a61af66fc99e Initial load
duke
parents:
diff changeset
3013
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 const char* JavaThread::get_threadgroup_name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3015 debug_only(if (JavaThread::current() != this) assert_locked_or_safepoint(Threads_lock);)
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 oop thread_obj = threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 if (thread_obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3018 oop thread_group = java_lang_Thread::threadGroup(thread_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 if (thread_group != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 typeArrayOop name = java_lang_ThreadGroup::name(thread_group);
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 // ThreadGroup.name can be null
a61af66fc99e Initial load
duke
parents:
diff changeset
3022 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3023 const char* str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
3024 return str;
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3027 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3028 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3029 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3030
a61af66fc99e Initial load
duke
parents:
diff changeset
3031 const char* JavaThread::get_parent_name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3032 debug_only(if (JavaThread::current() != this) assert_locked_or_safepoint(Threads_lock);)
a61af66fc99e Initial load
duke
parents:
diff changeset
3033 oop thread_obj = threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
3034 if (thread_obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3035 oop thread_group = java_lang_Thread::threadGroup(thread_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
3036 if (thread_group != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3037 oop parent = java_lang_ThreadGroup::parent(thread_group);
a61af66fc99e Initial load
duke
parents:
diff changeset
3038 if (parent != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3039 typeArrayOop name = java_lang_ThreadGroup::name(parent);
a61af66fc99e Initial load
duke
parents:
diff changeset
3040 // ThreadGroup.name can be null
a61af66fc99e Initial load
duke
parents:
diff changeset
3041 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3042 const char* str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
3043 return str;
a61af66fc99e Initial load
duke
parents:
diff changeset
3044 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3045 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3046 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3047 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3048 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3049 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3050
a61af66fc99e Initial load
duke
parents:
diff changeset
3051 ThreadPriority JavaThread::java_priority() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3052 oop thr_oop = threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
3053 if (thr_oop == NULL) return NormPriority; // Bootstrapping
a61af66fc99e Initial load
duke
parents:
diff changeset
3054 ThreadPriority priority = java_lang_Thread::priority(thr_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3055 assert(MinPriority <= priority && priority <= MaxPriority, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
3056 return priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
3057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3058
a61af66fc99e Initial load
duke
parents:
diff changeset
3059 void JavaThread::prepare(jobject jni_thread, ThreadPriority prio) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3060
a61af66fc99e Initial load
duke
parents:
diff changeset
3061 assert(Threads_lock->owner() == Thread::current(), "must have threads lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
3062 // Link Java Thread object <-> C++ Thread
a61af66fc99e Initial load
duke
parents:
diff changeset
3063
a61af66fc99e Initial load
duke
parents:
diff changeset
3064 // Get the C++ thread object (an oop) from the JNI handle (a jthread)
a61af66fc99e Initial load
duke
parents:
diff changeset
3065 // and put it into a new Handle. The Handle "thread_oop" can then
a61af66fc99e Initial load
duke
parents:
diff changeset
3066 // be used to pass the C++ thread object to other methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
3067
a61af66fc99e Initial load
duke
parents:
diff changeset
3068 // Set the Java level thread object (jthread) field of the
a61af66fc99e Initial load
duke
parents:
diff changeset
3069 // new thread (a JavaThread *) to C++ thread object using the
a61af66fc99e Initial load
duke
parents:
diff changeset
3070 // "thread_oop" handle.
a61af66fc99e Initial load
duke
parents:
diff changeset
3071
a61af66fc99e Initial load
duke
parents:
diff changeset
3072 // Set the thread field (a JavaThread *) of the
a61af66fc99e Initial load
duke
parents:
diff changeset
3073 // oop representing the java_lang_Thread to the new thread (a JavaThread *).
a61af66fc99e Initial load
duke
parents:
diff changeset
3074
a61af66fc99e Initial load
duke
parents:
diff changeset
3075 Handle thread_oop(Thread::current(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3076 JNIHandles::resolve_non_null(jni_thread));
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
3077 assert(InstanceKlass::cast(thread_oop->klass())->is_linked(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3078 "must be initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
3079 set_threadObj(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
3080 java_lang_Thread::set_thread(thread_oop(), this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3081
a61af66fc99e Initial load
duke
parents:
diff changeset
3082 if (prio == NoPriority) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3083 prio = java_lang_Thread::priority(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
3084 assert(prio != NoPriority, "A valid priority should be present");
a61af66fc99e Initial load
duke
parents:
diff changeset
3085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3086
a61af66fc99e Initial load
duke
parents:
diff changeset
3087 // Push the Java priority down to the native thread; needs Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3088 Thread::set_priority(this, prio);
a61af66fc99e Initial load
duke
parents:
diff changeset
3089
a61af66fc99e Initial load
duke
parents:
diff changeset
3090 // Add the new thread to the Threads list and set it in motion.
a61af66fc99e Initial load
duke
parents:
diff changeset
3091 // We must have threads lock in order to call Threads::add.
a61af66fc99e Initial load
duke
parents:
diff changeset
3092 // It is crucial that we do not block before the thread is
a61af66fc99e Initial load
duke
parents:
diff changeset
3093 // added to the Threads list for if a GC happens, then the java_thread oop
a61af66fc99e Initial load
duke
parents:
diff changeset
3094 // will not be visited by GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
3095 Threads::add(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3097
a61af66fc99e Initial load
duke
parents:
diff changeset
3098 oop JavaThread::current_park_blocker() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3099 // Support for JSR-166 locks
a61af66fc99e Initial load
duke
parents:
diff changeset
3100 oop thread_oop = threadObj();
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
3101 if (thread_oop != NULL &&
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
3102 JDK_Version::current().supports_thread_park_blocker()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3103 return java_lang_Thread::park_blocker(thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3105 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3107
a61af66fc99e Initial load
duke
parents:
diff changeset
3108
a61af66fc99e Initial load
duke
parents:
diff changeset
3109 void JavaThread::print_stack_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3110 if (!has_last_Java_frame()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3111 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3112 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3113
a61af66fc99e Initial load
duke
parents:
diff changeset
3114 RegisterMap reg_map(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3115 vframe* start_vf = last_java_vframe(&reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
3116 int count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3117 for (vframe* f = start_vf; f; f = f->sender() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3118 if (f->is_java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 javaVFrame* jvf = javaVFrame::cast(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
3120 java_lang_Throwable::print_stack_element(st, jvf->method(), jvf->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
3121
a61af66fc99e Initial load
duke
parents:
diff changeset
3122 // Print out lock information
a61af66fc99e Initial load
duke
parents:
diff changeset
3123 if (JavaMonitorsInStackTrace) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3124 jvf->print_lock_info_on(st, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
3125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3126 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3127 // Ignore non-Java frames
a61af66fc99e Initial load
duke
parents:
diff changeset
3128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3129
a61af66fc99e Initial load
duke
parents:
diff changeset
3130 // Bail-out case for too deep stacks
a61af66fc99e Initial load
duke
parents:
diff changeset
3131 count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3132 if (MaxJavaStackTraceDepth == count) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3135
a61af66fc99e Initial load
duke
parents:
diff changeset
3136
a61af66fc99e Initial load
duke
parents:
diff changeset
3137 // JVMTI PopFrame support
a61af66fc99e Initial load
duke
parents:
diff changeset
3138 void JavaThread::popframe_preserve_args(ByteSize size_in_bytes, void* start) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3139 assert(_popframe_preserved_args == NULL, "should not wipe out old PopFrame preserved arguments");
a61af66fc99e Initial load
duke
parents:
diff changeset
3140 if (in_bytes(size_in_bytes) != 0) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3141 _popframe_preserved_args = NEW_C_HEAP_ARRAY(char, in_bytes(size_in_bytes), mtThread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3142 _popframe_preserved_args_size = in_bytes(size_in_bytes);
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1584
diff changeset
3143 Copy::conjoint_jbytes(start, _popframe_preserved_args, _popframe_preserved_args_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3146
a61af66fc99e Initial load
duke
parents:
diff changeset
3147 void* JavaThread::popframe_preserved_args() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3148 return _popframe_preserved_args;
a61af66fc99e Initial load
duke
parents:
diff changeset
3149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3150
a61af66fc99e Initial load
duke
parents:
diff changeset
3151 ByteSize JavaThread::popframe_preserved_args_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3152 return in_ByteSize(_popframe_preserved_args_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
3153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3154
a61af66fc99e Initial load
duke
parents:
diff changeset
3155 WordSize JavaThread::popframe_preserved_args_size_in_words() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3156 int sz = in_bytes(popframe_preserved_args_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
3157 assert(sz % wordSize == 0, "argument size must be multiple of wordSize");
a61af66fc99e Initial load
duke
parents:
diff changeset
3158 return in_WordSize(sz / wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
3159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3160
a61af66fc99e Initial load
duke
parents:
diff changeset
3161 void JavaThread::popframe_free_preserved_args() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3162 assert(_popframe_preserved_args != NULL, "should not free PopFrame preserved arguments twice");
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3163 FREE_C_HEAP_ARRAY(char, (char*) _popframe_preserved_args, mtThread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3164 _popframe_preserved_args = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3165 _popframe_preserved_args_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3167
a61af66fc99e Initial load
duke
parents:
diff changeset
3168 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3169
a61af66fc99e Initial load
duke
parents:
diff changeset
3170 void JavaThread::trace_frames() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3171 tty->print_cr("[Describe stack]");
a61af66fc99e Initial load
duke
parents:
diff changeset
3172 int frame_no = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3173 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3174 tty->print(" %d. ", frame_no++);
a61af66fc99e Initial load
duke
parents:
diff changeset
3175 fst.current()->print_value_on(tty,this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3176 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
3177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3179
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3180 class PrintAndVerifyOopClosure: public OopClosure {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3181 protected:
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3182 template <class T> inline void do_oop_work(T* p) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3183 oop obj = oopDesc::load_decode_heap_oop(p);
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3184 if (obj == NULL) return;
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3185 tty->print(INTPTR_FORMAT ": ", p);
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3186 if (obj->is_oop_or_null()) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3187 if (obj->is_objArray()) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3188 tty->print_cr("valid objArray: " INTPTR_FORMAT, (oopDesc*) obj);
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3189 } else {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3190 obj->print();
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3191 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3192 } else {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3193 tty->print_cr("invalid oop: " INTPTR_FORMAT, (oopDesc*) obj);
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3194 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3195 tty->cr();
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3196 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3197 public:
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3198 virtual void do_oop(oop* p) { do_oop_work(p); }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3199 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3200 };
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3201
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3202
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3203 static void oops_print(frame* f, const RegisterMap *map) {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3204 PrintAndVerifyOopClosure print;
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3205 f->print_value();
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
3206 f->oops_do(&print, NULL, NULL, (RegisterMap*)map);
3908
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3207 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3208
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3209 // Print our all the locations that contain oops and whether they are
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3210 // valid or not. This useful when trying to find the oldest frame
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3211 // where an oop has gone bad since the frame walk is from youngest to
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3212 // oldest.
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3213 void JavaThread::trace_oops() {
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3214 tty->print_cr("[Trace oops]");
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3215 frames_do(oops_print);
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3216 }
7588156f5cf9 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 3899
diff changeset
3217
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3218
3388
a80577f854f9 7045513: JSR 292 inlining causes crashes in methodHandleWalk.cpp
never
parents: 3384
diff changeset
3219 #ifdef ASSERT
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3220 // Print or validate the layout of stack frames
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3221 void JavaThread::print_frame_layout(int depth, bool validate_only) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3222 ResourceMark rm;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3223 PRESERVE_EXCEPTION_MARK;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3224 FrameValues values;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3225 int frame_no = 0;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3226 for(StackFrameStream fst(this, false); !fst.is_done(); fst.next()) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3227 fst.current()->describe(values, ++frame_no);
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3228 if (depth == frame_no) break;
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3229 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3230 if (validate_only) {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3231 values.validate();
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3232 } else {
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3233 tty->print_cr("[Describe stack layout]");
4042
b20d64f83668 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 4007
diff changeset
3234 values.print(this);
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3235 }
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3236 }
3388
a80577f854f9 7045513: JSR 292 inlining causes crashes in methodHandleWalk.cpp
never
parents: 3384
diff changeset
3237 #endif
3336
2e038ad0c1d0 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 2416
diff changeset
3238
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3239 void JavaThread::trace_stack_from(vframe* start_vf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3240 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3241 int vframe_no = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3242 for (vframe* f = start_vf; f; f = f->sender() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3243 if (f->is_java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3244 javaVFrame::cast(f)->print_activation(vframe_no++);
a61af66fc99e Initial load
duke
parents:
diff changeset
3245 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3246 f->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
3247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3248 if (vframe_no > StackPrintLimit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3249 tty->print_cr("...<more frames>...");
a61af66fc99e Initial load
duke
parents:
diff changeset
3250 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3254
a61af66fc99e Initial load
duke
parents:
diff changeset
3255
a61af66fc99e Initial load
duke
parents:
diff changeset
3256 void JavaThread::trace_stack() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3257 if (!has_last_Java_frame()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3258 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3259 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3260 RegisterMap reg_map(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3261 trace_stack_from(last_java_vframe(&reg_map));
a61af66fc99e Initial load
duke
parents:
diff changeset
3262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3263
a61af66fc99e Initial load
duke
parents:
diff changeset
3264
a61af66fc99e Initial load
duke
parents:
diff changeset
3265 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3266
a61af66fc99e Initial load
duke
parents:
diff changeset
3267
a61af66fc99e Initial load
duke
parents:
diff changeset
3268 javaVFrame* JavaThread::last_java_vframe(RegisterMap *reg_map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3269 assert(reg_map != NULL, "a map must be given");
a61af66fc99e Initial load
duke
parents:
diff changeset
3270 frame f = last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 for (vframe* vf = vframe::new_vframe(&f, reg_map, this); vf; vf = vf->sender() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3272 if (vf->is_java_frame()) return javaVFrame::cast(vf);
a61af66fc99e Initial load
duke
parents:
diff changeset
3273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3274 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3276
a61af66fc99e Initial load
duke
parents:
diff changeset
3277
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
3278 Klass* JavaThread::security_get_caller_class(int depth) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3279 vframeStream vfst(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3280 vfst.security_get_caller_frame(depth);
a61af66fc99e Initial load
duke
parents:
diff changeset
3281 if (!vfst.at_end()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3282 return vfst.method()->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
3283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3284 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3286
a61af66fc99e Initial load
duke
parents:
diff changeset
3287 static void compiler_thread_entry(JavaThread* thread, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3288 assert(thread->is_Compiler_thread(), "must be compiler thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
3289 CompileBroker::compiler_thread_loop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3291
a61af66fc99e Initial load
duke
parents:
diff changeset
3292 // Create a CompilerThread
a61af66fc99e Initial load
duke
parents:
diff changeset
3293 CompilerThread::CompilerThread(CompileQueue* queue, CompilerCounters* counters)
a61af66fc99e Initial load
duke
parents:
diff changeset
3294 : JavaThread(&compiler_thread_entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3295 _env = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 _log = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3297 _task = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3298 _queue = queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
3299 _counters = counters;
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
3300 _buffer_blob = NULL;
3384
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 3336
diff changeset
3301 _scanned_nmethod = NULL;
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12316
diff changeset
3302 _compiler = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3303
a61af66fc99e Initial load
duke
parents:
diff changeset
3304 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3305 _ideal_graph_printer = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3306 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3308
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
3309 void CompilerThread::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) {
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
3310 JavaThread::oops_do(f, cld_f, cf);
3384
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 3336
diff changeset
3311 if (_scanned_nmethod != NULL && cf != NULL) {
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 3336
diff changeset
3312 // Safepoints can occur when the sweeper is scanning an nmethod so
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 3336
diff changeset
3313 // process it here to make sure it isn't unloaded in the middle of
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 3336
diff changeset
3314 // a scan.
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 3336
diff changeset
3315 cf->do_code_blob(_scanned_nmethod);
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 3336
diff changeset
3316 }
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 3336
diff changeset
3317 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3318
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12316
diff changeset
3319
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3320 // ======= Threads ========
a61af66fc99e Initial load
duke
parents:
diff changeset
3321
a61af66fc99e Initial load
duke
parents:
diff changeset
3322 // The Threads class links together all active threads, and provides
a61af66fc99e Initial load
duke
parents:
diff changeset
3323 // operations over all threads. It is protected by its own Mutex
a61af66fc99e Initial load
duke
parents:
diff changeset
3324 // lock, which is also used in other contexts to protect thread
a61af66fc99e Initial load
duke
parents:
diff changeset
3325 // operations from having the thread being operated on from exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
3326 // and going away unexpectedly (e.g., safepoint synchronization)
a61af66fc99e Initial load
duke
parents:
diff changeset
3327
a61af66fc99e Initial load
duke
parents:
diff changeset
3328 JavaThread* Threads::_thread_list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3329 int Threads::_number_of_threads = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3330 int Threads::_number_of_non_daemon_threads = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3331 int Threads::_return_code = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3332 size_t JavaThread::_stack_size_at_create = 0;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
3333 #ifdef ASSERT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
3334 bool Threads::_vm_complete = false;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
3335 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3336
a61af66fc99e Initial load
duke
parents:
diff changeset
3337 // All JavaThreads
a61af66fc99e Initial load
duke
parents:
diff changeset
3338 #define ALL_JAVA_THREADS(X) for (JavaThread* X = _thread_list; X; X = X->next())
a61af66fc99e Initial load
duke
parents:
diff changeset
3339
a61af66fc99e Initial load
duke
parents:
diff changeset
3340 // All JavaThreads + all non-JavaThreads (i.e., every thread in the system)
a61af66fc99e Initial load
duke
parents:
diff changeset
3341 void Threads::threads_do(ThreadClosure* tc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3342 assert_locked_or_safepoint(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3343 // ALL_JAVA_THREADS iterates through all JavaThreads
a61af66fc99e Initial load
duke
parents:
diff changeset
3344 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3345 tc->do_thread(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
3346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3347 // Someday we could have a table or list of all non-JavaThreads.
a61af66fc99e Initial load
duke
parents:
diff changeset
3348 // For now, just manually iterate through them.
a61af66fc99e Initial load
duke
parents:
diff changeset
3349 tc->do_thread(VMThread::vm_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
3350 Universe::heap()->gc_threads_do(tc);
323
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
3351 WatcherThread *wt = WatcherThread::watcher_thread();
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
3352 // Strictly speaking, the following NULL check isn't sufficient to make sure
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
3353 // the data for WatcherThread is still valid upon being examined. However,
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
3354 // considering that WatchThread terminates when the VM is on the way to
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
3355 // exit at safepoint, the chance of the above is extremely small. The right
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
3356 // way to prevent termination of WatcherThread would be to acquire
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
3357 // Terminator_lock, but we can't do that without violating the lock rank
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
3358 // checking in some cases.
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
3359 if (wt != NULL)
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
3360 tc->do_thread(wt);
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
3361
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3362 // If CompilerThreads ever become non-JavaThreads, add them here
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3364
a61af66fc99e Initial load
duke
parents:
diff changeset
3365 jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3366
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
3367 extern void JDK_Version_init();
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
3368
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3369 // Check version
a61af66fc99e Initial load
duke
parents:
diff changeset
3370 if (!is_supported_jni_version(args->version)) return JNI_EVERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
3371
a61af66fc99e Initial load
duke
parents:
diff changeset
3372 // Initialize the output stream module
a61af66fc99e Initial load
duke
parents:
diff changeset
3373 ostream_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
3374
a61af66fc99e Initial load
duke
parents:
diff changeset
3375 // Process java launcher properties.
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 Arguments::process_sun_java_launcher_properties(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
3377
a61af66fc99e Initial load
duke
parents:
diff changeset
3378 // Initialize the os module before using TLS
a61af66fc99e Initial load
duke
parents:
diff changeset
3379 os::init();
a61af66fc99e Initial load
duke
parents:
diff changeset
3380
a61af66fc99e Initial load
duke
parents:
diff changeset
3381 // Initialize system properties.
a61af66fc99e Initial load
duke
parents:
diff changeset
3382 Arguments::init_system_properties();
a61af66fc99e Initial load
duke
parents:
diff changeset
3383
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
3384 // So that JDK version can be used as a discrimintor when parsing arguments
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
3385 JDK_Version_init();
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
3386
1864
dfb38ea7da17 6988363: Rebrand vm vendor property settings (jdk7 only)
zgu
parents: 1731
diff changeset
3387 // Update/Initialize System properties after JDK version number is known
dfb38ea7da17 6988363: Rebrand vm vendor property settings (jdk7 only)
zgu
parents: 1731
diff changeset
3388 Arguments::init_version_specific_system_properties();
dfb38ea7da17 6988363: Rebrand vm vendor property settings (jdk7 only)
zgu
parents: 1731
diff changeset
3389
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3390 // Parse arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
3391 jint parse_result = Arguments::parse(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
3392 if (parse_result != JNI_OK) return parse_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3393
13114
5465ba051280 HSAIL: removed AMD GPU detection until a) clashing AMD CPU and GPU vendor ID issue is resolved and b) HSA port is more complete
Doug Simon <doug.simon@oracle.com>
parents: 13089
diff changeset
3394 // Probe for existance of supported GPU and initialize it if one
5465ba051280 HSAIL: removed AMD GPU detection until a) clashing AMD CPU and GPU vendor ID issue is resolved and b) HSA port is more complete
Doug Simon <doug.simon@oracle.com>
parents: 13089
diff changeset
3395 // exists.
5465ba051280 HSAIL: removed AMD GPU detection until a) clashing AMD CPU and GPU vendor ID issue is resolved and b) HSA port is more complete
Doug Simon <doug.simon@oracle.com>
parents: 13089
diff changeset
3396 gpu::init();
5465ba051280 HSAIL: removed AMD GPU detection until a) clashing AMD CPU and GPU vendor ID issue is resolved and b) HSA port is more complete
Doug Simon <doug.simon@oracle.com>
parents: 13089
diff changeset
3397
12233
40136aa2cdb1 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 12173
diff changeset
3398 os::init_before_ergo();
40136aa2cdb1 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 12173
diff changeset
3399
40136aa2cdb1 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 12173
diff changeset
3400 jint ergo_result = Arguments::apply_ergo();
40136aa2cdb1 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 12173
diff changeset
3401 if (ergo_result != JNI_OK) return ergo_result;
40136aa2cdb1 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 12173
diff changeset
3402
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 if (PauseAtStartup) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3404 os::pause();
a61af66fc99e Initial load
duke
parents:
diff changeset
3405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3406
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3407 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3408 HS_DTRACE_PROBE(hotspot, vm__init__begin);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3409 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3410 HOTSPOT_VM_INIT_BEGIN();
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3411 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3412
a61af66fc99e Initial load
duke
parents:
diff changeset
3413 // Record VM creation timing statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
3414 TraceVmCreationTime create_vm_timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
3415 create_vm_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
3416
a61af66fc99e Initial load
duke
parents:
diff changeset
3417 // Timing (must come after argument parsing)
a61af66fc99e Initial load
duke
parents:
diff changeset
3418 TraceTime timer("Create VM", TraceStartupTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
3419
a61af66fc99e Initial load
duke
parents:
diff changeset
3420 // Initialize the os module after parsing the args
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 jint os_init_2_result = os::init_2();
a61af66fc99e Initial load
duke
parents:
diff changeset
3422 if (os_init_2_result != JNI_OK) return os_init_2_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3423
7177
53715fb1597d 7198334: UseNUMA modifies system parameters on non-NUMA system
brutisso
parents: 6985
diff changeset
3424 jint adjust_after_os_result = Arguments::adjust_after_os();
53715fb1597d 7198334: UseNUMA modifies system parameters on non-NUMA system
brutisso
parents: 6985
diff changeset
3425 if (adjust_after_os_result != JNI_OK) return adjust_after_os_result;
53715fb1597d 7198334: UseNUMA modifies system parameters on non-NUMA system
brutisso
parents: 6985
diff changeset
3426
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3427 // intialize TLS
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3428 ThreadLocalStorage::init();
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3429
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3430 // Bootstrap native memory tracking, so it can start recording memory
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3431 // activities before worker thread is started. This is the first phase
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3432 // of bootstrapping, VM is currently running in single-thread mode.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3433 MemTracker::bootstrap_single_thread();
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3434
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3435 // Initialize output stream logging
a61af66fc99e Initial load
duke
parents:
diff changeset
3436 ostream_init_log();
a61af66fc99e Initial load
duke
parents:
diff changeset
3437
a61af66fc99e Initial load
duke
parents:
diff changeset
3438 // Convert -Xrun to -agentlib: if there is no JVM_OnLoad
a61af66fc99e Initial load
duke
parents:
diff changeset
3439 // Must be before create_vm_init_agents()
a61af66fc99e Initial load
duke
parents:
diff changeset
3440 if (Arguments::init_libraries_at_startup()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 convert_vm_init_libraries_to_agents();
a61af66fc99e Initial load
duke
parents:
diff changeset
3442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3443
a61af66fc99e Initial load
duke
parents:
diff changeset
3444 // Launch -agentlib/-agentpath and converted -Xrun agents
a61af66fc99e Initial load
duke
parents:
diff changeset
3445 if (Arguments::init_agents_at_startup()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 create_vm_init_agents();
a61af66fc99e Initial load
duke
parents:
diff changeset
3447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3448
a61af66fc99e Initial load
duke
parents:
diff changeset
3449 // Initialize Threads state
a61af66fc99e Initial load
duke
parents:
diff changeset
3450 _thread_list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3451 _number_of_threads = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3452 _number_of_non_daemon_threads = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3453
a61af66fc99e Initial load
duke
parents:
diff changeset
3454 // Initialize global data structures and create system classes in heap
a61af66fc99e Initial load
duke
parents:
diff changeset
3455 vm_init_globals();
a61af66fc99e Initial load
duke
parents:
diff changeset
3456
a61af66fc99e Initial load
duke
parents:
diff changeset
3457 // Attach the main thread to this os thread
a61af66fc99e Initial load
duke
parents:
diff changeset
3458 JavaThread* main_thread = new JavaThread();
a61af66fc99e Initial load
duke
parents:
diff changeset
3459 main_thread->set_thread_state(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
3460 // must do this before set_active_handles and initialize_thread_local_storage
a61af66fc99e Initial load
duke
parents:
diff changeset
3461 // Note: on solaris initialize_thread_local_storage() will (indirectly)
a61af66fc99e Initial load
duke
parents:
diff changeset
3462 // change the stack size recorded here to one based on the java thread
a61af66fc99e Initial load
duke
parents:
diff changeset
3463 // stacksize. This adjusted size is what is used to figure the placement
a61af66fc99e Initial load
duke
parents:
diff changeset
3464 // of the guard pages.
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 main_thread->record_stack_base_and_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
3466 main_thread->initialize_thread_local_storage();
a61af66fc99e Initial load
duke
parents:
diff changeset
3467
a61af66fc99e Initial load
duke
parents:
diff changeset
3468 main_thread->set_active_handles(JNIHandleBlock::allocate_block());
a61af66fc99e Initial load
duke
parents:
diff changeset
3469
a61af66fc99e Initial load
duke
parents:
diff changeset
3470 if (!main_thread->set_as_starting_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3471 vm_shutdown_during_initialization(
a61af66fc99e Initial load
duke
parents:
diff changeset
3472 "Failed necessary internal allocation. Out of swap space");
a61af66fc99e Initial load
duke
parents:
diff changeset
3473 delete main_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3474 *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
a61af66fc99e Initial load
duke
parents:
diff changeset
3475 return JNI_ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
3476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3477
a61af66fc99e Initial load
duke
parents:
diff changeset
3478 // Enable guard page *after* os::create_main_thread(), otherwise it would
a61af66fc99e Initial load
duke
parents:
diff changeset
3479 // crash Linux VM, see notes in os_linux.cpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
3480 main_thread->create_stack_guard_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
3481
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
3482 // Initialize Java-Level synchronization subsystem
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
3483 ObjectMonitor::Initialize() ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3484
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3485 // Second phase of bootstrapping, VM is about entering multi-thread mode
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3486 MemTracker::bootstrap_multi_thread();
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3487
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3488 // Initialize global modules
a61af66fc99e Initial load
duke
parents:
diff changeset
3489 jint status = init_globals();
a61af66fc99e Initial load
duke
parents:
diff changeset
3490 if (status != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3491 delete main_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3492 *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
a61af66fc99e Initial load
duke
parents:
diff changeset
3493 return status;
a61af66fc99e Initial load
duke
parents:
diff changeset
3494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3495
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1608
diff changeset
3496 // Should be done after the heap is fully created
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1608
diff changeset
3497 main_thread->cache_global_variables();
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1608
diff changeset
3498
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3499 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3500
a61af66fc99e Initial load
duke
parents:
diff changeset
3501 { MutexLocker mu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3502 Threads::add(main_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3504
a61af66fc99e Initial load
duke
parents:
diff changeset
3505 // Any JVMTI raw monitors entered in onload will transition into
a61af66fc99e Initial load
duke
parents:
diff changeset
3506 // real raw monitor. VM is setup enough here for raw monitor enter.
a61af66fc99e Initial load
duke
parents:
diff changeset
3507 JvmtiExport::transition_pending_onload_raw_monitors();
a61af66fc99e Initial load
duke
parents:
diff changeset
3508
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3509 // Fully start NMT
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3510 MemTracker::start();
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3511
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3512 // Create the VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
3513 { TraceTime timer("Start VMThread", TraceStartupTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
3514 VMThread::create();
a61af66fc99e Initial load
duke
parents:
diff changeset
3515 Thread* vmthread = VMThread::vm_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
3516
a61af66fc99e Initial load
duke
parents:
diff changeset
3517 if (!os::create_thread(vmthread, os::vm_thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
3518 vm_exit_during_initialization("Cannot create VM thread. Out of system resources.");
a61af66fc99e Initial load
duke
parents:
diff changeset
3519
a61af66fc99e Initial load
duke
parents:
diff changeset
3520 // Wait for the VM thread to become ready, and VMThread::run to initialize
a61af66fc99e Initial load
duke
parents:
diff changeset
3521 // Monitors can have spurious returns, must always check another state flag
a61af66fc99e Initial load
duke
parents:
diff changeset
3522 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3523 MutexLocker ml(Notify_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3524 os::start_thread(vmthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3525 while (vmthread->active_handles() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3526 Notify_lock->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
3527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3530
a61af66fc99e Initial load
duke
parents:
diff changeset
3531 assert (Universe::is_fully_initialized(), "not initialized");
9071
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8855
diff changeset
3532 if (VerifyDuringStartup) {
10186
b06ac540229e 8013132: Add a flag to turn off the output of the verbose verification code
stefank
parents: 9071
diff changeset
3533 // Make sure we're starting with a clean slate.
b06ac540229e 8013132: Add a flag to turn off the output of the verbose verification code
stefank
parents: 9071
diff changeset
3534 VM_Verify verify_op;
9071
68fe50d4f1d5 8011343: Add new flag for verifying the heap during startup
johnc
parents: 8855
diff changeset
3535 VMThread::execute(&verify_op);
8855
24ef5fb05e0f 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 8793
diff changeset
3536 }
24ef5fb05e0f 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 8793
diff changeset
3537
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3538 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3539
a61af66fc99e Initial load
duke
parents:
diff changeset
3540 // At this point, the Universe is initialized, but we have not executed
a61af66fc99e Initial load
duke
parents:
diff changeset
3541 // any byte code. Now is a good time (the only time) to dump out the
a61af66fc99e Initial load
duke
parents:
diff changeset
3542 // internal state of the JVM for sharing.
a61af66fc99e Initial load
duke
parents:
diff changeset
3543 if (DumpSharedSpaces) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
3544 MetaspaceShared::preload_and_dump(CHECK_0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3545 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3547
a61af66fc99e Initial load
duke
parents:
diff changeset
3548 // Always call even when there are not JVMTI environments yet, since environments
a61af66fc99e Initial load
duke
parents:
diff changeset
3549 // may be attached late and JVMTI must track phases of VM execution
a61af66fc99e Initial load
duke
parents:
diff changeset
3550 JvmtiExport::enter_start_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
3551
a61af66fc99e Initial load
duke
parents:
diff changeset
3552 // Notify JVMTI agents that VM has started (JNI is up) - nop if no agents.
a61af66fc99e Initial load
duke
parents:
diff changeset
3553 JvmtiExport::post_vm_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
3554
a61af66fc99e Initial load
duke
parents:
diff changeset
3555 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3556 TraceTime timer("Initialize java.lang classes", TraceStartupTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
3557
a61af66fc99e Initial load
duke
parents:
diff changeset
3558 if (EagerXrunInit && Arguments::init_libraries_at_startup()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3559 create_vm_init_libraries();
a61af66fc99e Initial load
duke
parents:
diff changeset
3560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3561
7608
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3562 initialize_class(vmSymbols::java_lang_String(), CHECK_0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3563
a61af66fc99e Initial load
duke
parents:
diff changeset
3564 // Initialize java_lang.System (needed before creating the thread)
7608
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3565 initialize_class(vmSymbols::java_lang_System(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3566 initialize_class(vmSymbols::java_lang_ThreadGroup(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3567 Handle thread_group = create_initial_thread_group(CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3568 Universe::set_main_thread_group(thread_group());
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3569 initialize_class(vmSymbols::java_lang_Thread(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3570 oop thread_object = create_initial_thread(thread_group, main_thread, CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3571 main_thread->set_threadObj(thread_object);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3572 // Set thread status to running since main thread has
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3573 // been started and running.
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3574 java_lang_Thread::set_thread_status(thread_object,
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3575 java_lang_Thread::RUNNABLE);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3576
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3577 // The VM creates & returns objects of this class. Make sure it's initialized.
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3578 initialize_class(vmSymbols::java_lang_Class(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3579
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3580 // The VM preresolves methods to these classes. Make sure that they get initialized
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3581 initialize_class(vmSymbols::java_lang_reflect_Method(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3582 initialize_class(vmSymbols::java_lang_ref_Finalizer(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3583 call_initializeSystemClass(CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3584
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3585 // get the Java runtime name after java.lang.System is initialized
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3586 JDK_Version::set_runtime_name(get_java_runtime_name(THREAD));
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3587 JDK_Version::set_runtime_version(get_java_runtime_version(THREAD));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3588
a61af66fc99e Initial load
duke
parents:
diff changeset
3589 // an instance of OutOfMemory exception has been allocated earlier
7608
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3590 initialize_class(vmSymbols::java_lang_OutOfMemoryError(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3591 initialize_class(vmSymbols::java_lang_NullPointerException(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3592 initialize_class(vmSymbols::java_lang_ClassCastException(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3593 initialize_class(vmSymbols::java_lang_ArrayStoreException(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3594 initialize_class(vmSymbols::java_lang_ArithmeticException(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3595 initialize_class(vmSymbols::java_lang_StackOverflowError(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3596 initialize_class(vmSymbols::java_lang_IllegalMonitorStateException(), CHECK_0);
689e1218d7fe 8004018: Remove old initialization flags
brutisso
parents: 7437
diff changeset
3597 initialize_class(vmSymbols::java_lang_IllegalArgumentException(), CHECK_0);
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2376
diff changeset
3598 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3599
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 // See : bugid 4211085.
a61af66fc99e Initial load
duke
parents:
diff changeset
3601 // Background : the static initializer of java.lang.Compiler tries to read
a61af66fc99e Initial load
duke
parents:
diff changeset
3602 // property"java.compiler" and read & write property "java.vm.info".
a61af66fc99e Initial load
duke
parents:
diff changeset
3603 // When a security manager is installed through the command line
a61af66fc99e Initial load
duke
parents:
diff changeset
3604 // option "-Djava.security.manager", the above properties are not
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 // readable and the static initializer for java.lang.Compiler fails
a61af66fc99e Initial load
duke
parents:
diff changeset
3606 // resulting in a NoClassDefFoundError. This can happen in any
a61af66fc99e Initial load
duke
parents:
diff changeset
3607 // user code which calls methods in java.lang.Compiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
3608 // Hack : the hack is to pre-load and initialize this class, so that only
a61af66fc99e Initial load
duke
parents:
diff changeset
3609 // system domains are on the stack when the properties are read.
a61af66fc99e Initial load
duke
parents:
diff changeset
3610 // Currently even the AWT code has calls to methods in java.lang.Compiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
3611 // On the classic VM, java.lang.Compiler is loaded very early to load the JIT.
a61af66fc99e Initial load
duke
parents:
diff changeset
3612 // Future Fix : the best fix is to grant everyone permissions to read "java.compiler" and
a61af66fc99e Initial load
duke
parents:
diff changeset
3613 // read and write"java.vm.info" in the default policy file. See bugid 4211383
a61af66fc99e Initial load
duke
parents:
diff changeset
3614 // Once that is done, we should remove this hack.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
3615 initialize_class(vmSymbols::java_lang_Compiler(), CHECK_0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3616
a61af66fc99e Initial load
duke
parents:
diff changeset
3617 // More hackery - the static initializer of java.lang.Compiler adds the string "nojit" to
a61af66fc99e Initial load
duke
parents:
diff changeset
3618 // the java.vm.info property if no jit gets loaded through java.lang.Compiler (the hotspot
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 // compiler does not get loaded through java.lang.Compiler). "java -version" with the
a61af66fc99e Initial load
duke
parents:
diff changeset
3620 // hotspot vm says "nojit" all the time which is confusing. So, we reset it here.
a61af66fc99e Initial load
duke
parents:
diff changeset
3621 // This should also be taken out as soon as 4211383 gets fixed.
a61af66fc99e Initial load
duke
parents:
diff changeset
3622 reset_vm_info_property(CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3623
a61af66fc99e Initial load
duke
parents:
diff changeset
3624 quicken_jni_functions();
a61af66fc99e Initial load
duke
parents:
diff changeset
3625
4932
f1cb6f9cfe21 7145243: Need additional specializations for argument parsing framework
fparain
parents: 4873
diff changeset
3626 // Must be run after init_ft which initializes ft_enabled
f1cb6f9cfe21 7145243: Need additional specializations for argument parsing framework
fparain
parents: 4873
diff changeset
3627 if (TRACE_INITIALIZE() != JNI_OK) {
f1cb6f9cfe21 7145243: Need additional specializations for argument parsing framework
fparain
parents: 4873
diff changeset
3628 vm_exit_during_initialization("Failed to initialize tracing backend");
f1cb6f9cfe21 7145243: Need additional specializations for argument parsing framework
fparain
parents: 4873
diff changeset
3629 }
f1cb6f9cfe21 7145243: Need additional specializations for argument parsing framework
fparain
parents: 4873
diff changeset
3630
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3631 // Set flag that basic initialization has completed. Used by exceptions and various
a61af66fc99e Initial load
duke
parents:
diff changeset
3632 // debug stuff, that does not work until all basic classes have been initialized.
a61af66fc99e Initial load
duke
parents:
diff changeset
3633 set_init_completed();
a61af66fc99e Initial load
duke
parents:
diff changeset
3634
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3635 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3636 HS_DTRACE_PROBE(hotspot, vm__init__end);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3637 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3638 HOTSPOT_VM_INIT_END();
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3639 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3640
a61af66fc99e Initial load
duke
parents:
diff changeset
3641 // record VM initialization completion time
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
3642 #if INCLUDE_MANAGEMENT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3643 Management::record_vm_init_completed();
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
3644 #endif // INCLUDE_MANAGEMENT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3645
a61af66fc99e Initial load
duke
parents:
diff changeset
3646 // Compute system loader. Note that this has to occur after set_init_completed, since
a61af66fc99e Initial load
duke
parents:
diff changeset
3647 // valid exceptions may be thrown in the process.
a61af66fc99e Initial load
duke
parents:
diff changeset
3648 // Note that we do not use CHECK_0 here since we are inside an EXCEPTION_MARK and
a61af66fc99e Initial load
duke
parents:
diff changeset
3649 // set_init_completed has just been called, causing exceptions not to be shortcut
a61af66fc99e Initial load
duke
parents:
diff changeset
3650 // anymore. We call vm_exit_during_initialization directly instead.
a61af66fc99e Initial load
duke
parents:
diff changeset
3651 SystemDictionary::compute_java_system_loader(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3652 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3653 vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION));
a61af66fc99e Initial load
duke
parents:
diff changeset
3654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3655
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
3656 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3657 // Support for ConcurrentMarkSweep. This should be cleaned up
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3658 // and better encapsulated. The ugly nested if test would go away
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3659 // once things are properly refactored. XXX YSR
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3660 if (UseConcMarkSweepGC || UseG1GC) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3661 if (UseConcMarkSweepGC) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3662 ConcurrentMarkSweepThread::makeSurrogateLockerThread(THREAD);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3663 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3664 ConcurrentMarkThread::makeSurrogateLockerThread(THREAD);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3665 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3666 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3667 vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION));
a61af66fc99e Initial load
duke
parents:
diff changeset
3668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3669 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
3670 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3671
a61af66fc99e Initial load
duke
parents:
diff changeset
3672 // Always call even when there are not JVMTI environments yet, since environments
a61af66fc99e Initial load
duke
parents:
diff changeset
3673 // may be attached late and JVMTI must track phases of VM execution
a61af66fc99e Initial load
duke
parents:
diff changeset
3674 JvmtiExport::enter_live_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
3675
a61af66fc99e Initial load
duke
parents:
diff changeset
3676 // Signal Dispatcher needs to be started before VMInit event is posted
a61af66fc99e Initial load
duke
parents:
diff changeset
3677 os::signal_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
3678
a61af66fc99e Initial load
duke
parents:
diff changeset
3679 // Start Attach Listener if +StartAttachListener or it can't be started lazily
a61af66fc99e Initial load
duke
parents:
diff changeset
3680 if (!DisableAttachMechanism) {
11139
2e8f19c2feef 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 11136
diff changeset
3681 AttachListener::vm_start();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3682 if (StartAttachListener || AttachListener::init_at_startup()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3683 AttachListener::init();
a61af66fc99e Initial load
duke
parents:
diff changeset
3684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3686
a61af66fc99e Initial load
duke
parents:
diff changeset
3687 // Launch -Xrun agents
a61af66fc99e Initial load
duke
parents:
diff changeset
3688 // Must be done in the JVMTI live phase so that for backward compatibility the JDWP
a61af66fc99e Initial load
duke
parents:
diff changeset
3689 // back-end can launch with -Xdebug -Xrunjdwp.
a61af66fc99e Initial load
duke
parents:
diff changeset
3690 if (!EagerXrunInit && Arguments::init_libraries_at_startup()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3691 create_vm_init_libraries();
a61af66fc99e Initial load
duke
parents:
diff changeset
3692 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3693
6002
df4cd4aac5c1 7160924: jvmti: GetPhase returns incorrect phase before VMInit event is issued
rbackman
parents: 5928
diff changeset
3694 // Notify JVMTI agents that VM initialization is complete - nop if no agents.
df4cd4aac5c1 7160924: jvmti: GetPhase returns incorrect phase before VMInit event is issued
rbackman
parents: 5928
diff changeset
3695 JvmtiExport::post_vm_initialized();
df4cd4aac5c1 7160924: jvmti: GetPhase returns incorrect phase before VMInit event is issued
rbackman
parents: 5928
diff changeset
3696
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
3697 if (TRACE_START() != JNI_OK) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10190
diff changeset
3698 vm_exit_during_initialization("Failed to start tracing backend.");
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4095
diff changeset
3699 }
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4095
diff changeset
3700
3799
48048b59a551 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 3769
diff changeset
3701 if (CleanChunkPoolAsync) {
48048b59a551 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 3769
diff changeset
3702 Chunk::start_chunk_pool_cleaner_task();
48048b59a551 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 3769
diff changeset
3703 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3704
a61af66fc99e Initial load
duke
parents:
diff changeset
3705 // initialize compiler(s)
7212
291ffc492eb6 Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
Doug Simon <doug.simon@oracle.com>
parents: 7125 7206
diff changeset
3706 #if defined(COMPILER1) || defined(COMPILER2) || defined(SHARK) || defined(GRAALVM)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3707 CompileBroker::compilation_init();
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
3708 #endif
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
3709
12163
74608df95ba3 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 11154
diff changeset
3710 if (EnableInvokeDynamic) {
74608df95ba3 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 11154
diff changeset
3711 // Pre-initialize some JSR292 core classes to avoid deadlock during class loading.
74608df95ba3 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 11154
diff changeset
3712 // It is done after compilers are initialized, because otherwise compilations of
74608df95ba3 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 11154
diff changeset
3713 // signature polymorphic MH intrinsics can be missed
74608df95ba3 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 11154
diff changeset
3714 // (see SystemDictionary::find_method_handle_intrinsic).
74608df95ba3 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 11154
diff changeset
3715 initialize_class(vmSymbols::java_lang_invoke_MethodHandle(), CHECK_0);
74608df95ba3 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 11154
diff changeset
3716 initialize_class(vmSymbols::java_lang_invoke_MemberName(), CHECK_0);
74608df95ba3 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 11154
diff changeset
3717 initialize_class(vmSymbols::java_lang_invoke_MethodHandleNatives(), CHECK_0);
74608df95ba3 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 11154
diff changeset
3718 }
74608df95ba3 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 11154
diff changeset
3719
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
3720 #if INCLUDE_MANAGEMENT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3721 Management::initialize(THREAD);
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
3722 #endif // INCLUDE_MANAGEMENT
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
3723
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3724 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3725 // management agent fails to start possibly due to
a61af66fc99e Initial load
duke
parents:
diff changeset
3726 // configuration problem and is responsible for printing
a61af66fc99e Initial load
duke
parents:
diff changeset
3727 // stack trace if appropriate. Simply exit VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
3728 vm_exit(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3730
a61af66fc99e Initial load
duke
parents:
diff changeset
3731 if (Arguments::has_profile()) FlatProfiler::engage(main_thread, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
3732 if (MemProfiling) MemProfiler::engage();
a61af66fc99e Initial load
duke
parents:
diff changeset
3733 StatSampler::engage();
a61af66fc99e Initial load
duke
parents:
diff changeset
3734 if (CheckJNICalls) JniPeriodicChecker::engage();
a61af66fc99e Initial load
duke
parents:
diff changeset
3735
a61af66fc99e Initial load
duke
parents:
diff changeset
3736 BiasedLocking::init();
a61af66fc99e Initial load
duke
parents:
diff changeset
3737
2129
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
3738 if (JDK_Version::current().post_vm_init_hook_enabled()) {
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
3739 call_postVMInitHook(THREAD);
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
3740 // The Java side of PostVMInitHook.run must deal with all
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
3741 // exceptions and provide means of diagnosis.
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
3742 if (HAS_PENDING_EXCEPTION) {
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
3743 CLEAR_PENDING_EXCEPTION;
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
3744 }
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2126
diff changeset
3745 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3746
6939
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3747 {
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3748 MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag);
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3749 // Make sure the watcher thread can be started by WatcherThread::start()
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3750 // or by dynamic enrollment.
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3751 WatcherThread::make_startable();
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3752 // Start up the WatcherThread if there are any periodic tasks
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3753 // NOTE: All PeriodicTasks should be registered by now. If they
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3754 // aren't, late joiners might appear to start slowly (we might
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3755 // take a while to process their first tick).
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3756 if (PeriodicTask::num_tasks() > 0) {
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3757 WatcherThread::start();
c284cf4781f0 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 6921
diff changeset
3758 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3760
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1608
diff changeset
3761 // Give os specific code one last chance to start
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1608
diff changeset
3762 os::init_3();
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1608
diff changeset
3763
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3764 create_vm_timer.end();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
3765 #ifdef ASSERT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
3766 _vm_complete = true;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
3767 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3768 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3770
a61af66fc99e Initial load
duke
parents:
diff changeset
3771 // type for the Agent_OnLoad and JVM_OnLoad entry points
a61af66fc99e Initial load
duke
parents:
diff changeset
3772 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
3773 typedef jint (JNICALL *OnLoadEntry_t)(JavaVM *, char *, void *);
a61af66fc99e Initial load
duke
parents:
diff changeset
3774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3775 // Find a command line agent library and return its entry point for
a61af66fc99e Initial load
duke
parents:
diff changeset
3776 // -agentlib: -agentpath: -Xrun
a61af66fc99e Initial load
duke
parents:
diff changeset
3777 // num_symbol_entries must be passed-in since only the caller knows the number of symbols in the array.
a61af66fc99e Initial load
duke
parents:
diff changeset
3778 static OnLoadEntry_t lookup_on_load(AgentLibrary* agent, const char *on_load_symbols[], size_t num_symbol_entries) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3779 OnLoadEntry_t on_load_entry = NULL;
12117
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3780 void *library = NULL;
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3781
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3782 if (!agent->valid()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3783 char buffer[JVM_MAXPATHLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
3784 char ebuf[1024];
a61af66fc99e Initial load
duke
parents:
diff changeset
3785 const char *name = agent->name();
1694
ab3fd720516c 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 1681
diff changeset
3786 const char *msg = "Could not find agent library ";
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3787
12220
8e94527f601e 8024007: Misc. cleanup of static agent code
bpittore
parents: 12173
diff changeset
3788 // First check to see if agent is statically linked into executable
12117
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3789 if (os::find_builtin_agent(agent, on_load_symbols, num_symbol_entries)) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3790 library = agent->os_lib();
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3791 } else if (agent->is_absolute_path()) {
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3792 library = os::dll_load(name, ebuf, sizeof ebuf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3793 if (library == NULL) {
1694
ab3fd720516c 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 1681
diff changeset
3794 const char *sub_msg = " in absolute path, with error: ";
ab3fd720516c 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 1681
diff changeset
3795 size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3796 char *buf = NEW_C_HEAP_ARRAY(char, len, mtThread);
1694
ab3fd720516c 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 1681
diff changeset
3797 jio_snprintf(buf, len, "%s%s%s%s", msg, name, sub_msg, ebuf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3798 // If we can't find the agent, exit.
1694
ab3fd720516c 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 1681
diff changeset
3799 vm_exit_during_initialization(buf, NULL);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3800 FREE_C_HEAP_ARRAY(char, buf, mtThread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3801 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3802 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3803 // Try to load the agent from the standard dll directory
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6921
diff changeset
3804 if (os::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(),
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6921
diff changeset
3805 name)) {
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6921
diff changeset
3806 library = os::dll_load(buffer, ebuf, sizeof ebuf);
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6921
diff changeset
3807 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3808 if (library == NULL) { // Try the local directory
a61af66fc99e Initial load
duke
parents:
diff changeset
3809 char ns[1] = {0};
6966
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6921
diff changeset
3810 if (os::dll_build_name(buffer, sizeof(buffer), ns, name)) {
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6921
diff changeset
3811 library = os::dll_load(buffer, ebuf, sizeof ebuf);
6cb0d32b828b 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 6921
diff changeset
3812 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3813 if (library == NULL) {
1694
ab3fd720516c 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 1681
diff changeset
3814 const char *sub_msg = " on the library path, with error: ";
ab3fd720516c 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 1681
diff changeset
3815 size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3816 char *buf = NEW_C_HEAP_ARRAY(char, len, mtThread);
1694
ab3fd720516c 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 1681
diff changeset
3817 jio_snprintf(buf, len, "%s%s%s%s", msg, name, sub_msg, ebuf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3818 // If we can't find the agent, exit.
1694
ab3fd720516c 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 1681
diff changeset
3819 vm_exit_during_initialization(buf, NULL);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3820 FREE_C_HEAP_ARRAY(char, buf, mtThread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3821 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3822 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3823 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3824 agent->set_os_lib(library);
12117
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3825 agent->set_valid();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3826 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3827
a61af66fc99e Initial load
duke
parents:
diff changeset
3828 // Find the OnLoad function.
12117
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3829 on_load_entry =
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3830 CAST_TO_FN_PTR(OnLoadEntry_t, os::find_agent_function(agent,
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3831 false,
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3832 on_load_symbols,
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3833 num_symbol_entries));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3834 return on_load_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
3835 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3836
a61af66fc99e Initial load
duke
parents:
diff changeset
3837 // Find the JVM_OnLoad entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
3838 static OnLoadEntry_t lookup_jvm_on_load(AgentLibrary* agent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3839 const char *on_load_symbols[] = JVM_ONLOAD_SYMBOLS;
a61af66fc99e Initial load
duke
parents:
diff changeset
3840 return lookup_on_load(agent, on_load_symbols, sizeof(on_load_symbols) / sizeof(char*));
a61af66fc99e Initial load
duke
parents:
diff changeset
3841 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3842
a61af66fc99e Initial load
duke
parents:
diff changeset
3843 // Find the Agent_OnLoad entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
3844 static OnLoadEntry_t lookup_agent_on_load(AgentLibrary* agent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3845 const char *on_load_symbols[] = AGENT_ONLOAD_SYMBOLS;
a61af66fc99e Initial load
duke
parents:
diff changeset
3846 return lookup_on_load(agent, on_load_symbols, sizeof(on_load_symbols) / sizeof(char*));
a61af66fc99e Initial load
duke
parents:
diff changeset
3847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3848
a61af66fc99e Initial load
duke
parents:
diff changeset
3849 // For backwards compatibility with -Xrun
a61af66fc99e Initial load
duke
parents:
diff changeset
3850 // Convert libraries with no JVM_OnLoad, but which have Agent_OnLoad to be
a61af66fc99e Initial load
duke
parents:
diff changeset
3851 // treated like -agentpath:
a61af66fc99e Initial load
duke
parents:
diff changeset
3852 // Must be called before agent libraries are created
a61af66fc99e Initial load
duke
parents:
diff changeset
3853 void Threads::convert_vm_init_libraries_to_agents() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3854 AgentLibrary* agent;
a61af66fc99e Initial load
duke
parents:
diff changeset
3855 AgentLibrary* next;
a61af66fc99e Initial load
duke
parents:
diff changeset
3856
a61af66fc99e Initial load
duke
parents:
diff changeset
3857 for (agent = Arguments::libraries(); agent != NULL; agent = next) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3858 next = agent->next(); // cache the next agent now as this agent may get moved off this list
a61af66fc99e Initial load
duke
parents:
diff changeset
3859 OnLoadEntry_t on_load_entry = lookup_jvm_on_load(agent);
a61af66fc99e Initial load
duke
parents:
diff changeset
3860
a61af66fc99e Initial load
duke
parents:
diff changeset
3861 // If there is an JVM_OnLoad function it will get called later,
a61af66fc99e Initial load
duke
parents:
diff changeset
3862 // otherwise see if there is an Agent_OnLoad
a61af66fc99e Initial load
duke
parents:
diff changeset
3863 if (on_load_entry == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3864 on_load_entry = lookup_agent_on_load(agent);
a61af66fc99e Initial load
duke
parents:
diff changeset
3865 if (on_load_entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3866 // switch it to the agent list -- so that Agent_OnLoad will be called,
a61af66fc99e Initial load
duke
parents:
diff changeset
3867 // JVM_OnLoad won't be attempted and Agent_OnUnload will
a61af66fc99e Initial load
duke
parents:
diff changeset
3868 Arguments::convert_library_to_agent(agent);
a61af66fc99e Initial load
duke
parents:
diff changeset
3869 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3870 vm_exit_during_initialization("Could not find JVM_OnLoad or Agent_OnLoad function in the library", agent->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
3871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3875
a61af66fc99e Initial load
duke
parents:
diff changeset
3876 // Create agents for -agentlib: -agentpath: and converted -Xrun
a61af66fc99e Initial load
duke
parents:
diff changeset
3877 // Invokes Agent_OnLoad
a61af66fc99e Initial load
duke
parents:
diff changeset
3878 // Called very early -- before JavaThreads exist
a61af66fc99e Initial load
duke
parents:
diff changeset
3879 void Threads::create_vm_init_agents() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3880 extern struct JavaVM_ main_vm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3881 AgentLibrary* agent;
a61af66fc99e Initial load
duke
parents:
diff changeset
3882
a61af66fc99e Initial load
duke
parents:
diff changeset
3883 JvmtiExport::enter_onload_phase();
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6769
diff changeset
3884
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3885 for (agent = Arguments::agents(); agent != NULL; agent = agent->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3886 OnLoadEntry_t on_load_entry = lookup_agent_on_load(agent);
a61af66fc99e Initial load
duke
parents:
diff changeset
3887
a61af66fc99e Initial load
duke
parents:
diff changeset
3888 if (on_load_entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3889 // Invoke the Agent_OnLoad function
a61af66fc99e Initial load
duke
parents:
diff changeset
3890 jint err = (*on_load_entry)(&main_vm, agent->options(), NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3891 if (err != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3892 vm_exit_during_initialization("agent library failed to init", agent->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
3893 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3894 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3895 vm_exit_during_initialization("Could not find Agent_OnLoad function in the agent library", agent->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
3896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3897 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3898 JvmtiExport::enter_primordial_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
3899 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3900
a61af66fc99e Initial load
duke
parents:
diff changeset
3901 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
3902 typedef void (JNICALL *Agent_OnUnload_t)(JavaVM *);
a61af66fc99e Initial load
duke
parents:
diff changeset
3903 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3904
a61af66fc99e Initial load
duke
parents:
diff changeset
3905 void Threads::shutdown_vm_agents() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3906 // Send any Agent_OnUnload notifications
a61af66fc99e Initial load
duke
parents:
diff changeset
3907 const char *on_unload_symbols[] = AGENT_ONUNLOAD_SYMBOLS;
12117
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3908 size_t num_symbol_entries = ARRAY_SIZE(on_unload_symbols);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3909 extern struct JavaVM_ main_vm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3910 for (AgentLibrary* agent = Arguments::agents(); agent != NULL; agent = agent->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3911
a61af66fc99e Initial load
duke
parents:
diff changeset
3912 // Find the Agent_OnUnload function.
12117
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3913 Agent_OnUnload_t unload_entry = CAST_TO_FN_PTR(Agent_OnUnload_t,
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3914 os::find_agent_function(agent,
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3915 false,
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3916 on_unload_symbols,
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3917 num_symbol_entries));
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3918
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3919 // Invoke the Agent_OnUnload function
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3920 if (unload_entry != NULL) {
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3921 JavaThread* thread = JavaThread::current();
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3922 ThreadToNativeFromVM ttn(thread);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3923 HandleMark hm(thread);
f92b82d454fa 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 11154
diff changeset
3924 (*unload_entry)(&main_vm);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3925 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3926 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3927 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3928
a61af66fc99e Initial load
duke
parents:
diff changeset
3929 // Called for after the VM is initialized for -Xrun libraries which have not been converted to agent libraries
a61af66fc99e Initial load
duke
parents:
diff changeset
3930 // Invokes JVM_OnLoad
a61af66fc99e Initial load
duke
parents:
diff changeset
3931 void Threads::create_vm_init_libraries() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3932 extern struct JavaVM_ main_vm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3933 AgentLibrary* agent;
a61af66fc99e Initial load
duke
parents:
diff changeset
3934
a61af66fc99e Initial load
duke
parents:
diff changeset
3935 for (agent = Arguments::libraries(); agent != NULL; agent = agent->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3936 OnLoadEntry_t on_load_entry = lookup_jvm_on_load(agent);
a61af66fc99e Initial load
duke
parents:
diff changeset
3937
a61af66fc99e Initial load
duke
parents:
diff changeset
3938 if (on_load_entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3939 // Invoke the JVM_OnLoad function
a61af66fc99e Initial load
duke
parents:
diff changeset
3940 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3941 ThreadToNativeFromVM ttn(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3942 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3943 jint err = (*on_load_entry)(&main_vm, agent->options(), NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3944 if (err != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3945 vm_exit_during_initialization("-Xrun library failed to init", agent->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
3946 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3947 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3948 vm_exit_during_initialization("Could not find JVM_OnLoad function in -Xrun library", agent->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
3949 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3950 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3951 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3952
a61af66fc99e Initial load
duke
parents:
diff changeset
3953 // Last thread running calls java.lang.Shutdown.shutdown()
a61af66fc99e Initial load
duke
parents:
diff changeset
3954 void JavaThread::invoke_shutdown_hooks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3955 HandleMark hm(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3956
a61af66fc99e Initial load
duke
parents:
diff changeset
3957 // We could get here with a pending exception, if so clear it now.
a61af66fc99e Initial load
duke
parents:
diff changeset
3958 if (this->has_pending_exception()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3959 this->clear_pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
3960 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3961
a61af66fc99e Initial load
duke
parents:
diff changeset
3962 EXCEPTION_MARK;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
3963 Klass* k =
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
3964 SystemDictionary::resolve_or_null(vmSymbols::java_lang_Shutdown(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3965 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3966 if (k != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3967 // SystemDictionary::resolve_or_null will return null if there was
a61af66fc99e Initial load
duke
parents:
diff changeset
3968 // an exception. If we cannot load the Shutdown class, just don't
a61af66fc99e Initial load
duke
parents:
diff changeset
3969 // call Shutdown.shutdown() at all. This will mean the shutdown hooks
a61af66fc99e Initial load
duke
parents:
diff changeset
3970 // and finalizers (if runFinalizersOnExit is set) won't be run.
a61af66fc99e Initial load
duke
parents:
diff changeset
3971 // Note that if a shutdown hook was registered or runFinalizersOnExit
a61af66fc99e Initial load
duke
parents:
diff changeset
3972 // was called, the Shutdown class would have already been loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
3973 // (Runtime.addShutdownHook and runFinalizersOnExit will load it).
a61af66fc99e Initial load
duke
parents:
diff changeset
3974 instanceKlassHandle shutdown_klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
3975 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
3976 JavaCalls::call_static(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
3977 shutdown_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
3978 vmSymbols::shutdown_method_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
3979 vmSymbols::void_method_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3980 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3981 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3982 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
3983 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3984
a61af66fc99e Initial load
duke
parents:
diff changeset
3985 // Threads::destroy_vm() is normally called from jni_DestroyJavaVM() when
a61af66fc99e Initial load
duke
parents:
diff changeset
3986 // the program falls off the end of main(). Another VM exit path is through
a61af66fc99e Initial load
duke
parents:
diff changeset
3987 // vm_exit() when the program calls System.exit() to return a value or when
a61af66fc99e Initial load
duke
parents:
diff changeset
3988 // there is a serious error in VM. The two shutdown paths are not exactly
a61af66fc99e Initial load
duke
parents:
diff changeset
3989 // the same, but they share Shutdown.shutdown() at Java level and before_exit()
a61af66fc99e Initial load
duke
parents:
diff changeset
3990 // and VM_Exit op at VM level.
a61af66fc99e Initial load
duke
parents:
diff changeset
3991 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3992 // Shutdown sequence:
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
3993 // + Shutdown native memory tracking if it is on
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3994 // + Wait until we are the last non-daemon thread to execute
a61af66fc99e Initial load
duke
parents:
diff changeset
3995 // <-- every thing is still working at this moment -->
a61af66fc99e Initial load
duke
parents:
diff changeset
3996 // + Call java.lang.Shutdown.shutdown(), which will invoke Java level
a61af66fc99e Initial load
duke
parents:
diff changeset
3997 // shutdown hooks, run finalizers if finalization-on-exit
a61af66fc99e Initial load
duke
parents:
diff changeset
3998 // + Call before_exit(), prepare for VM exit
a61af66fc99e Initial load
duke
parents:
diff changeset
3999 // > run VM level shutdown hooks (they are registered through JVM_OnExit(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4000 // currently the only user of this mechanism is File.deleteOnExit())
a61af66fc99e Initial load
duke
parents:
diff changeset
4001 // > stop flat profiler, StatSampler, watcher thread, CMS threads,
a61af66fc99e Initial load
duke
parents:
diff changeset
4002 // post thread end and vm death events to JVMTI,
a61af66fc99e Initial load
duke
parents:
diff changeset
4003 // stop signal thread
a61af66fc99e Initial load
duke
parents:
diff changeset
4004 // + Call JavaThread::exit(), it will:
a61af66fc99e Initial load
duke
parents:
diff changeset
4005 // > release JNI handle blocks, remove stack guard pages
a61af66fc99e Initial load
duke
parents:
diff changeset
4006 // > remove this thread from Threads list
a61af66fc99e Initial load
duke
parents:
diff changeset
4007 // <-- no more Java code from this thread after this point -->
a61af66fc99e Initial load
duke
parents:
diff changeset
4008 // + Stop VM thread, it will bring the remaining VM to a safepoint and stop
a61af66fc99e Initial load
duke
parents:
diff changeset
4009 // the compiler threads at safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
4010 // <-- do not use anything that could get blocked by Safepoint -->
a61af66fc99e Initial load
duke
parents:
diff changeset
4011 // + Disable tracing at JNI/JVM barriers
a61af66fc99e Initial load
duke
parents:
diff changeset
4012 // + Set _vm_exited flag for threads that are still running native code
a61af66fc99e Initial load
duke
parents:
diff changeset
4013 // + Delete this thread
a61af66fc99e Initial load
duke
parents:
diff changeset
4014 // + Call exit_globals()
a61af66fc99e Initial load
duke
parents:
diff changeset
4015 // > deletes tty
a61af66fc99e Initial load
duke
parents:
diff changeset
4016 // > deletes PerfMemory resources
a61af66fc99e Initial load
duke
parents:
diff changeset
4017 // + Return to caller
a61af66fc99e Initial load
duke
parents:
diff changeset
4018
a61af66fc99e Initial load
duke
parents:
diff changeset
4019 bool Threads::destroy_vm() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4020 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
4021
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
4022 #ifdef ASSERT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
4023 _vm_complete = false;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
4024 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4025 // Wait until we are the last non-daemon thread to execute
a61af66fc99e Initial load
duke
parents:
diff changeset
4026 { MutexLocker nu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
4027 while (Threads::number_of_non_daemon_threads() > 1 )
a61af66fc99e Initial load
duke
parents:
diff changeset
4028 // This wait should make safepoint checks, wait without a timeout,
a61af66fc99e Initial load
duke
parents:
diff changeset
4029 // and wait as a suspend-equivalent condition.
a61af66fc99e Initial load
duke
parents:
diff changeset
4030 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4031 // Note: If the FlatProfiler is running and this thread is waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
4032 // for another non-daemon thread to finish, then the FlatProfiler
a61af66fc99e Initial load
duke
parents:
diff changeset
4033 // is waiting for the external suspend request on this thread to
a61af66fc99e Initial load
duke
parents:
diff changeset
4034 // complete. wait_for_ext_suspend_completion() will eventually
a61af66fc99e Initial load
duke
parents:
diff changeset
4035 // timeout, but that takes time. Making this wait a suspend-
a61af66fc99e Initial load
duke
parents:
diff changeset
4036 // equivalent condition solves that timeout problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
4037 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4038 Threads_lock->wait(!Mutex::_no_safepoint_check_flag, 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
4039 Mutex::_as_suspend_equivalent_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
4040 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4041
a61af66fc99e Initial load
duke
parents:
diff changeset
4042 // Hang forever on exit if we are reporting an error.
a61af66fc99e Initial load
duke
parents:
diff changeset
4043 if (ShowMessageBoxOnError && is_error_reported()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4044 os::infinite_sleep();
a61af66fc99e Initial load
duke
parents:
diff changeset
4045 }
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2203
diff changeset
4046 os::wait_for_keypress_at_exit();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4047
a61af66fc99e Initial load
duke
parents:
diff changeset
4048 if (JDK_Version::is_jdk12x_version()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4049 // We are the last thread running, so check if finalizers should be run.
a61af66fc99e Initial load
duke
parents:
diff changeset
4050 // For 1.3 or later this is done in thread->invoke_shutdown_hooks()
a61af66fc99e Initial load
duke
parents:
diff changeset
4051 HandleMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
4052 Universe::run_finalizers_on_exit();
a61af66fc99e Initial load
duke
parents:
diff changeset
4053 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4054 // run Java level shutdown hooks
a61af66fc99e Initial load
duke
parents:
diff changeset
4055 thread->invoke_shutdown_hooks();
a61af66fc99e Initial load
duke
parents:
diff changeset
4056 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4057
a61af66fc99e Initial load
duke
parents:
diff changeset
4058 before_exit(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
4059
a61af66fc99e Initial load
duke
parents:
diff changeset
4060 thread->exit(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
4061
a61af66fc99e Initial load
duke
parents:
diff changeset
4062 // Stop VM thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
4063 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4064 // 4945125 The vm thread comes to a safepoint during exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
4065 // GC vm_operations can get caught at the safepoint, and the
a61af66fc99e Initial load
duke
parents:
diff changeset
4066 // heap is unparseable if they are caught. Grab the Heap_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
4067 // to prevent this. The GC vm_operations will not be able to
a61af66fc99e Initial load
duke
parents:
diff changeset
4068 // queue until after the vm thread is dead.
3769
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 3388
diff changeset
4069 // After this point, we'll never emerge out of the safepoint before
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 3388
diff changeset
4070 // the VM exits, so concurrent GC threads do not need to be explicitly
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 3388
diff changeset
4071 // stopped; they remain inactive until the process exits.
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 3388
diff changeset
4072 // Note: some concurrent G1 threads may be running during a safepoint,
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 3388
diff changeset
4073 // but these will not be accessing the heap, just some G1-specific side
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 3388
diff changeset
4074 // data structures that are not accessed by any other threads but them
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 3388
diff changeset
4075 // after this point in a terminal safepoint.
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 3388
diff changeset
4076
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4077 MutexLocker ml(Heap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
4078
a61af66fc99e Initial load
duke
parents:
diff changeset
4079 VMThread::wait_for_vm_thread_exit();
a61af66fc99e Initial load
duke
parents:
diff changeset
4080 assert(SafepointSynchronize::is_at_safepoint(), "VM thread should exit at Safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
4081 VMThread::destroy();
a61af66fc99e Initial load
duke
parents:
diff changeset
4082 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4083
a61af66fc99e Initial load
duke
parents:
diff changeset
4084 // clean up ideal graph printers
a61af66fc99e Initial load
duke
parents:
diff changeset
4085 #if defined(COMPILER2) && !defined(PRODUCT)
a61af66fc99e Initial load
duke
parents:
diff changeset
4086 IdealGraphPrinter::clean_up();
a61af66fc99e Initial load
duke
parents:
diff changeset
4087 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
4088
a61af66fc99e Initial load
duke
parents:
diff changeset
4089 // Now, all Java threads are gone except daemon threads. Daemon threads
a61af66fc99e Initial load
duke
parents:
diff changeset
4090 // running Java code or in VM are stopped by the Safepoint. However,
a61af66fc99e Initial load
duke
parents:
diff changeset
4091 // daemon threads executing native code are still running. But they
a61af66fc99e Initial load
duke
parents:
diff changeset
4092 // will be stopped at native=>Java/VM barriers. Note that we can't
a61af66fc99e Initial load
duke
parents:
diff changeset
4093 // simply kill or suspend them, as it is inherently deadlock-prone.
a61af66fc99e Initial load
duke
parents:
diff changeset
4094
a61af66fc99e Initial load
duke
parents:
diff changeset
4095 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
4096 // disable function tracing at JNI/JVM barriers
a61af66fc99e Initial load
duke
parents:
diff changeset
4097 TraceJNICalls = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4098 TraceJVMCalls = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4099 TraceRuntimeCalls = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4100 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
4101
a61af66fc99e Initial load
duke
parents:
diff changeset
4102 VM_Exit::set_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
4103
a61af66fc99e Initial load
duke
parents:
diff changeset
4104 notify_vm_shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
4105
a61af66fc99e Initial load
duke
parents:
diff changeset
4106 delete thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
4107
a61af66fc99e Initial load
duke
parents:
diff changeset
4108 // exit_globals() will delete tty
a61af66fc99e Initial load
duke
parents:
diff changeset
4109 exit_globals();
a61af66fc99e Initial load
duke
parents:
diff changeset
4110
a61af66fc99e Initial load
duke
parents:
diff changeset
4111 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4113
a61af66fc99e Initial load
duke
parents:
diff changeset
4114
a61af66fc99e Initial load
duke
parents:
diff changeset
4115 jboolean Threads::is_supported_jni_version_including_1_1(jint version) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4116 if (version == JNI_VERSION_1_1) return JNI_TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
4117 return is_supported_jni_version(version);
a61af66fc99e Initial load
duke
parents:
diff changeset
4118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4119
a61af66fc99e Initial load
duke
parents:
diff changeset
4120
a61af66fc99e Initial load
duke
parents:
diff changeset
4121 jboolean Threads::is_supported_jni_version(jint version) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4122 if (version == JNI_VERSION_1_2) return JNI_TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
4123 if (version == JNI_VERSION_1_4) return JNI_TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
4124 if (version == JNI_VERSION_1_6) return JNI_TRUE;
8793
499ccc15bbc8 8005716: Enhance JNI specification to allow support of static JNI libraries in Embedded JREs
bpittore
parents: 8673
diff changeset
4125 if (version == JNI_VERSION_1_8) return JNI_TRUE;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4126 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
4127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4128
a61af66fc99e Initial load
duke
parents:
diff changeset
4129
a61af66fc99e Initial load
duke
parents:
diff changeset
4130 void Threads::add(JavaThread* p, bool force_daemon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4131 // The threads lock must be owned at this point
a61af66fc99e Initial load
duke
parents:
diff changeset
4132 assert_locked_or_safepoint(Threads_lock);
1842
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
4133
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
4134 // See the comment for this method in thread.hpp for its purpose and
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
4135 // why it is called here.
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1838
diff changeset
4136 p->initialize_queues();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4137 p->set_next(_thread_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
4138 _thread_list = p;
a61af66fc99e Initial load
duke
parents:
diff changeset
4139 _number_of_threads++;
a61af66fc99e Initial load
duke
parents:
diff changeset
4140 oop threadObj = p->threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
4141 bool daemon = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4142 // Bootstrapping problem: threadObj can be null for initial
a61af66fc99e Initial load
duke
parents:
diff changeset
4143 // JavaThread (or for threads attached via JNI)
a61af66fc99e Initial load
duke
parents:
diff changeset
4144 if ((!force_daemon) && (threadObj == NULL || !java_lang_Thread::is_daemon(threadObj))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4145 _number_of_non_daemon_threads++;
a61af66fc99e Initial load
duke
parents:
diff changeset
4146 daemon = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4148
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
4149 p->set_safepoint_visible(true);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
4150
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4151 ThreadService::add_thread(p, daemon);
a61af66fc99e Initial load
duke
parents:
diff changeset
4152
a61af66fc99e Initial load
duke
parents:
diff changeset
4153 // Possible GC point.
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4800
diff changeset
4154 Events::log(p, "Thread added: " INTPTR_FORMAT, p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4156
a61af66fc99e Initial load
duke
parents:
diff changeset
4157 void Threads::remove(JavaThread* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4158 // Extra scope needed for Thread_lock, so we can check
a61af66fc99e Initial load
duke
parents:
diff changeset
4159 // that we do not remove thread without safepoint code notice
a61af66fc99e Initial load
duke
parents:
diff changeset
4160 { MutexLocker ml(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
4161
a61af66fc99e Initial load
duke
parents:
diff changeset
4162 assert(includes(p), "p must be present");
a61af66fc99e Initial load
duke
parents:
diff changeset
4163
a61af66fc99e Initial load
duke
parents:
diff changeset
4164 JavaThread* current = _thread_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
4165 JavaThread* prev = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4166
a61af66fc99e Initial load
duke
parents:
diff changeset
4167 while (current != p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4168 prev = current;
a61af66fc99e Initial load
duke
parents:
diff changeset
4169 current = current->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
4170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4171
a61af66fc99e Initial load
duke
parents:
diff changeset
4172 if (prev) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4173 prev->set_next(current->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
4174 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4175 _thread_list = p->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
4176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4177 _number_of_threads--;
a61af66fc99e Initial load
duke
parents:
diff changeset
4178 oop threadObj = p->threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
4179 bool daemon = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4180 if (threadObj == NULL || !java_lang_Thread::is_daemon(threadObj)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4181 _number_of_non_daemon_threads--;
a61af66fc99e Initial load
duke
parents:
diff changeset
4182 daemon = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4183
a61af66fc99e Initial load
duke
parents:
diff changeset
4184 // Only one thread left, do a notify on the Threads_lock so a thread waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
4185 // on destroy_vm will wake up.
a61af66fc99e Initial load
duke
parents:
diff changeset
4186 if (number_of_non_daemon_threads() == 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
4187 Threads_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
4188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4189 ThreadService::remove_thread(p, daemon);
a61af66fc99e Initial load
duke
parents:
diff changeset
4190
a61af66fc99e Initial load
duke
parents:
diff changeset
4191 // Make sure that safepoint code disregard this thread. This is needed since
a61af66fc99e Initial load
duke
parents:
diff changeset
4192 // the thread might mess around with locks after this point. This can cause it
a61af66fc99e Initial load
duke
parents:
diff changeset
4193 // to do callbacks into the safepoint code. However, the safepoint code is not aware
a61af66fc99e Initial load
duke
parents:
diff changeset
4194 // of this thread since it is removed from the queue.
a61af66fc99e Initial load
duke
parents:
diff changeset
4195 p->set_terminated_value();
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
4196
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
4197 // Now, this thread is not visible to safepoint
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6002
diff changeset
4198 p->set_safepoint_visible(false);
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
4199 // once the thread becomes safepoint invisible, we can not use its per-thread
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
4200 // recorder. And Threads::do_threads() no longer walks this thread, so we have
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
4201 // to release its per-thread recorder here.
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6872
diff changeset
4202 MemTracker::thread_exiting(p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4203 } // unlock Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
4204
a61af66fc99e Initial load
duke
parents:
diff changeset
4205 // Since Events::log uses a lock, we grab it outside the Threads_lock
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4800
diff changeset
4206 Events::log(p, "Thread exited: " INTPTR_FORMAT, p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4208
a61af66fc99e Initial load
duke
parents:
diff changeset
4209 // Threads_lock must be held when this is called (or must be called during a safepoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
4210 bool Threads::includes(JavaThread* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4211 assert(Threads_lock->is_locked(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
4212 ALL_JAVA_THREADS(q) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4213 if (q == p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4214 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4217 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4219
a61af66fc99e Initial load
duke
parents:
diff changeset
4220 // Operations on the Threads list for GC. These are not explicitly locked,
a61af66fc99e Initial load
duke
parents:
diff changeset
4221 // but the garbage collector must provide a safe context for them to run.
a61af66fc99e Initial load
duke
parents:
diff changeset
4222 // In particular, these things should never be called when the Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
4223 // is held by some other thread. (Note: the Safepoint abstraction also
a61af66fc99e Initial load
duke
parents:
diff changeset
4224 // uses the Threads_lock to gurantee this property. It also makes sure that
a61af66fc99e Initial load
duke
parents:
diff changeset
4225 // all threads gets blocked when exiting or starting).
a61af66fc99e Initial load
duke
parents:
diff changeset
4226
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
4227 void Threads::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4228 ALL_JAVA_THREADS(p) {
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
4229 p->oops_do(f, cld_f, cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4230 }
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
4231 VMThread::vm_thread()->oops_do(f, cld_f, cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4233
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
4234 void Threads::possibly_parallel_oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4235 // Introduce a mechanism allowing parallel threads to claim threads as
a61af66fc99e Initial load
duke
parents:
diff changeset
4236 // root groups. Overhead should be small enough to use all the time,
a61af66fc99e Initial load
duke
parents:
diff changeset
4237 // even in sequential code.
a61af66fc99e Initial load
duke
parents:
diff changeset
4238 SharedHeap* sh = SharedHeap::heap();
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
4239 // Cannot yet substitute active_workers for n_par_threads
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
4240 // because of G1CollectedHeap::verify() use of
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
4241 // SharedHeap::process_strong_roots(). n_par_threads == 0 will
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
4242 // turn off parallelism in process_strong_roots while active_workers
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
4243 // is being used for parallelism elsewhere.
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
4244 bool is_par = sh->n_par_threads() > 0;
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
4245 assert(!is_par ||
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
4246 (SharedHeap::heap()->n_par_threads() ==
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4042
diff changeset
4247 SharedHeap::heap()->workers()->active_workers()), "Mismatch");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4248 int cp = SharedHeap::heap()->strong_roots_parity();
a61af66fc99e Initial load
duke
parents:
diff changeset
4249 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4250 if (p->claim_oops_do(is_par, cp)) {
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
4251 p->oops_do(f, cld_f, cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4254 VMThread* vmt = VMThread::vm_thread();
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3938
diff changeset
4255 if (vmt->claim_oops_do(is_par, cp)) {
7179
d0aa87f04bd5 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 7177
diff changeset
4256 vmt->oops_do(f, cld_f, cf);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3938
diff changeset
4257 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4259
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
4260 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4261 // Used by ParallelScavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
4262 void Threads::create_thread_roots_tasks(GCTaskQueue* q) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4263 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4264 q->enqueue(new ThreadRootsTask(p));
a61af66fc99e Initial load
duke
parents:
diff changeset
4265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4266 q->enqueue(new ThreadRootsTask(VMThread::vm_thread()));
a61af66fc99e Initial load
duke
parents:
diff changeset
4267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4268
a61af66fc99e Initial load
duke
parents:
diff changeset
4269 // Used by Parallel Old
a61af66fc99e Initial load
duke
parents:
diff changeset
4270 void Threads::create_thread_roots_marking_tasks(GCTaskQueue* q) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4271 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4272 q->enqueue(new ThreadRootsMarkingTask(p));
a61af66fc99e Initial load
duke
parents:
diff changeset
4273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4274 q->enqueue(new ThreadRootsMarkingTask(VMThread::vm_thread()));
a61af66fc99e Initial load
duke
parents:
diff changeset
4275 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
4276 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4277
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
4278 void Threads::nmethods_do(CodeBlobClosure* cf) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4279 ALL_JAVA_THREADS(p) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
4280 p->nmethods_do(cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4281 }
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
4282 VMThread::vm_thread()->nmethods_do(cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4284
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
4285 void Threads::metadata_do(void f(Metadata*)) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
4286 ALL_JAVA_THREADS(p) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
4287 p->metadata_do(f);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
4288 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
4289 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6198
diff changeset
4290
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4291 void Threads::gc_epilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4292 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4293 p->gc_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
4294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4296
a61af66fc99e Initial load
duke
parents:
diff changeset
4297 void Threads::gc_prologue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4298 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4299 p->gc_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
4300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4302
a61af66fc99e Initial load
duke
parents:
diff changeset
4303 void Threads::deoptimized_wrt_marked_nmethods() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4304 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4305 p->deoptimized_wrt_marked_nmethods();
a61af66fc99e Initial load
duke
parents:
diff changeset
4306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4308
a61af66fc99e Initial load
duke
parents:
diff changeset
4309
a61af66fc99e Initial load
duke
parents:
diff changeset
4310 // Get count Java threads that are waiting to enter the specified monitor.
a61af66fc99e Initial load
duke
parents:
diff changeset
4311 GrowableArray<JavaThread*>* Threads::get_pending_threads(int count,
a61af66fc99e Initial load
duke
parents:
diff changeset
4312 address monitor, bool doLock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4313 assert(doLock || SafepointSynchronize::is_at_safepoint(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4314 "must grab Threads_lock or be at safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
4315 GrowableArray<JavaThread*>* result = new GrowableArray<JavaThread*>(count);
a61af66fc99e Initial load
duke
parents:
diff changeset
4316
a61af66fc99e Initial load
duke
parents:
diff changeset
4317 int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4318 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4319 MutexLockerEx ml(doLock ? Threads_lock : NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4320 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4321 if (p->is_Compiler_thread()) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
4322
a61af66fc99e Initial load
duke
parents:
diff changeset
4323 address pending = (address)p->current_pending_monitor();
a61af66fc99e Initial load
duke
parents:
diff changeset
4324 if (pending == monitor) { // found a match
a61af66fc99e Initial load
duke
parents:
diff changeset
4325 if (i < count) result->append(p); // save the first count matches
a61af66fc99e Initial load
duke
parents:
diff changeset
4326 i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
4327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4330 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
4331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4332
a61af66fc99e Initial load
duke
parents:
diff changeset
4333
a61af66fc99e Initial load
duke
parents:
diff changeset
4334 JavaThread *Threads::owning_thread_from_monitor_owner(address owner, bool doLock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4335 assert(doLock ||
a61af66fc99e Initial load
duke
parents:
diff changeset
4336 Threads_lock->owned_by_self() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
4337 SafepointSynchronize::is_at_safepoint(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4338 "must grab Threads_lock or be at safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
4339
a61af66fc99e Initial load
duke
parents:
diff changeset
4340 // NULL owner means not locked so we can skip the search
a61af66fc99e Initial load
duke
parents:
diff changeset
4341 if (owner == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4342
a61af66fc99e Initial load
duke
parents:
diff changeset
4343 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4344 MutexLockerEx ml(doLock ? Threads_lock : NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4345 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4346 // first, see if owner is the address of a Java thread
a61af66fc99e Initial load
duke
parents:
diff changeset
4347 if (owner == (address)p) return p;
a61af66fc99e Initial load
duke
parents:
diff changeset
4348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4349 }
8673
5ee250974db9 8007476: assert(the_owner != NULL) failed: Did not find owning Java thread for lock word address
dcubed
parents: 8041
diff changeset
4350 // Cannot assert on lack of success here since this function may be
5ee250974db9 8007476: assert(the_owner != NULL) failed: Did not find owning Java thread for lock word address
dcubed
parents: 8041
diff changeset
4351 // used by code that is trying to report useful problem information
5ee250974db9 8007476: assert(the_owner != NULL) failed: Did not find owning Java thread for lock word address
dcubed
parents: 8041
diff changeset
4352 // like deadlock detection.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4353 if (UseHeavyMonitors) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4354
a61af66fc99e Initial load
duke
parents:
diff changeset
4355 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4356 // If we didn't find a matching Java thread and we didn't force use of
a61af66fc99e Initial load
duke
parents:
diff changeset
4357 // heavyweight monitors, then the owner is the stack address of the
a61af66fc99e Initial load
duke
parents:
diff changeset
4358 // Lock Word in the owning Java thread's stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
4359 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4360 JavaThread* the_owner = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4361 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4362 MutexLockerEx ml(doLock ? Threads_lock : NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4363 ALL_JAVA_THREADS(q) {
702
b9fba36710f2 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 669
diff changeset
4364 if (q->is_lock_owned(owner)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4365 the_owner = q;
702
b9fba36710f2 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 669
diff changeset
4366 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4369 }
8673
5ee250974db9 8007476: assert(the_owner != NULL) failed: Did not find owning Java thread for lock word address
dcubed
parents: 8041
diff changeset
4370 // cannot assert on lack of success here; see above comment
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4371 return the_owner;
a61af66fc99e Initial load
duke
parents:
diff changeset
4372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4373
a61af66fc99e Initial load
duke
parents:
diff changeset
4374 // Threads::print_on() is called at safepoint by VM_PrintThreads operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
4375 void Threads::print_on(outputStream* st, bool print_stacks, bool internal_format, bool print_concurrent_locks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4376 char buf[32];
a61af66fc99e Initial load
duke
parents:
diff changeset
4377 st->print_cr(os::local_time_string(buf, sizeof(buf)));
a61af66fc99e Initial load
duke
parents:
diff changeset
4378
a61af66fc99e Initial load
duke
parents:
diff changeset
4379 st->print_cr("Full thread dump %s (%s %s):",
a61af66fc99e Initial load
duke
parents:
diff changeset
4380 Abstract_VM_Version::vm_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4381 Abstract_VM_Version::vm_release(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4382 Abstract_VM_Version::vm_info_string()
a61af66fc99e Initial load
duke
parents:
diff changeset
4383 );
a61af66fc99e Initial load
duke
parents:
diff changeset
4384 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
4385
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
4386 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4387 // Dump concurrent locks
a61af66fc99e Initial load
duke
parents:
diff changeset
4388 ConcurrentLocksDump concurrent_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
4389 if (print_concurrent_locks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4390 concurrent_locks.dump_at_safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
4391 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
4392 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4393
a61af66fc99e Initial load
duke
parents:
diff changeset
4394 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4395 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
4396 p->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
4397 if (print_stacks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4398 if (internal_format) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4399 p->trace_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
4400 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4401 p->print_stack_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
4402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4404 st->cr();
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
4405 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4406 if (print_concurrent_locks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4407 concurrent_locks.print_locks_on(p, st);
a61af66fc99e Initial load
duke
parents:
diff changeset
4408 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7615
diff changeset
4409 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4411
a61af66fc99e Initial load
duke
parents:
diff changeset
4412 VMThread::vm_thread()->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
4413 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
4414 Universe::heap()->print_gc_threads_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
4415 WatcherThread* wt = WatcherThread::watcher_thread();
6766
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
4416 if (wt != NULL) {
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
4417 wt->print_on(st);
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
4418 st->cr();
a7509aff1b06 7194254: jstack reports wrong thread priorities
dholmes
parents: 6745
diff changeset
4419 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4420 CompileBroker::print_compiler_threads_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
4421 st->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
4422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4423
a61af66fc99e Initial load
duke
parents:
diff changeset
4424 // Threads::print_on_error() is called by fatal error handler. It's possible
a61af66fc99e Initial load
duke
parents:
diff changeset
4425 // that VM is not at safepoint and/or current thread is inside signal handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
4426 // Don't print stack trace, as the stack may not be walkable. Don't allocate
a61af66fc99e Initial load
duke
parents:
diff changeset
4427 // memory (even in resource area), it might deadlock the error handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
4428 void Threads::print_on_error(outputStream* st, Thread* current, char* buf, int buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4429 bool found_current = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4430 st->print_cr("Java Threads: ( => current thread )");
a61af66fc99e Initial load
duke
parents:
diff changeset
4431 ALL_JAVA_THREADS(thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4432 bool is_current = (current == thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
4433 found_current = found_current || is_current;
a61af66fc99e Initial load
duke
parents:
diff changeset
4434
a61af66fc99e Initial load
duke
parents:
diff changeset
4435 st->print("%s", is_current ? "=>" : " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
4436
a61af66fc99e Initial load
duke
parents:
diff changeset
4437 st->print(PTR_FORMAT, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
4438 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
4439 thread->print_on_error(st, buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
4440 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
4441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4442 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
4443
a61af66fc99e Initial load
duke
parents:
diff changeset
4444 st->print_cr("Other Threads:");
a61af66fc99e Initial load
duke
parents:
diff changeset
4445 if (VMThread::vm_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4446 bool is_current = (current == VMThread::vm_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
4447 found_current = found_current || is_current;
a61af66fc99e Initial load
duke
parents:
diff changeset
4448 st->print("%s", current == VMThread::vm_thread() ? "=>" : " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
4449
a61af66fc99e Initial load
duke
parents:
diff changeset
4450 st->print(PTR_FORMAT, VMThread::vm_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
4451 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
4452 VMThread::vm_thread()->print_on_error(st, buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
4453 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
4454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4455 WatcherThread* wt = WatcherThread::watcher_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
4456 if (wt != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4457 bool is_current = (current == wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
4458 found_current = found_current || is_current;
a61af66fc99e Initial load
duke
parents:
diff changeset
4459 st->print("%s", is_current ? "=>" : " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
4460
a61af66fc99e Initial load
duke
parents:
diff changeset
4461 st->print(PTR_FORMAT, wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
4462 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
4463 wt->print_on_error(st, buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
4464 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
4465 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4466 if (!found_current) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4467 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
4468 st->print("=>" PTR_FORMAT " (exited) ", current);
a61af66fc99e Initial load
duke
parents:
diff changeset
4469 current->print_on_error(st, buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
4470 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
4471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4473
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4474 // Internal SpinLock and Mutex
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4475 // Based on ParkEvent
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4476
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4477 // Ad-hoc mutual exclusion primitives: SpinLock and Mux
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4478 //
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4479 // We employ SpinLocks _only for low-contention, fixed-length
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4480 // short-duration critical sections where we're concerned
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4481 // about native mutex_t or HotSpot Mutex:: latency.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4482 // The mux construct provides a spin-then-block mutual exclusion
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4483 // mechanism.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4484 //
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4485 // Testing has shown that contention on the ListLock guarding gFreeList
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4486 // is common. If we implement ListLock as a simple SpinLock it's common
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4487 // for the JVM to devolve to yielding with little progress. This is true
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4488 // despite the fact that the critical sections protected by ListLock are
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4489 // extremely short.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4490 //
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4491 // TODO-FIXME: ListLock should be of type SpinLock.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4492 // We should make this a 1st-class type, integrated into the lock
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4493 // hierarchy as leaf-locks. Critically, the SpinLock structure
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4494 // should have sufficient padding to avoid false-sharing and excessive
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4495 // cache-coherency traffic.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4496
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4497
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4498 typedef volatile int SpinLockT ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4499
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4500 void Thread::SpinAcquire (volatile int * adr, const char * LockName) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4501 if (Atomic::cmpxchg (1, adr, 0) == 0) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4502 return ; // normal fast-path return
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4503 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4504
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4505 // Slow-path : We've encountered contention -- Spin/Yield/Block strategy.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4506 TEVENT (SpinAcquire - ctx) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4507 int ctr = 0 ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4508 int Yields = 0 ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4509 for (;;) {
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4510 while (*adr != 0) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4511 ++ctr ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4512 if ((ctr & 0xFFF) == 0 || !os::is_MP()) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4513 if (Yields > 5) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4514 // Consider using a simple NakedSleep() instead.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4515 // Then SpinAcquire could be called by non-JVM threads
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4516 Thread::current()->_ParkEvent->park(1) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4517 } else {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4518 os::NakedYield() ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4519 ++Yields ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4520 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4521 } else {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4522 SpinPause() ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4523 }
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4524 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4525 if (Atomic::cmpxchg (1, adr, 0) == 0) return ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4528
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4529 void Thread::SpinRelease (volatile int * adr) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4530 assert (*adr != 0, "invariant") ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4531 OrderAccess::fence() ; // guarantee at least release consistency.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4532 // Roach-motel semantics.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4533 // It's safe if subsequent LDs and STs float "up" into the critical section,
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4534 // but prior LDs and STs within the critical section can't be allowed
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4535 // to reorder or float past the ST that releases the lock.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4536 *adr = 0 ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4538
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4539 // muxAcquire and muxRelease:
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4540 //
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4541 // * muxAcquire and muxRelease support a single-word lock-word construct.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4542 // The LSB of the word is set IFF the lock is held.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4543 // The remainder of the word points to the head of a singly-linked list
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4544 // of threads blocked on the lock.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4545 //
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4546 // * The current implementation of muxAcquire-muxRelease uses its own
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4547 // dedicated Thread._MuxEvent instance. If we're interested in
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4548 // minimizing the peak number of extant ParkEvent instances then
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4549 // we could eliminate _MuxEvent and "borrow" _ParkEvent as long
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4550 // as certain invariants were satisfied. Specifically, care would need
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4551 // to be taken with regards to consuming unpark() "permits".
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4552 // A safe rule of thumb is that a thread would never call muxAcquire()
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4553 // if it's enqueued (cxq, EntryList, WaitList, etc) and will subsequently
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4554 // park(). Otherwise the _ParkEvent park() operation in muxAcquire() could
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4555 // consume an unpark() permit intended for monitorenter, for instance.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4556 // One way around this would be to widen the restricted-range semaphore
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4557 // implemented in park(). Another alternative would be to provide
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4558 // multiple instances of the PlatformEvent() for each thread. One
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4559 // instance would be dedicated to muxAcquire-muxRelease, for instance.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4560 //
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4561 // * Usage:
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4562 // -- Only as leaf locks
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4563 // -- for short-term locking only as muxAcquire does not perform
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4564 // thread state transitions.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4565 //
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4566 // Alternatives:
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4567 // * We could implement muxAcquire and muxRelease with MCS or CLH locks
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4568 // but with parking or spin-then-park instead of pure spinning.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4569 // * Use Taura-Oyama-Yonenzawa locks.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4570 // * It's possible to construct a 1-0 lock if we encode the lockword as
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4571 // (List,LockByte). Acquire will CAS the full lockword while Release
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4572 // will STB 0 into the LockByte. The 1-0 scheme admits stranding, so
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4573 // acquiring threads use timers (ParkTimed) to detect and recover from
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4574 // the stranding window. Thread/Node structures must be aligned on 256-byte
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4575 // boundaries by using placement-new.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4576 // * Augment MCS with advisory back-link fields maintained with CAS().
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4577 // Pictorially: LockWord -> T1 <-> T2 <-> T3 <-> ... <-> Tn <-> Owner.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4578 // The validity of the backlinks must be ratified before we trust the value.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4579 // If the backlinks are invalid the exiting thread must back-track through the
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4580 // the forward links, which are always trustworthy.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4581 // * Add a successor indication. The LockWord is currently encoded as
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4582 // (List, LOCKBIT:1). We could also add a SUCCBIT or an explicit _succ variable
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4583 // to provide the usual futile-wakeup optimization.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4584 // See RTStt for details.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4585 // * Consider schedctl.sc_nopreempt to cover the critical section.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4586 //
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4587
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4588
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4589 typedef volatile intptr_t MutexT ; // Mux Lock-word
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4590 enum MuxBits { LOCKBIT = 1 } ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4591
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4592 void Thread::muxAcquire (volatile intptr_t * Lock, const char * LockName) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4593 intptr_t w = Atomic::cmpxchg_ptr (LOCKBIT, Lock, 0) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4594 if (w == 0) return ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4595 if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4596 return ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4597 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4598
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4599 TEVENT (muxAcquire - Contention) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4600 ParkEvent * const Self = Thread::current()->_MuxEvent ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4601 assert ((intptr_t(Self) & LOCKBIT) == 0, "invariant") ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4602 for (;;) {
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4603 int its = (os::is_MP() ? 100 : 0) + 1 ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4604
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4605 // Optional spin phase: spin-then-park strategy
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4606 while (--its >= 0) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4607 w = *Lock ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4608 if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4609 return ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4610 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4611 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4612
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4613 Self->reset() ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4614 Self->OnList = intptr_t(Lock) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4615 // The following fence() isn't _strictly necessary as the subsequent
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4616 // CAS() both serializes execution and ratifies the fetched *Lock value.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4617 OrderAccess::fence();
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4618 for (;;) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4619 w = *Lock ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4620 if ((w & LOCKBIT) == 0) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4621 if (Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4622 Self->OnList = 0 ; // hygiene - allows stronger asserts
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4623 return ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4624 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4625 continue ; // Interference -- *Lock changed -- Just retry
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4626 }
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4627 assert (w & LOCKBIT, "invariant") ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4628 Self->ListNext = (ParkEvent *) (w & ~LOCKBIT );
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4629 if (Atomic::cmpxchg_ptr (intptr_t(Self)|LOCKBIT, Lock, w) == w) break ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4630 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4631
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4632 while (Self->OnList != 0) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4633 Self->park() ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4634 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4635 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4637
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4638 void Thread::muxAcquireW (volatile intptr_t * Lock, ParkEvent * ev) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4639 intptr_t w = Atomic::cmpxchg_ptr (LOCKBIT, Lock, 0) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4640 if (w == 0) return ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4641 if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4642 return ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4643 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4644
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4645 TEVENT (muxAcquire - Contention) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4646 ParkEvent * ReleaseAfter = NULL ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4647 if (ev == NULL) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4648 ev = ReleaseAfter = ParkEvent::Allocate (NULL) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4649 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4650 assert ((intptr_t(ev) & LOCKBIT) == 0, "invariant") ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4651 for (;;) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4652 guarantee (ev->OnList == 0, "invariant") ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4653 int its = (os::is_MP() ? 100 : 0) + 1 ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4654
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4655 // Optional spin phase: spin-then-park strategy
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4656 while (--its >= 0) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4657 w = *Lock ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4658 if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4659 if (ReleaseAfter != NULL) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4660 ParkEvent::Release (ReleaseAfter) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4661 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4662 return ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4663 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4664 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4665
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4666 ev->reset() ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4667 ev->OnList = intptr_t(Lock) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4668 // The following fence() isn't _strictly necessary as the subsequent
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4669 // CAS() both serializes execution and ratifies the fetched *Lock value.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4670 OrderAccess::fence();
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4671 for (;;) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4672 w = *Lock ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4673 if ((w & LOCKBIT) == 0) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4674 if (Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4675 ev->OnList = 0 ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4676 // We call ::Release while holding the outer lock, thus
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4677 // artificially lengthening the critical section.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4678 // Consider deferring the ::Release() until the subsequent unlock(),
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4679 // after we've dropped the outer lock.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4680 if (ReleaseAfter != NULL) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4681 ParkEvent::Release (ReleaseAfter) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4682 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4683 return ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4684 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4685 continue ; // Interference -- *Lock changed -- Just retry
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4686 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4687 assert (w & LOCKBIT, "invariant") ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4688 ev->ListNext = (ParkEvent *) (w & ~LOCKBIT );
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4689 if (Atomic::cmpxchg_ptr (intptr_t(ev)|LOCKBIT, Lock, w) == w) break ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4690 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4691
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4692 while (ev->OnList != 0) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4693 ev->park() ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4694 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4695 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4696 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4697
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4698 // Release() must extract a successor from the list and then wake that thread.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4699 // It can "pop" the front of the list or use a detach-modify-reattach (DMR) scheme
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4700 // similar to that used by ParkEvent::Allocate() and ::Release(). DMR-based
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4701 // Release() would :
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4702 // (A) CAS() or swap() null to *Lock, releasing the lock and detaching the list.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4703 // (B) Extract a successor from the private list "in-hand"
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4704 // (C) attempt to CAS() the residual back into *Lock over null.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4705 // If there were any newly arrived threads and the CAS() would fail.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4706 // In that case Release() would detach the RATs, re-merge the list in-hand
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4707 // with the RATs and repeat as needed. Alternately, Release() might
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4708 // detach and extract a successor, but then pass the residual list to the wakee.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4709 // The wakee would be responsible for reattaching and remerging before it
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4710 // competed for the lock.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4711 //
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4712 // Both "pop" and DMR are immune from ABA corruption -- there can be
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4713 // multiple concurrent pushers, but only one popper or detacher.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4714 // This implementation pops from the head of the list. This is unfair,
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4715 // but tends to provide excellent throughput as hot threads remain hot.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4716 // (We wake recently run threads first).
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4717
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4718 void Thread::muxRelease (volatile intptr_t * Lock) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4719 for (;;) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4720 const intptr_t w = Atomic::cmpxchg_ptr (0, Lock, LOCKBIT) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4721 assert (w & LOCKBIT, "invariant") ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4722 if (w == LOCKBIT) return ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4723 ParkEvent * List = (ParkEvent *) (w & ~LOCKBIT) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4724 assert (List != NULL, "invariant") ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4725 assert (List->OnList == intptr_t(Lock), "invariant") ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4726 ParkEvent * nxt = List->ListNext ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4727
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4728 // The following CAS() releases the lock and pops the head element.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4729 if (Atomic::cmpxchg_ptr (intptr_t(nxt), Lock, w) != w) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4730 continue ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4731 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4732 List->OnList = 0 ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4733 OrderAccess::fence() ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4734 List->unpark () ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4735 return ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4736 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4737 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4738
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1871
diff changeset
4739
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4740 void Threads::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4741 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4742 p->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
4743 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4744 VMThread* thread = VMThread::vm_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
4745 if (thread != NULL) thread->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
4746 }