Mercurial > hg > graal-compiler
annotate src/share/vm/runtime/osThread.hpp @ 6972:bd7a7ce2e264
6830717: replay of compilations would help with debugging
Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method.
Reviewed-by: kvn, twisti, sspitsyn
Contributed-by: yumin.qi@oracle.com
author | minqi |
---|---|
date | Mon, 12 Nov 2012 14:03:53 -0800 |
parents | d2a62e0f25eb |
children | bdd155477289 |
rev | line source |
---|---|
0 | 1 /* |
6006
0105f367a14c
7160570: Intrinsification support for tracing framework
rbackman
parents:
3960
diff
changeset
|
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
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:
0
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_RUNTIME_OSTHREAD_HPP |
26 #define SHARE_VM_RUNTIME_OSTHREAD_HPP | |
27 | |
28 #include "runtime/frame.hpp" | |
29 #include "runtime/handles.hpp" | |
30 #include "runtime/javaFrameAnchor.hpp" | |
31 #include "runtime/objectMonitor.hpp" | |
32 #include "utilities/top.hpp" | |
33 | |
0 | 34 // The OSThread class holds OS-specific thread information. It is equivalent |
35 // to the sys_thread_t structure of the classic JVM implementation. | |
36 | |
37 // The thread states represented by the ThreadState values are platform-specific | |
38 // and are likely to be only approximate, because most OSes don't give you access | |
39 // to precise thread state information. | |
40 | |
41 // Note: the ThreadState is legacy code and is not correctly implemented. | |
42 // Uses of ThreadState need to be replaced by the state in the JavaThread. | |
43 | |
44 enum ThreadState { | |
45 ALLOCATED, // Memory has been allocated but not initialized | |
46 INITIALIZED, // The thread has been initialized but yet started | |
47 RUNNABLE, // Has been started and is runnable, but not necessarily running | |
48 MONITOR_WAIT, // Waiting on a contended monitor lock | |
49 CONDVAR_WAIT, // Waiting on a condition variable | |
50 OBJECT_WAIT, // Waiting on an Object.wait() call | |
51 BREAKPOINTED, // Suspended at breakpoint | |
52 SLEEPING, // Thread.sleep() | |
53 ZOMBIE // All done, but not reclaimed yet | |
54 }; | |
55 | |
56 // I'd make OSThread a ValueObj embedded in Thread to avoid an indirection, but | |
57 // the assembler test in java.cpp expects that it can install the OSThread of | |
58 // the main thread into its own Thread at will. | |
59 | |
60 | |
6197 | 61 class OSThread: public CHeapObj<mtThread> { |
0 | 62 friend class VMStructs; |
63 private: | |
64 OSThreadStartFunc _start_proc; // Thread start routine | |
65 void* _start_parm; // Thread start routine parameter | |
66 volatile ThreadState _state; // Thread state *hint* | |
2386
083f13976b51
6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents:
1980
diff
changeset
|
67 volatile jint _interrupted; // Thread.isInterrupted state |
0 | 68 |
69 // Note: _interrupted must be jint, so that Java intrinsics can access it. | |
70 // The value stored there must be either 0 or 1. It must be possible | |
71 // for Java to emulate Thread.currentThread().isInterrupted() by performing | |
72 // the double indirection Thread::current()->_osthread->_interrupted. | |
73 | |
74 // Methods | |
75 public: | |
76 void set_state(ThreadState state) { _state = state; } | |
77 ThreadState get_state() { return _state; } | |
78 | |
79 OSThread(OSThreadStartFunc start_proc, void* start_parm); | |
80 ~OSThread(); | |
81 | |
82 // Accessors | |
83 OSThreadStartFunc start_proc() const { return _start_proc; } | |
84 void set_start_proc(OSThreadStartFunc start_proc) { _start_proc = start_proc; } | |
85 void* start_parm() const { return _start_parm; } | |
86 void set_start_parm(void* start_parm) { _start_parm = start_parm; } | |
87 | |
2386
083f13976b51
6535709: interrupt of wait()ing thread isn't triggerring InterruptedException - test intwait3
dholmes
parents:
1980
diff
changeset
|
88 volatile bool interrupted() const { return _interrupted != 0; } |
0 | 89 void set_interrupted(bool z) { _interrupted = z ? 1 : 0; } |
90 | |
91 // Printing | |
92 void print_on(outputStream* st) const; | |
93 void print() const { print_on(tty); } | |
94 | |
95 // For java intrinsics: | |
96 static ByteSize interrupted_offset() { return byte_offset_of(OSThread, _interrupted); } | |
97 | |
98 // Platform dependent stuff | |
1972 | 99 #ifdef TARGET_OS_FAMILY_linux |
100 # include "osThread_linux.hpp" | |
101 #endif | |
102 #ifdef TARGET_OS_FAMILY_solaris | |
103 # include "osThread_solaris.hpp" | |
104 #endif | |
105 #ifdef TARGET_OS_FAMILY_windows | |
106 # include "osThread_windows.hpp" | |
107 #endif | |
3960 | 108 #ifdef TARGET_OS_FAMILY_bsd |
109 # include "osThread_bsd.hpp" | |
110 #endif | |
1972 | 111 |
6093
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
112 public: |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
113 static ByteSize thread_id_offset() { return byte_offset_of(OSThread, _thread_id); } |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
114 static size_t thread_id_size() { return sizeof(thread_id_t); } |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
115 |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
116 thread_id_t thread_id() const { return _thread_id; } |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
117 |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
118 void set_thread_id(thread_id_t id) { _thread_id = id; } |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
119 |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
120 private: |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
121 // _thread_id is kernel thread id (similar to LWP id on Solaris). Each |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
122 // thread has a unique thread_id (BsdThreads or NPTL). It can be used |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
123 // to access /proc. |
960a442eae91
7161732: Improve handling of thread_id in OSThread
rbackman
parents:
6006
diff
changeset
|
124 thread_id_t _thread_id; |
0 | 125 }; |
126 | |
127 | |
128 // Utility class for use with condition variables: | |
129 class OSThreadWaitState : public StackObj { | |
130 OSThread* _osthread; | |
131 ThreadState _old_state; | |
132 public: | |
133 OSThreadWaitState(OSThread* osthread, bool is_object_wait) { | |
134 _osthread = osthread; | |
135 _old_state = osthread->get_state(); | |
136 if (is_object_wait) { | |
137 osthread->set_state(OBJECT_WAIT); | |
138 } else { | |
139 osthread->set_state(CONDVAR_WAIT); | |
140 } | |
141 } | |
142 ~OSThreadWaitState() { | |
143 _osthread->set_state(_old_state); | |
144 } | |
145 }; | |
146 | |
147 | |
148 // Utility class for use with contended monitors: | |
149 class OSThreadContendState : public StackObj { | |
150 OSThread* _osthread; | |
151 ThreadState _old_state; | |
152 public: | |
153 OSThreadContendState(OSThread* osthread) { | |
154 _osthread = osthread; | |
155 _old_state = osthread->get_state(); | |
156 osthread->set_state(MONITOR_WAIT); | |
157 } | |
158 ~OSThreadContendState() { | |
159 _osthread->set_state(_old_state); | |
160 } | |
161 }; | |
1972 | 162 |
163 #endif // SHARE_VM_RUNTIME_OSTHREAD_HPP |