src/share/vm/utilities/globalDefinitions.cpp

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 1907
c18cbe5936b8
child 1926
2d127394260e
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 # include "incls/_precompiled.incl"
duke@435 26 # include "incls/_globalDefinitions.cpp.incl"
coleenp@548 27 // Basic error support
duke@435 28
coleenp@548 29 // Info for oops within a java object. Defaults are zero so
coleenp@548 30 // things will break badly if incorrectly initialized.
coleenp@548 31 int heapOopSize = 0;
coleenp@548 32 int LogBytesPerHeapOop = 0;
coleenp@548 33 int LogBitsPerHeapOop = 0;
coleenp@548 34 int BytesPerHeapOop = 0;
coleenp@548 35 int BitsPerHeapOop = 0;
duke@435 36
duke@435 37 void basic_fatal(const char* msg) {
duke@435 38 fatal(msg);
duke@435 39 }
duke@435 40
duke@435 41 // Something to help porters sleep at night
duke@435 42
coleenp@548 43 void basic_types_init() {
duke@435 44 #ifdef ASSERT
duke@435 45 #ifdef _LP64
duke@435 46 assert(min_intx == (intx)CONST64(0x8000000000000000), "correct constant");
duke@435 47 assert(max_intx == CONST64(0x7FFFFFFFFFFFFFFF), "correct constant");
duke@435 48 assert(max_uintx == CONST64(0xFFFFFFFFFFFFFFFF), "correct constant");
duke@435 49 assert( 8 == sizeof( intx), "wrong size for basic type");
duke@435 50 assert( 8 == sizeof( jobject), "wrong size for basic type");
duke@435 51 #else
duke@435 52 assert(min_intx == (intx)0x80000000, "correct constant");
duke@435 53 assert(max_intx == 0x7FFFFFFF, "correct constant");
duke@435 54 assert(max_uintx == 0xFFFFFFFF, "correct constant");
duke@435 55 assert( 4 == sizeof( intx), "wrong size for basic type");
duke@435 56 assert( 4 == sizeof( jobject), "wrong size for basic type");
duke@435 57 #endif
duke@435 58 assert( (~max_juint) == 0, "max_juint has all its bits");
duke@435 59 assert( (~max_uintx) == 0, "max_uintx has all its bits");
duke@435 60 assert( (~max_julong) == 0, "max_julong has all its bits");
duke@435 61 assert( 1 == sizeof( jbyte), "wrong size for basic type");
duke@435 62 assert( 2 == sizeof( jchar), "wrong size for basic type");
duke@435 63 assert( 2 == sizeof( jshort), "wrong size for basic type");
duke@435 64 assert( 4 == sizeof( juint), "wrong size for basic type");
duke@435 65 assert( 4 == sizeof( jint), "wrong size for basic type");
duke@435 66 assert( 1 == sizeof( jboolean), "wrong size for basic type");
duke@435 67 assert( 8 == sizeof( jlong), "wrong size for basic type");
duke@435 68 assert( 4 == sizeof( jfloat), "wrong size for basic type");
duke@435 69 assert( 8 == sizeof( jdouble), "wrong size for basic type");
duke@435 70 assert( 1 == sizeof( u1), "wrong size for basic type");
duke@435 71 assert( 2 == sizeof( u2), "wrong size for basic type");
duke@435 72 assert( 4 == sizeof( u4), "wrong size for basic type");
duke@435 73
duke@435 74 int num_type_chars = 0;
duke@435 75 for (int i = 0; i < 99; i++) {
duke@435 76 if (type2char((BasicType)i) != 0) {
duke@435 77 assert(char2type(type2char((BasicType)i)) == i, "proper inverses");
duke@435 78 num_type_chars++;
duke@435 79 }
duke@435 80 }
duke@435 81 assert(num_type_chars == 11, "must have tested the right number of mappings");
duke@435 82 assert(char2type(0) == T_ILLEGAL, "correct illegality");
duke@435 83
duke@435 84 {
duke@435 85 for (int i = T_BOOLEAN; i <= T_CONFLICT; i++) {
duke@435 86 BasicType vt = (BasicType)i;
duke@435 87 BasicType ft = type2field[vt];
duke@435 88 switch (vt) {
duke@435 89 // the following types might plausibly show up in memory layouts:
duke@435 90 case T_BOOLEAN:
duke@435 91 case T_BYTE:
duke@435 92 case T_CHAR:
duke@435 93 case T_SHORT:
duke@435 94 case T_INT:
duke@435 95 case T_FLOAT:
duke@435 96 case T_DOUBLE:
duke@435 97 case T_LONG:
duke@435 98 case T_OBJECT:
duke@435 99 case T_ADDRESS: // random raw pointer
coleenp@548 100 case T_NARROWOOP: // compressed pointer
duke@435 101 case T_CONFLICT: // might as well support a bottom type
duke@435 102 case T_VOID: // padding or other unaddressed word
duke@435 103 // layout type must map to itself
duke@435 104 assert(vt == ft, "");
duke@435 105 break;
duke@435 106 default:
duke@435 107 // non-layout type must map to a (different) layout type
duke@435 108 assert(vt != ft, "");
duke@435 109 assert(ft == type2field[ft], "");
duke@435 110 }
duke@435 111 // every type must map to same-sized layout type:
duke@435 112 assert(type2size[vt] == type2size[ft], "");
duke@435 113 }
duke@435 114 }
duke@435 115 // These are assumed, e.g., when filling HeapWords with juints.
duke@435 116 assert(is_power_of_2(sizeof(juint)), "juint must be power of 2");
duke@435 117 assert(is_power_of_2(HeapWordSize), "HeapWordSize must be power of 2");
duke@435 118 assert((size_t)HeapWordSize >= sizeof(juint),
duke@435 119 "HeapWord should be at least as large as juint");
duke@435 120 assert(sizeof(NULL) == sizeof(char*), "NULL must be same size as pointer");
duke@435 121 #endif
duke@435 122
duke@435 123 if( JavaPriority1_To_OSPriority != -1 )
duke@435 124 os::java_to_os_priority[1] = JavaPriority1_To_OSPriority;
duke@435 125 if( JavaPriority2_To_OSPriority != -1 )
duke@435 126 os::java_to_os_priority[2] = JavaPriority2_To_OSPriority;
duke@435 127 if( JavaPriority3_To_OSPriority != -1 )
duke@435 128 os::java_to_os_priority[3] = JavaPriority3_To_OSPriority;
duke@435 129 if( JavaPriority4_To_OSPriority != -1 )
duke@435 130 os::java_to_os_priority[4] = JavaPriority4_To_OSPriority;
duke@435 131 if( JavaPriority5_To_OSPriority != -1 )
duke@435 132 os::java_to_os_priority[5] = JavaPriority5_To_OSPriority;
duke@435 133 if( JavaPriority6_To_OSPriority != -1 )
duke@435 134 os::java_to_os_priority[6] = JavaPriority6_To_OSPriority;
duke@435 135 if( JavaPriority7_To_OSPriority != -1 )
duke@435 136 os::java_to_os_priority[7] = JavaPriority7_To_OSPriority;
duke@435 137 if( JavaPriority8_To_OSPriority != -1 )
duke@435 138 os::java_to_os_priority[8] = JavaPriority8_To_OSPriority;
duke@435 139 if( JavaPriority9_To_OSPriority != -1 )
duke@435 140 os::java_to_os_priority[9] = JavaPriority9_To_OSPriority;
duke@435 141 if(JavaPriority10_To_OSPriority != -1 )
duke@435 142 os::java_to_os_priority[10] = JavaPriority10_To_OSPriority;
coleenp@548 143
coleenp@548 144 // Set the size of basic types here (after argument parsing but before
coleenp@548 145 // stub generation).
coleenp@548 146 if (UseCompressedOops) {
coleenp@548 147 // Size info for oops within java objects is fixed
coleenp@548 148 heapOopSize = jintSize;
coleenp@548 149 LogBytesPerHeapOop = LogBytesPerInt;
coleenp@548 150 LogBitsPerHeapOop = LogBitsPerInt;
coleenp@548 151 BytesPerHeapOop = BytesPerInt;
coleenp@548 152 BitsPerHeapOop = BitsPerInt;
coleenp@548 153 } else {
coleenp@548 154 heapOopSize = oopSize;
coleenp@548 155 LogBytesPerHeapOop = LogBytesPerWord;
coleenp@548 156 LogBitsPerHeapOop = LogBitsPerWord;
coleenp@548 157 BytesPerHeapOop = BytesPerWord;
coleenp@548 158 BitsPerHeapOop = BitsPerWord;
coleenp@548 159 }
coleenp@548 160 _type2aelembytes[T_OBJECT] = heapOopSize;
coleenp@548 161 _type2aelembytes[T_ARRAY] = heapOopSize;
duke@435 162 }
duke@435 163
duke@435 164
duke@435 165 // Map BasicType to signature character
coleenp@548 166 char type2char_tab[T_CONFLICT+1]={ 0, 0, 0, 0, 'Z', 'C', 'F', 'D', 'B', 'S', 'I', 'J', 'L', '[', 'V', 0, 0, 0};
duke@435 167
duke@435 168 // Map BasicType to Java type name
duke@435 169 const char* type2name_tab[T_CONFLICT+1] = {
duke@435 170 NULL, NULL, NULL, NULL,
duke@435 171 "boolean",
duke@435 172 "char",
duke@435 173 "float",
duke@435 174 "double",
duke@435 175 "byte",
duke@435 176 "short",
duke@435 177 "int",
duke@435 178 "long",
duke@435 179 "object",
duke@435 180 "array",
duke@435 181 "void",
duke@435 182 "*address*",
coleenp@548 183 "*narrowoop*",
duke@435 184 "*conflict*"
duke@435 185 };
duke@435 186
duke@435 187
duke@435 188 BasicType name2type(const char* name) {
duke@435 189 for (int i = T_BOOLEAN; i <= T_VOID; i++) {
duke@435 190 BasicType t = (BasicType)i;
duke@435 191 if (type2name_tab[t] != NULL && 0 == strcmp(type2name_tab[t], name))
duke@435 192 return t;
duke@435 193 }
duke@435 194 return T_ILLEGAL;
duke@435 195 }
duke@435 196
duke@435 197
duke@435 198 // Map BasicType to size in words
coleenp@548 199 int type2size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 0, 1, 1, -1};
duke@435 200
duke@435 201 BasicType type2field[T_CONFLICT+1] = {
duke@435 202 (BasicType)0, // 0,
duke@435 203 (BasicType)0, // 1,
duke@435 204 (BasicType)0, // 2,
duke@435 205 (BasicType)0, // 3,
duke@435 206 T_BOOLEAN, // T_BOOLEAN = 4,
duke@435 207 T_CHAR, // T_CHAR = 5,
duke@435 208 T_FLOAT, // T_FLOAT = 6,
duke@435 209 T_DOUBLE, // T_DOUBLE = 7,
duke@435 210 T_BYTE, // T_BYTE = 8,
duke@435 211 T_SHORT, // T_SHORT = 9,
duke@435 212 T_INT, // T_INT = 10,
duke@435 213 T_LONG, // T_LONG = 11,
duke@435 214 T_OBJECT, // T_OBJECT = 12,
duke@435 215 T_OBJECT, // T_ARRAY = 13,
duke@435 216 T_VOID, // T_VOID = 14,
duke@435 217 T_ADDRESS, // T_ADDRESS = 15,
coleenp@548 218 T_NARROWOOP, // T_NARROWOOP= 16,
coleenp@548 219 T_CONFLICT // T_CONFLICT = 17,
duke@435 220 };
duke@435 221
duke@435 222
duke@435 223 BasicType type2wfield[T_CONFLICT+1] = {
duke@435 224 (BasicType)0, // 0,
duke@435 225 (BasicType)0, // 1,
duke@435 226 (BasicType)0, // 2,
duke@435 227 (BasicType)0, // 3,
duke@435 228 T_INT, // T_BOOLEAN = 4,
duke@435 229 T_INT, // T_CHAR = 5,
duke@435 230 T_FLOAT, // T_FLOAT = 6,
duke@435 231 T_DOUBLE, // T_DOUBLE = 7,
duke@435 232 T_INT, // T_BYTE = 8,
duke@435 233 T_INT, // T_SHORT = 9,
duke@435 234 T_INT, // T_INT = 10,
duke@435 235 T_LONG, // T_LONG = 11,
duke@435 236 T_OBJECT, // T_OBJECT = 12,
duke@435 237 T_OBJECT, // T_ARRAY = 13,
duke@435 238 T_VOID, // T_VOID = 14,
duke@435 239 T_ADDRESS, // T_ADDRESS = 15,
coleenp@548 240 T_NARROWOOP, // T_NARROWOOP = 16,
coleenp@548 241 T_CONFLICT // T_CONFLICT = 17,
duke@435 242 };
duke@435 243
duke@435 244
kvn@464 245 int _type2aelembytes[T_CONFLICT+1] = {
duke@435 246 0, // 0
duke@435 247 0, // 1
duke@435 248 0, // 2
duke@435 249 0, // 3
duke@435 250 T_BOOLEAN_aelem_bytes, // T_BOOLEAN = 4,
duke@435 251 T_CHAR_aelem_bytes, // T_CHAR = 5,
duke@435 252 T_FLOAT_aelem_bytes, // T_FLOAT = 6,
duke@435 253 T_DOUBLE_aelem_bytes, // T_DOUBLE = 7,
duke@435 254 T_BYTE_aelem_bytes, // T_BYTE = 8,
duke@435 255 T_SHORT_aelem_bytes, // T_SHORT = 9,
duke@435 256 T_INT_aelem_bytes, // T_INT = 10,
duke@435 257 T_LONG_aelem_bytes, // T_LONG = 11,
duke@435 258 T_OBJECT_aelem_bytes, // T_OBJECT = 12,
duke@435 259 T_ARRAY_aelem_bytes, // T_ARRAY = 13,
duke@435 260 0, // T_VOID = 14,
kvn@464 261 T_OBJECT_aelem_bytes, // T_ADDRESS = 15,
coleenp@548 262 T_NARROWOOP_aelem_bytes,// T_NARROWOOP= 16,
coleenp@548 263 0 // T_CONFLICT = 17,
duke@435 264 };
duke@435 265
kvn@464 266 #ifdef ASSERT
kvn@464 267 int type2aelembytes(BasicType t, bool allow_address) {
kvn@464 268 assert(allow_address || t != T_ADDRESS, " ");
kvn@464 269 return _type2aelembytes[t];
kvn@464 270 }
kvn@464 271 #endif
duke@435 272
duke@435 273 // Support for 64-bit integer arithmetic
duke@435 274
duke@435 275 // The following code is mostly taken from JVM typedefs_md.h and system_md.c
duke@435 276
coleenp@548 277 static const jlong high_bit = (jlong)1 << (jlong)63;
duke@435 278 static const jlong other_bits = ~high_bit;
duke@435 279
duke@435 280 jlong float2long(jfloat f) {
duke@435 281 jlong tmp = (jlong) f;
duke@435 282 if (tmp != high_bit) {
duke@435 283 return tmp;
duke@435 284 } else {
duke@435 285 if (g_isnan((jdouble)f)) {
duke@435 286 return 0;
duke@435 287 }
duke@435 288 if (f < 0) {
duke@435 289 return high_bit;
duke@435 290 } else {
duke@435 291 return other_bits;
duke@435 292 }
duke@435 293 }
duke@435 294 }
duke@435 295
duke@435 296
duke@435 297 jlong double2long(jdouble f) {
duke@435 298 jlong tmp = (jlong) f;
duke@435 299 if (tmp != high_bit) {
duke@435 300 return tmp;
duke@435 301 } else {
duke@435 302 if (g_isnan(f)) {
duke@435 303 return 0;
duke@435 304 }
duke@435 305 if (f < 0) {
duke@435 306 return high_bit;
duke@435 307 } else {
duke@435 308 return other_bits;
duke@435 309 }
duke@435 310 }
duke@435 311 }
duke@435 312
duke@435 313 // least common multiple
duke@435 314 size_t lcm(size_t a, size_t b) {
duke@435 315 size_t cur, div, next;
duke@435 316
duke@435 317 cur = MAX2(a, b);
duke@435 318 div = MIN2(a, b);
duke@435 319
duke@435 320 assert(div != 0, "lcm requires positive arguments");
duke@435 321
duke@435 322
duke@435 323 while ((next = cur % div) != 0) {
duke@435 324 cur = div; div = next;
duke@435 325 }
duke@435 326
duke@435 327
duke@435 328 julong result = julong(a) * b / div;
duke@435 329 assert(result <= (size_t)max_uintx, "Integer overflow in lcm");
duke@435 330
duke@435 331 return size_t(result);
duke@435 332 }

mercurial