src/share/vm/utilities/globalDefinitions_sparcWorks.hpp

Thu, 20 Nov 2008 16:56:09 -0800

author
ysr
date
Thu, 20 Nov 2008 16:56:09 -0800
changeset 888
c96030fff130
parent 631
d1605aabd0a1
child 947
db4caa99ef11
permissions
-rw-r--r--

6684579: SoftReference processing can be made more efficient
Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not.
Reviewed-by: jmasa

duke@435 1 /*
xdono@631 2 * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
duke@435 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@435 20 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@435 21 * have any questions.
duke@435 22 *
duke@435 23 */
duke@435 24
duke@435 25 // This file holds compiler-dependent includes,
duke@435 26 // globally used constants & types, class (forward)
duke@435 27 // declarations and a few frequently used utility functions.
duke@435 28
duke@435 29
duke@435 30 # include <ctype.h>
duke@435 31 # include <dirent.h>
duke@435 32 # include <string.h>
duke@435 33 # include <strings.h> // for bsd'isms
duke@435 34 # include <stdarg.h>
duke@435 35 # include <stddef.h> // for offsetof
duke@435 36 # include <stdio.h>
duke@435 37 # include <stdlib.h>
duke@435 38 # include <wchar.h>
duke@435 39 # include <stdarg.h>
dcubed@485 40 #ifdef SOLARIS
duke@435 41 # include <ieeefp.h>
dcubed@485 42 #endif
duke@435 43 # include <math.h>
dcubed@485 44 #ifdef LINUX
dcubed@485 45 #ifndef FP_PZERO
dcubed@485 46 // Linux doesn't have positive/negative zero
dcubed@485 47 #define FP_PZERO FP_ZERO
dcubed@485 48 #endif
dcubed@485 49 #ifndef fpclass
dcubed@485 50 #define fpclass fpclassify
dcubed@485 51 #endif
dcubed@485 52 #endif
duke@435 53 # include <time.h>
duke@435 54 # include <fcntl.h>
duke@435 55 # include <dlfcn.h>
duke@435 56 # include <pthread.h>
dcubed@485 57 #ifdef SOLARIS
duke@435 58 # include <thread.h>
dcubed@485 59 #endif
duke@435 60 # include <limits.h>
duke@435 61 # include <errno.h>
dcubed@485 62 #ifdef SOLARIS
duke@435 63 # include <sys/trap.h>
duke@435 64 # include <sys/regset.h>
duke@435 65 # include <sys/procset.h>
duke@435 66 # include <ucontext.h>
duke@435 67 # include <setjmp.h>
dcubed@485 68 #endif
duke@435 69 # ifdef SOLARIS_MUTATOR_LIBTHREAD
duke@435 70 # include <sys/procfs.h>
duke@435 71 # endif
dcubed@485 72 #ifdef LINUX
dcubed@485 73 # include <inttypes.h>
dcubed@485 74 # include <signal.h>
dcubed@485 75 # include <ucontext.h>
dcubed@485 76 # include <sys/time.h>
dcubed@485 77 #endif
dcubed@485 78
duke@435 79
duke@435 80 // 4810578: varargs unsafe on 32-bit integer/64-bit pointer architectures
duke@435 81 // When __cplusplus is defined, NULL is defined as 0 (32-bit constant) in
duke@435 82 // system header files. On 32-bit architectures, there is no problem.
duke@435 83 // On 64-bit architectures, defining NULL as a 32-bit constant can cause
duke@435 84 // problems with varargs functions: C++ integral promotion rules say for
duke@435 85 // varargs, we pass the argument 0 as an int. So, if NULL was passed to a
duke@435 86 // varargs function it will remain 32-bits. Depending on the calling
duke@435 87 // convention of the machine, if the argument is passed on the stack then
duke@435 88 // only 32-bits of the "NULL" pointer may be initialized to zero. The
duke@435 89 // other 32-bits will be garbage. If the varargs function is expecting a
duke@435 90 // pointer when it extracts the argument, then we have a problem.
duke@435 91 //
duke@435 92 // Solution: For 64-bit architectures, redefine NULL as 64-bit constant 0.
dcubed@485 93 //
dcubed@485 94 // Note: this fix doesn't work well on Linux because NULL will be overwritten
dcubed@485 95 // whenever a system header file is included. Linux handles NULL correctly
dcubed@485 96 // through a special type '__null'.
dcubed@485 97 #ifdef SOLARIS
duke@435 98 #ifdef _LP64
duke@435 99 #undef NULL
duke@435 100 #define NULL 0L
duke@435 101 #else
duke@435 102 #ifndef NULL
duke@435 103 #define NULL 0
duke@435 104 #endif
duke@435 105 #endif
dcubed@485 106 #endif
duke@435 107
duke@435 108 // NULL vs NULL_WORD:
duke@435 109 // On Linux NULL is defined as a special type '__null'. Assigning __null to
duke@435 110 // integer variable will cause gcc warning. Use NULL_WORD in places where a
dcubed@485 111 // pointer is stored as integer value. On some platforms, sizeof(intptr_t) >
dcubed@485 112 // sizeof(void*), so here we want something which is integer type, but has the
dcubed@485 113 // same size as a pointer.
dcubed@485 114 #ifdef LINUX
dcubed@485 115 #ifdef _LP64
dcubed@485 116 #define NULL_WORD 0L
dcubed@485 117 #else
dcubed@485 118 #define NULL_WORD 0
dcubed@485 119 #endif
dcubed@485 120 #else
dcubed@485 121 #define NULL_WORD NULL
dcubed@485 122 #endif
duke@435 123
dcubed@485 124 #ifndef LINUX
duke@435 125 // Compiler-specific primitive types
duke@435 126 typedef unsigned short uint16_t;
duke@435 127 #ifndef _UINT32_T
duke@435 128 #define _UINT32_T
duke@435 129 typedef unsigned int uint32_t;
duke@435 130 #endif
duke@435 131 #if !defined(_SYS_INT_TYPES_H)
duke@435 132 #ifndef _UINT64_T
duke@435 133 #define _UINT64_T
duke@435 134 typedef unsigned long long uint64_t;
duke@435 135 #endif
duke@435 136 // %%%% how to access definition of intptr_t portably in 5.5 onward?
duke@435 137 typedef int intptr_t;
duke@435 138 typedef unsigned int uintptr_t;
duke@435 139 // If this gets an error, figure out a symbol XXX that implies the
duke@435 140 // prior definition of intptr_t, and add "&& !defined(XXX)" above.
duke@435 141 #endif
dcubed@485 142 #endif
duke@435 143
duke@435 144 // Additional Java basic types
duke@435 145
duke@435 146 typedef unsigned char jubyte;
duke@435 147 typedef unsigned short jushort;
duke@435 148 typedef unsigned int juint;
duke@435 149 typedef unsigned long long julong;
duke@435 150
duke@435 151 //----------------------------------------------------------------------------------------------------
duke@435 152 // Special (possibly not-portable) casts
duke@435 153 // Cast floats into same-size integers and vice-versa w/o changing bit-pattern
duke@435 154
duke@435 155 inline jint jint_cast (jfloat x) { return *(jint* )&x; }
duke@435 156 inline jlong jlong_cast (jdouble x) { return *(jlong* )&x; }
duke@435 157
duke@435 158 inline jfloat jfloat_cast (jint x) { return *(jfloat* )&x; }
duke@435 159 inline jdouble jdouble_cast(jlong x) { return *(jdouble*)&x; }
duke@435 160
duke@435 161 //----------------------------------------------------------------------------------------------------
duke@435 162 // Constant for jlong (specifying an long long constant is C++ compiler specific)
duke@435 163
duke@435 164 // Build a 64bit integer constant
duke@435 165 #define CONST64(x) (x ## LL)
duke@435 166 #define UCONST64(x) (x ## ULL)
duke@435 167
duke@435 168 const jlong min_jlong = CONST64(0x8000000000000000);
duke@435 169 const jlong max_jlong = CONST64(0x7fffffffffffffff);
duke@435 170
dcubed@485 171 #ifdef SOLARIS
duke@435 172 //----------------------------------------------------------------------------------------------------
duke@435 173 // ANSI C++ fixes
duke@435 174 // NOTE:In the ANSI committee's continuing attempt to make each version
duke@435 175 // of C++ incompatible with the previous version, you can no longer cast
duke@435 176 // pointers to functions without specifying linkage unless you want to get
duke@435 177 // warnings.
duke@435 178 //
duke@435 179 // This also means that pointers to functions can no longer be "hidden"
duke@435 180 // in opaque types like void * because at the invokation point warnings
duke@435 181 // will be generated. While this makes perfect sense from a type safety
duke@435 182 // point of view it causes a lot of warnings on old code using C header
duke@435 183 // files. Here are some typedefs to make the job of silencing warnings
duke@435 184 // a bit easier.
duke@435 185 //
duke@435 186 // The final kick in the teeth is that you can only have extern "C" linkage
duke@435 187 // specified at file scope. So these typedefs are here rather than in the
duke@435 188 // .hpp for the class (os:Solaris usually) that needs them.
duke@435 189
duke@435 190 extern "C" {
duke@435 191 typedef int (*int_fnP_thread_t_iP_uP_stack_tP_gregset_t)(thread_t, int*, unsigned *, stack_t*, gregset_t);
duke@435 192 typedef int (*int_fnP_thread_t_i_gregset_t)(thread_t, int, gregset_t);
duke@435 193 typedef int (*int_fnP_thread_t_i)(thread_t, int);
duke@435 194 typedef int (*int_fnP_thread_t)(thread_t);
duke@435 195
duke@435 196 typedef int (*int_fnP_cond_tP_mutex_tP_timestruc_tP)(cond_t *cv, mutex_t *mx, timestruc_t *abst);
duke@435 197 typedef int (*int_fnP_cond_tP_mutex_tP)(cond_t *cv, mutex_t *mx);
duke@435 198
duke@435 199 // typedef for missing API in libc
duke@435 200 typedef int (*int_fnP_mutex_tP_i_vP)(mutex_t *, int, void *);
duke@435 201 typedef int (*int_fnP_mutex_tP)(mutex_t *);
duke@435 202 typedef int (*int_fnP_cond_tP_i_vP)(cond_t *cv, int scope, void *arg);
duke@435 203 typedef int (*int_fnP_cond_tP)(cond_t *cv);
duke@435 204 };
dcubed@485 205 #endif
duke@435 206
duke@435 207 //----------------------------------------------------------------------------------------------------
duke@435 208 // Debugging
duke@435 209
duke@435 210 #define DEBUG_EXCEPTION ::abort();
duke@435 211
duke@435 212 extern "C" void breakpoint();
duke@435 213 #define BREAKPOINT ::breakpoint()
duke@435 214
duke@435 215 // checking for nanness
dcubed@485 216 #ifdef SOLARIS
duke@435 217 #ifdef SPARC
duke@435 218 inline int g_isnan(float f) { return isnanf(f); }
duke@435 219 #else
duke@435 220 // isnanf() broken on Intel Solaris use isnand()
duke@435 221 inline int g_isnan(float f) { return isnand(f); }
duke@435 222 #endif
duke@435 223
duke@435 224 inline int g_isnan(double f) { return isnand(f); }
dcubed@485 225 #elif LINUX
dcubed@485 226 inline int g_isnan(float f) { return isnanf(f); }
dcubed@485 227 inline int g_isnan(double f) { return isnan(f); }
dcubed@485 228 #else
dcubed@485 229 #error "missing platform-specific definition here"
dcubed@485 230 #endif
duke@435 231
duke@435 232 // Checking for finiteness
duke@435 233
duke@435 234 inline int g_isfinite(jfloat f) { return finite(f); }
duke@435 235 inline int g_isfinite(jdouble f) { return finite(f); }
duke@435 236
duke@435 237
duke@435 238 // Wide characters
duke@435 239
duke@435 240 inline int wcslen(const jchar* x) { return wcslen((const wchar_t*)x); }
duke@435 241
duke@435 242
duke@435 243 // Misc
dcubed@485 244 // NOTE: This one leads to an infinite recursion on Linux
dcubed@485 245 #ifndef LINUX
duke@435 246 int local_vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr);
duke@435 247 #define vsnprintf local_vsnprintf
dcubed@485 248 #endif
duke@435 249
duke@435 250 // Portability macros
duke@435 251 #define PRAGMA_INTERFACE
duke@435 252 #define PRAGMA_IMPLEMENTATION
duke@435 253 #define PRAGMA_IMPLEMENTATION_(arg)
duke@435 254 #define VALUE_OBJ_CLASS_SPEC : public _ValueObj
duke@435 255
duke@435 256 // Formatting.
duke@435 257 #ifdef _LP64
duke@435 258 #define FORMAT64_MODIFIER "l"
duke@435 259 #else // !_LP64
duke@435 260 #define FORMAT64_MODIFIER "ll"
duke@435 261 #endif // _LP64
duke@435 262
duke@435 263 #define offset_of(klass,field) offsetof(klass,field)

mercurial