Mercurial > hg > truffle
annotate src/share/vm/utilities/globalDefinitions_sparcWorks.hpp @ 14649:f6301b007a16
6498581: ThreadInterruptTest3 produces wrong output on Windows
Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set.
Reviewed-by: acorn, kvn
Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author | minqi |
---|---|
date | Wed, 26 Feb 2014 15:20:41 -0800 |
parents | f08d439fab8c |
children | b6a8cc1e0d92 |
rev | line source |
---|---|
0 | 1 /* |
2426
1d1603768966
7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents:
2307
diff
changeset
|
2 * Copyright (c) 1997, 2011, 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:
579
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
579
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:
579
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_UTILITIES_GLOBALDEFINITIONS_SPARCWORKS_HPP |
26 #define SHARE_VM_UTILITIES_GLOBALDEFINITIONS_SPARCWORKS_HPP | |
27 | |
28 #include "prims/jni.h" | |
29 | |
0 | 30 // This file holds compiler-dependent includes, |
31 // globally used constants & types, class (forward) | |
32 // declarations and a few frequently used utility functions. | |
33 | |
34 | |
35 # include <ctype.h> | |
36 # include <dirent.h> | |
37 # include <string.h> | |
38 # include <strings.h> // for bsd'isms | |
39 # include <stdarg.h> | |
40 # include <stddef.h> // for offsetof | |
41 # include <stdio.h> | |
42 # include <stdlib.h> | |
43 # include <wchar.h> | |
44 # include <stdarg.h> | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
45 #ifdef SOLARIS |
0 | 46 # include <ieeefp.h> |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
47 #endif |
0 | 48 # include <math.h> |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
49 #ifdef LINUX |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
50 #ifndef FP_PZERO |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
51 // Linux doesn't have positive/negative zero |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
52 #define FP_PZERO FP_ZERO |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
53 #endif |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
54 #ifndef fpclass |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
55 #define fpclass fpclassify |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
56 #endif |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
57 #endif |
0 | 58 # include <time.h> |
59 # include <fcntl.h> | |
60 # include <dlfcn.h> | |
61 # include <pthread.h> | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
62 #ifdef SOLARIS |
0 | 63 # include <thread.h> |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
64 #endif |
0 | 65 # include <limits.h> |
66 # include <errno.h> | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
67 #ifdef SOLARIS |
0 | 68 # include <sys/trap.h> |
69 # include <sys/regset.h> | |
70 # include <sys/procset.h> | |
71 # include <ucontext.h> | |
72 # include <setjmp.h> | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
73 #endif |
0 | 74 # ifdef SOLARIS_MUTATOR_LIBTHREAD |
75 # include <sys/procfs.h> | |
76 # endif | |
3960 | 77 |
78 #include <inttypes.h> | |
79 | |
80 // Solaris 8 doesn't provide definitions of these | |
81 #ifdef SOLARIS | |
82 #ifndef PRIdPTR | |
83 #if defined(_LP64) | |
84 #define PRIdPTR "ld" | |
85 #define PRIuPTR "lu" | |
86 #define PRIxPTR "lx" | |
87 #else | |
88 #define PRIdPTR "d" | |
89 #define PRIuPTR "u" | |
90 #define PRIxPTR "x" | |
91 #endif | |
92 #endif | |
93 #endif | |
94 | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
95 #ifdef LINUX |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
96 # include <signal.h> |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
97 # include <ucontext.h> |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
98 # include <sys/time.h> |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
99 #endif |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
100 |
0 | 101 |
102 // 4810578: varargs unsafe on 32-bit integer/64-bit pointer architectures | |
103 // When __cplusplus is defined, NULL is defined as 0 (32-bit constant) in | |
104 // system header files. On 32-bit architectures, there is no problem. | |
105 // On 64-bit architectures, defining NULL as a 32-bit constant can cause | |
106 // problems with varargs functions: C++ integral promotion rules say for | |
107 // varargs, we pass the argument 0 as an int. So, if NULL was passed to a | |
108 // varargs function it will remain 32-bits. Depending on the calling | |
109 // convention of the machine, if the argument is passed on the stack then | |
110 // only 32-bits of the "NULL" pointer may be initialized to zero. The | |
111 // other 32-bits will be garbage. If the varargs function is expecting a | |
112 // pointer when it extracts the argument, then we have a problem. | |
113 // | |
114 // Solution: For 64-bit architectures, redefine NULL as 64-bit constant 0. | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
115 // |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
116 // Note: this fix doesn't work well on Linux because NULL will be overwritten |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
117 // whenever a system header file is included. Linux handles NULL correctly |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
118 // through a special type '__null'. |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
119 #ifdef SOLARIS |
0 | 120 #ifdef _LP64 |
121 #undef NULL | |
122 #define NULL 0L | |
123 #else | |
124 #ifndef NULL | |
125 #define NULL 0 | |
126 #endif | |
127 #endif | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
128 #endif |
0 | 129 |
130 // NULL vs NULL_WORD: | |
131 // On Linux NULL is defined as a special type '__null'. Assigning __null to | |
132 // integer variable will cause gcc warning. Use NULL_WORD in places where a | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
133 // pointer is stored as integer value. On some platforms, sizeof(intptr_t) > |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
134 // sizeof(void*), so here we want something which is integer type, but has the |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
135 // same size as a pointer. |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
136 #ifdef LINUX |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
137 #ifdef _LP64 |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
138 #define NULL_WORD 0L |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
139 #else |
512
db4caa99ef11
6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents:
196
diff
changeset
|
140 // Cast 0 to intptr_t rather than int32_t since they are not the same type |
db4caa99ef11
6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents:
196
diff
changeset
|
141 // on some platforms. |
db4caa99ef11
6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents:
196
diff
changeset
|
142 #define NULL_WORD ((intptr_t)0) |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
143 #endif |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
144 #else |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
145 #define NULL_WORD NULL |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
146 #endif |
0 | 147 |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
148 #ifndef LINUX |
0 | 149 // Compiler-specific primitive types |
150 typedef unsigned short uint16_t; | |
151 #ifndef _UINT32_T | |
152 #define _UINT32_T | |
153 typedef unsigned int uint32_t; | |
154 #endif | |
155 #if !defined(_SYS_INT_TYPES_H) | |
156 #ifndef _UINT64_T | |
157 #define _UINT64_T | |
158 typedef unsigned long long uint64_t; | |
159 #endif | |
160 // %%%% how to access definition of intptr_t portably in 5.5 onward? | |
161 typedef int intptr_t; | |
162 typedef unsigned int uintptr_t; | |
163 // If this gets an error, figure out a symbol XXX that implies the | |
164 // prior definition of intptr_t, and add "&& !defined(XXX)" above. | |
165 #endif | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
166 #endif |
0 | 167 |
2307
4a9604cd7c5f
6878713: Verifier heap corruption, relating to backward jsrs
kamg
parents:
1972
diff
changeset
|
168 // On solaris 8, UINTPTR_MAX is defined as empty. |
4a9604cd7c5f
6878713: Verifier heap corruption, relating to backward jsrs
kamg
parents:
1972
diff
changeset
|
169 // Everywhere else it's an actual value. |
4a9604cd7c5f
6878713: Verifier heap corruption, relating to backward jsrs
kamg
parents:
1972
diff
changeset
|
170 #if UINTPTR_MAX - 1 == -1 |
4a9604cd7c5f
6878713: Verifier heap corruption, relating to backward jsrs
kamg
parents:
1972
diff
changeset
|
171 #undef UINTPTR_MAX |
4a9604cd7c5f
6878713: Verifier heap corruption, relating to backward jsrs
kamg
parents:
1972
diff
changeset
|
172 #ifdef _LP64 |
4a9604cd7c5f
6878713: Verifier heap corruption, relating to backward jsrs
kamg
parents:
1972
diff
changeset
|
173 #define UINTPTR_MAX UINT64_MAX |
4a9604cd7c5f
6878713: Verifier heap corruption, relating to backward jsrs
kamg
parents:
1972
diff
changeset
|
174 #else |
4a9604cd7c5f
6878713: Verifier heap corruption, relating to backward jsrs
kamg
parents:
1972
diff
changeset
|
175 #define UINTPTR_MAX UINT32_MAX |
4a9604cd7c5f
6878713: Verifier heap corruption, relating to backward jsrs
kamg
parents:
1972
diff
changeset
|
176 #endif /* ifdef _LP64 */ |
4a9604cd7c5f
6878713: Verifier heap corruption, relating to backward jsrs
kamg
parents:
1972
diff
changeset
|
177 #endif |
4a9604cd7c5f
6878713: Verifier heap corruption, relating to backward jsrs
kamg
parents:
1972
diff
changeset
|
178 |
0 | 179 // Additional Java basic types |
180 | |
181 typedef unsigned char jubyte; | |
182 typedef unsigned short jushort; | |
183 typedef unsigned int juint; | |
184 typedef unsigned long long julong; | |
185 | |
186 //---------------------------------------------------------------------------------------------------- | |
187 // Special (possibly not-portable) casts | |
188 // Cast floats into same-size integers and vice-versa w/o changing bit-pattern | |
189 | |
190 inline jint jint_cast (jfloat x) { return *(jint* )&x; } | |
191 inline jlong jlong_cast (jdouble x) { return *(jlong* )&x; } | |
192 | |
193 inline jfloat jfloat_cast (jint x) { return *(jfloat* )&x; } | |
194 inline jdouble jdouble_cast(jlong x) { return *(jdouble*)&x; } | |
195 | |
196 //---------------------------------------------------------------------------------------------------- | |
197 // Constant for jlong (specifying an long long constant is C++ compiler specific) | |
198 | |
199 // Build a 64bit integer constant | |
200 #define CONST64(x) (x ## LL) | |
201 #define UCONST64(x) (x ## ULL) | |
202 | |
203 const jlong min_jlong = CONST64(0x8000000000000000); | |
204 const jlong max_jlong = CONST64(0x7fffffffffffffff); | |
205 | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
206 #ifdef SOLARIS |
0 | 207 //---------------------------------------------------------------------------------------------------- |
208 // ANSI C++ fixes | |
209 // NOTE:In the ANSI committee's continuing attempt to make each version | |
210 // of C++ incompatible with the previous version, you can no longer cast | |
211 // pointers to functions without specifying linkage unless you want to get | |
212 // warnings. | |
213 // | |
214 // This also means that pointers to functions can no longer be "hidden" | |
215 // in opaque types like void * because at the invokation point warnings | |
216 // will be generated. While this makes perfect sense from a type safety | |
217 // point of view it causes a lot of warnings on old code using C header | |
218 // files. Here are some typedefs to make the job of silencing warnings | |
219 // a bit easier. | |
220 // | |
221 // The final kick in the teeth is that you can only have extern "C" linkage | |
222 // specified at file scope. So these typedefs are here rather than in the | |
223 // .hpp for the class (os:Solaris usually) that needs them. | |
224 | |
225 extern "C" { | |
226 typedef int (*int_fnP_thread_t_iP_uP_stack_tP_gregset_t)(thread_t, int*, unsigned *, stack_t*, gregset_t); | |
227 typedef int (*int_fnP_thread_t_i_gregset_t)(thread_t, int, gregset_t); | |
228 typedef int (*int_fnP_thread_t_i)(thread_t, int); | |
229 typedef int (*int_fnP_thread_t)(thread_t); | |
230 | |
231 typedef int (*int_fnP_cond_tP_mutex_tP_timestruc_tP)(cond_t *cv, mutex_t *mx, timestruc_t *abst); | |
232 typedef int (*int_fnP_cond_tP_mutex_tP)(cond_t *cv, mutex_t *mx); | |
233 | |
234 // typedef for missing API in libc | |
235 typedef int (*int_fnP_mutex_tP_i_vP)(mutex_t *, int, void *); | |
236 typedef int (*int_fnP_mutex_tP)(mutex_t *); | |
237 typedef int (*int_fnP_cond_tP_i_vP)(cond_t *cv, int scope, void *arg); | |
238 typedef int (*int_fnP_cond_tP)(cond_t *cv); | |
239 }; | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
240 #endif |
0 | 241 |
242 //---------------------------------------------------------------------------------------------------- | |
243 // Debugging | |
244 | |
245 #define DEBUG_EXCEPTION ::abort(); | |
246 | |
247 extern "C" void breakpoint(); | |
248 #define BREAKPOINT ::breakpoint() | |
249 | |
250 // checking for nanness | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
251 #ifdef SOLARIS |
0 | 252 #ifdef SPARC |
253 inline int g_isnan(float f) { return isnanf(f); } | |
254 #else | |
255 // isnanf() broken on Intel Solaris use isnand() | |
256 inline int g_isnan(float f) { return isnand(f); } | |
257 #endif | |
258 | |
259 inline int g_isnan(double f) { return isnand(f); } | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
260 #elif LINUX |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
261 inline int g_isnan(float f) { return isnanf(f); } |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
262 inline int g_isnan(double f) { return isnan(f); } |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
263 #else |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
264 #error "missing platform-specific definition here" |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
265 #endif |
0 | 266 |
267 // Checking for finiteness | |
268 | |
269 inline int g_isfinite(jfloat f) { return finite(f); } | |
270 inline int g_isfinite(jdouble f) { return finite(f); } | |
271 | |
272 | |
273 // Wide characters | |
274 | |
275 inline int wcslen(const jchar* x) { return wcslen((const wchar_t*)x); } | |
276 | |
277 | |
278 // Misc | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
279 // NOTE: This one leads to an infinite recursion on Linux |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
280 #ifndef LINUX |
0 | 281 int local_vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr); |
282 #define vsnprintf local_vsnprintf | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
283 #endif |
0 | 284 |
285 // Portability macros | |
286 #define PRAGMA_INTERFACE | |
287 #define PRAGMA_IMPLEMENTATION | |
288 #define PRAGMA_IMPLEMENTATION_(arg) | |
289 #define VALUE_OBJ_CLASS_SPEC : public _ValueObj | |
290 | |
291 // Formatting. | |
292 #ifdef _LP64 | |
293 #define FORMAT64_MODIFIER "l" | |
294 #else // !_LP64 | |
295 #define FORMAT64_MODIFIER "ll" | |
296 #endif // _LP64 | |
297 | |
298 #define offset_of(klass,field) offsetof(klass,field) | |
1972 | 299 |
300 #endif // SHARE_VM_UTILITIES_GLOBALDEFINITIONS_SPARCWORKS_HPP |