src/share/vm/oops/oop.hpp

Thu, 07 Apr 2011 09:53:20 -0700

author
johnc
date
Thu, 07 Apr 2011 09:53:20 -0700
changeset 2781
e1162778c1c8
parent 2658
c7f3d0b4570f
child 3131
b0efc7ee3b31
permissions
-rw-r--r--

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes

duke@435 1 /*
stefank@2534 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. 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 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_OOPS_OOP_HPP
stefank@2314 26 #define SHARE_VM_OOPS_OOP_HPP
stefank@2314 27
stefank@2314 28 #include "memory/iterator.hpp"
stefank@2314 29 #include "memory/memRegion.hpp"
stefank@2314 30 #include "memory/specialized_oop_closures.hpp"
stefank@2314 31 #include "utilities/top.hpp"
stefank@2314 32
duke@435 33 // oopDesc is the top baseclass for objects classes. The {name}Desc classes describe
duke@435 34 // the format of Java objects so the fields can be accessed from C++.
duke@435 35 // oopDesc is abstract.
duke@435 36 // (see oopHierarchy for complete oop class hierarchy)
duke@435 37 //
duke@435 38 // no virtual functions allowed
duke@435 39
duke@435 40 // store into oop with store check
stefank@2314 41 template <class T> void oop_store(T* p, oop v);
stefank@2314 42 template <class T> void oop_store(volatile T* p, oop v);
duke@435 43
duke@435 44 // store into oop without store check
stefank@2314 45 template <class T> void oop_store_without_check(T* p, oop v);
stefank@2314 46 template <class T> void oop_store_without_check(volatile T* p, oop v);
duke@435 47
duke@435 48 extern bool always_do_update_barrier;
duke@435 49
duke@435 50 // Forward declarations.
duke@435 51 class OopClosure;
duke@435 52 class ScanClosure;
duke@435 53 class FastScanClosure;
duke@435 54 class FilteringClosure;
duke@435 55 class BarrierSet;
duke@435 56 class CMSIsAliveClosure;
duke@435 57
duke@435 58 class PSPromotionManager;
duke@435 59 class ParCompactionManager;
duke@435 60
duke@435 61 class oopDesc {
duke@435 62 friend class VMStructs;
duke@435 63 private:
duke@435 64 volatile markOop _mark;
coleenp@548 65 union _metadata {
coleenp@548 66 wideKlassOop _klass;
coleenp@548 67 narrowOop _compressed_klass;
coleenp@548 68 } _metadata;
duke@435 69
duke@435 70 // Fast access to barrier set. Must be initialized.
duke@435 71 static BarrierSet* _bs;
duke@435 72
duke@435 73 public:
ysr@2533 74 enum ConcSafeType {
ysr@2533 75 IsUnsafeConc = false,
ysr@2533 76 IsSafeConc = true
ysr@2533 77 };
ysr@2533 78
duke@435 79 markOop mark() const { return _mark; }
duke@435 80 markOop* mark_addr() const { return (markOop*) &_mark; }
duke@435 81
duke@435 82 void set_mark(volatile markOop m) { _mark = m; }
duke@435 83
duke@435 84 void release_set_mark(markOop m);
duke@435 85 markOop cas_set_mark(markOop new_mark, markOop old_mark);
duke@435 86
duke@435 87 // Used only to re-initialize the mark word (e.g., of promoted
duke@435 88 // objects during a GC) -- requires a valid klass pointer
duke@435 89 void init_mark();
duke@435 90
coleenp@548 91 klassOop klass() const;
coleenp@602 92 klassOop klass_or_null() const volatile;
coleenp@548 93 oop* klass_addr();
coleenp@548 94 narrowOop* compressed_klass_addr();
duke@435 95
duke@435 96 void set_klass(klassOop k);
coleenp@602 97
coleenp@602 98 // For klass field compression
coleenp@602 99 int klass_gap() const;
coleenp@602 100 void set_klass_gap(int z);
duke@435 101 // For when the klass pointer is being used as a linked list "next" field.
duke@435 102 void set_klass_to_list_ptr(oop k);
duke@435 103
coleenp@548 104 // size of object header, aligned to platform wordSize
coleenp@548 105 static int header_size() { return sizeof(oopDesc)/HeapWordSize; }
duke@435 106
duke@435 107 Klass* blueprint() const;
duke@435 108
duke@435 109 // Returns whether this is an instance of k or an instance of a subclass of k
duke@435 110 bool is_a(klassOop k) const;
duke@435 111
duke@435 112 // Returns the actual oop size of the object
duke@435 113 int size();
duke@435 114
duke@435 115 // Sometimes (for complicated concurrency-related reasons), it is useful
duke@435 116 // to be able to figure out the size of an object knowing its klass.
duke@435 117 int size_given_klass(Klass* klass);
duke@435 118
duke@435 119 // Some perm gen objects are not parseble immediately after
duke@435 120 // installation of their klass pointer.
duke@435 121 bool is_parsable();
duke@435 122
jmasa@953 123 // Some perm gen objects that have been allocated and initialized
jmasa@953 124 // can be changed by the VM when not at a safe point (class rededfinition
jmasa@953 125 // is an example). Such objects should not be examined by the
jmasa@953 126 // concurrent processing of a garbage collector if is_conc_safe()
jmasa@953 127 // returns false.
jmasa@953 128 bool is_conc_safe();
jmasa@953 129
duke@435 130 // type test operations (inlined in oop.inline.h)
duke@435 131 bool is_instance() const;
never@2658 132 bool is_instanceMirror() const;
duke@435 133 bool is_instanceRef() const;
duke@435 134 bool is_array() const;
duke@435 135 bool is_objArray() const;
duke@435 136 bool is_klass() const;
duke@435 137 bool is_thread() const;
duke@435 138 bool is_method() const;
duke@435 139 bool is_constMethod() const;
duke@435 140 bool is_methodData() const;
duke@435 141 bool is_constantPool() const;
duke@435 142 bool is_constantPoolCache() const;
duke@435 143 bool is_typeArray() const;
duke@435 144 bool is_javaArray() const;
duke@435 145 bool is_compiledICHolder() const;
duke@435 146
duke@435 147 private:
duke@435 148 // field addresses in oop
duke@435 149 void* field_base(int offset) const;
duke@435 150
duke@435 151 jbyte* byte_field_addr(int offset) const;
duke@435 152 jchar* char_field_addr(int offset) const;
duke@435 153 jboolean* bool_field_addr(int offset) const;
duke@435 154 jint* int_field_addr(int offset) const;
duke@435 155 jshort* short_field_addr(int offset) const;
duke@435 156 jlong* long_field_addr(int offset) const;
duke@435 157 jfloat* float_field_addr(int offset) const;
duke@435 158 jdouble* double_field_addr(int offset) const;
coleenp@548 159 address* address_field_addr(int offset) const;
duke@435 160
duke@435 161 public:
coleenp@548 162 // Need this as public for garbage collection.
coleenp@548 163 template <class T> T* obj_field_addr(int offset) const;
duke@435 164
coleenp@548 165 static bool is_null(oop obj);
coleenp@548 166 static bool is_null(narrowOop obj);
coleenp@548 167
coleenp@548 168 // Decode an oop pointer from a narrowOop if compressed.
coleenp@548 169 // These are overloaded for oop and narrowOop as are the other functions
coleenp@548 170 // below so that they can be called in template functions.
coleenp@548 171 static oop decode_heap_oop_not_null(oop v);
coleenp@548 172 static oop decode_heap_oop_not_null(narrowOop v);
coleenp@548 173 static oop decode_heap_oop(oop v);
coleenp@548 174 static oop decode_heap_oop(narrowOop v);
coleenp@548 175
coleenp@548 176 // Encode an oop pointer to a narrow oop. The or_null versions accept
coleenp@548 177 // null oop pointer, others do not in order to eliminate the
coleenp@548 178 // null checking branches.
coleenp@548 179 static narrowOop encode_heap_oop_not_null(oop v);
coleenp@548 180 static narrowOop encode_heap_oop(oop v);
coleenp@548 181
coleenp@548 182 // Load an oop out of the Java heap
coleenp@548 183 static narrowOop load_heap_oop(narrowOop* p);
coleenp@548 184 static oop load_heap_oop(oop* p);
coleenp@548 185
coleenp@548 186 // Load an oop out of Java heap and decode it to an uncompressed oop.
coleenp@548 187 static oop load_decode_heap_oop_not_null(narrowOop* p);
coleenp@548 188 static oop load_decode_heap_oop_not_null(oop* p);
coleenp@548 189 static oop load_decode_heap_oop(narrowOop* p);
coleenp@548 190 static oop load_decode_heap_oop(oop* p);
coleenp@548 191
coleenp@548 192 // Store an oop into the heap.
coleenp@548 193 static void store_heap_oop(narrowOop* p, narrowOop v);
coleenp@548 194 static void store_heap_oop(oop* p, oop v);
coleenp@548 195
coleenp@548 196 // Encode oop if UseCompressedOops and store into the heap.
coleenp@548 197 static void encode_store_heap_oop_not_null(narrowOop* p, oop v);
coleenp@548 198 static void encode_store_heap_oop_not_null(oop* p, oop v);
coleenp@548 199 static void encode_store_heap_oop(narrowOop* p, oop v);
coleenp@548 200 static void encode_store_heap_oop(oop* p, oop v);
coleenp@548 201
coleenp@548 202 static void release_store_heap_oop(volatile narrowOop* p, narrowOop v);
coleenp@548 203 static void release_store_heap_oop(volatile oop* p, oop v);
coleenp@548 204
coleenp@548 205 static void release_encode_store_heap_oop_not_null(volatile narrowOop* p, oop v);
coleenp@548 206 static void release_encode_store_heap_oop_not_null(volatile oop* p, oop v);
coleenp@548 207 static void release_encode_store_heap_oop(volatile narrowOop* p, oop v);
coleenp@548 208 static void release_encode_store_heap_oop(volatile oop* p, oop v);
coleenp@548 209
coleenp@548 210 static oop atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest);
coleenp@548 211 static oop atomic_compare_exchange_oop(oop exchange_value,
coleenp@548 212 volatile HeapWord *dest,
coleenp@548 213 oop compare_value);
coleenp@548 214
coleenp@548 215 // Access to fields in a instanceOop through these methods.
duke@435 216 oop obj_field(int offset) const;
duke@435 217 void obj_field_put(int offset, oop value);
coleenp@548 218 void obj_field_raw_put(int offset, oop value);
duke@435 219
duke@435 220 jbyte byte_field(int offset) const;
duke@435 221 void byte_field_put(int offset, jbyte contents);
duke@435 222
duke@435 223 jchar char_field(int offset) const;
duke@435 224 void char_field_put(int offset, jchar contents);
duke@435 225
duke@435 226 jboolean bool_field(int offset) const;
duke@435 227 void bool_field_put(int offset, jboolean contents);
duke@435 228
duke@435 229 jint int_field(int offset) const;
duke@435 230 void int_field_put(int offset, jint contents);
duke@435 231
duke@435 232 jshort short_field(int offset) const;
duke@435 233 void short_field_put(int offset, jshort contents);
duke@435 234
duke@435 235 jlong long_field(int offset) const;
duke@435 236 void long_field_put(int offset, jlong contents);
duke@435 237
duke@435 238 jfloat float_field(int offset) const;
duke@435 239 void float_field_put(int offset, jfloat contents);
duke@435 240
duke@435 241 jdouble double_field(int offset) const;
duke@435 242 void double_field_put(int offset, jdouble contents);
duke@435 243
coleenp@548 244 address address_field(int offset) const;
coleenp@548 245 void address_field_put(int offset, address contents);
coleenp@548 246
duke@435 247 oop obj_field_acquire(int offset) const;
duke@435 248 void release_obj_field_put(int offset, oop value);
duke@435 249
duke@435 250 jbyte byte_field_acquire(int offset) const;
duke@435 251 void release_byte_field_put(int offset, jbyte contents);
duke@435 252
duke@435 253 jchar char_field_acquire(int offset) const;
duke@435 254 void release_char_field_put(int offset, jchar contents);
duke@435 255
duke@435 256 jboolean bool_field_acquire(int offset) const;
duke@435 257 void release_bool_field_put(int offset, jboolean contents);
duke@435 258
duke@435 259 jint int_field_acquire(int offset) const;
duke@435 260 void release_int_field_put(int offset, jint contents);
duke@435 261
duke@435 262 jshort short_field_acquire(int offset) const;
duke@435 263 void release_short_field_put(int offset, jshort contents);
duke@435 264
duke@435 265 jlong long_field_acquire(int offset) const;
duke@435 266 void release_long_field_put(int offset, jlong contents);
duke@435 267
duke@435 268 jfloat float_field_acquire(int offset) const;
duke@435 269 void release_float_field_put(int offset, jfloat contents);
duke@435 270
duke@435 271 jdouble double_field_acquire(int offset) const;
duke@435 272 void release_double_field_put(int offset, jdouble contents);
duke@435 273
jrose@1145 274 address address_field_acquire(int offset) const;
jrose@1145 275 void release_address_field_put(int offset, address contents);
jrose@1145 276
duke@435 277 // printing functions for VM debugging
duke@435 278 void print_on(outputStream* st) const; // First level print
duke@435 279 void print_value_on(outputStream* st) const; // Second level print.
duke@435 280 void print_address_on(outputStream* st) const; // Address printing
duke@435 281
duke@435 282 // printing on default output stream
duke@435 283 void print();
duke@435 284 void print_value();
duke@435 285 void print_address();
duke@435 286
duke@435 287 // return the print strings
duke@435 288 char* print_string();
duke@435 289 char* print_value_string();
duke@435 290
duke@435 291 // verification operations
duke@435 292 void verify_on(outputStream* st);
duke@435 293 void verify();
duke@435 294 void verify_old_oop(oop* p, bool allow_dirty);
coleenp@548 295 void verify_old_oop(narrowOop* p, bool allow_dirty);
duke@435 296
duke@435 297 // tells whether this oop is partially constructed (gc during class loading)
duke@435 298 bool partially_loaded();
duke@435 299 void set_partially_loaded();
duke@435 300
duke@435 301 // locking operations
duke@435 302 bool is_locked() const;
duke@435 303 bool is_unlocked() const;
duke@435 304 bool has_bias_pattern() const;
duke@435 305
duke@435 306 // asserts
duke@435 307 bool is_oop(bool ignore_mark_word = false) const;
duke@435 308 bool is_oop_or_null(bool ignore_mark_word = false) const;
duke@435 309 #ifndef PRODUCT
duke@435 310 bool is_unlocked_oop() const;
duke@435 311 #endif
duke@435 312
duke@435 313 // garbage collection
duke@435 314 bool is_gc_marked() const;
duke@435 315 // Apply "MarkSweep::mark_and_push" to (the address of) every non-NULL
duke@435 316 // reference field in "this".
coleenp@548 317 void follow_contents(void);
coleenp@548 318 void follow_header(void);
duke@435 319
duke@435 320 #ifndef SERIALGC
duke@435 321 // Parallel Scavenge
duke@435 322 void push_contents(PSPromotionManager* pm);
duke@435 323
duke@435 324 // Parallel Old
duke@435 325 void update_contents(ParCompactionManager* cm);
duke@435 326
duke@435 327 void follow_contents(ParCompactionManager* cm);
duke@435 328 void follow_header(ParCompactionManager* cm);
duke@435 329 #endif // SERIALGC
duke@435 330
duke@435 331 bool is_perm() const;
duke@435 332 bool is_perm_or_null() const;
jrose@1424 333 bool is_scavengable() const;
duke@435 334 bool is_shared() const;
duke@435 335 bool is_shared_readonly() const;
duke@435 336 bool is_shared_readwrite() const;
duke@435 337
duke@435 338 // Forward pointer operations for scavenge
duke@435 339 bool is_forwarded() const;
duke@435 340
duke@435 341 void forward_to(oop p);
duke@435 342 bool cas_forward_to(oop p, markOop compare);
duke@435 343
duke@435 344 #ifndef SERIALGC
duke@435 345 // Like "forward_to", but inserts the forwarding pointer atomically.
duke@435 346 // Exactly one thread succeeds in inserting the forwarding pointer, and
duke@435 347 // this call returns "NULL" for that thread; any other thread has the
duke@435 348 // value of the forwarding pointer returned and does not modify "this".
duke@435 349 oop forward_to_atomic(oop p);
duke@435 350 #endif // SERIALGC
duke@435 351
duke@435 352 oop forwardee() const;
duke@435 353
duke@435 354 // Age of object during scavenge
duke@435 355 int age() const;
duke@435 356 void incr_age();
duke@435 357
duke@435 358 // Adjust all pointers in this object to point at it's forwarded location and
duke@435 359 // return the size of this oop. This is used by the MarkSweep collector.
duke@435 360 int adjust_pointers();
duke@435 361 void adjust_header();
duke@435 362
duke@435 363 #ifndef SERIALGC
duke@435 364 // Parallel old
duke@435 365 void update_header();
duke@435 366 #endif // SERIALGC
duke@435 367
duke@435 368 // mark-sweep support
duke@435 369 void follow_body(int begin, int end);
duke@435 370
duke@435 371 // Fast access to barrier set
duke@435 372 static BarrierSet* bs() { return _bs; }
duke@435 373 static void set_bs(BarrierSet* bs) { _bs = bs; }
duke@435 374
duke@435 375 // iterators, returns size of object
ysr@777 376 #define OOP_ITERATE_DECL(OopClosureType, nv_suffix) \
duke@435 377 int oop_iterate(OopClosureType* blk); \
duke@435 378 int oop_iterate(OopClosureType* blk, MemRegion mr); // Only in mr.
duke@435 379
duke@435 380 ALL_OOP_OOP_ITERATE_CLOSURES_1(OOP_ITERATE_DECL)
ysr@777 381 ALL_OOP_OOP_ITERATE_CLOSURES_2(OOP_ITERATE_DECL)
ysr@777 382
ysr@777 383 #ifndef SERIALGC
ysr@777 384
ysr@777 385 #define OOP_ITERATE_BACKWARDS_DECL(OopClosureType, nv_suffix) \
ysr@777 386 int oop_iterate_backwards(OopClosureType* blk);
ysr@777 387
ysr@777 388 ALL_OOP_OOP_ITERATE_CLOSURES_1(OOP_ITERATE_BACKWARDS_DECL)
ysr@777 389 ALL_OOP_OOP_ITERATE_CLOSURES_2(OOP_ITERATE_BACKWARDS_DECL)
ysr@777 390 #endif
duke@435 391
duke@435 392 void oop_iterate_header(OopClosure* blk);
duke@435 393 void oop_iterate_header(OopClosure* blk, MemRegion mr);
duke@435 394
duke@435 395 // identity hash; returns the identity hash key (computes it if necessary)
duke@435 396 // NOTE with the introduction of UseBiasedLocking that identity_hash() might reach a
duke@435 397 // safepoint if called on a biased object. Calling code must be aware of that.
duke@435 398 intptr_t identity_hash();
duke@435 399 intptr_t slow_identity_hash();
duke@435 400
duke@435 401 // marks are forwarded to stack when object is locked
duke@435 402 bool has_displaced_mark() const;
duke@435 403 markOop displaced_mark() const;
duke@435 404 void set_displaced_mark(markOop m);
duke@435 405
duke@435 406 // for code generation
duke@435 407 static int mark_offset_in_bytes() { return offset_of(oopDesc, _mark); }
coleenp@548 408 static int klass_offset_in_bytes() { return offset_of(oopDesc, _metadata._klass); }
coleenp@548 409 static int klass_gap_offset_in_bytes();
duke@435 410 };
stefank@2314 411
stefank@2314 412 #endif // SHARE_VM_OOPS_OOP_HPP

mercurial