65 } 66 67 void oopDesc::set_mark_raw(HeapWord* mem, markWord m) { 68 *(markWord*)(((char*)mem) + mark_offset_in_bytes()) = m; 69 } 70 71 void oopDesc::release_set_mark(markWord m) { 72 HeapAccess<MO_RELEASE>::store_at(as_oop(), mark_offset_in_bytes(), m.value()); 73 } 74 75 markWord oopDesc::cas_set_mark(markWord new_mark, markWord old_mark) { 76 uintptr_t v = HeapAccess<>::atomic_cmpxchg_at(new_mark.value(), as_oop(), mark_offset_in_bytes(), old_mark.value()); 77 return markWord(v); 78 } 79 80 markWord oopDesc::cas_set_mark_raw(markWord new_mark, markWord old_mark, atomic_memory_order order) { 81 return Atomic::cmpxchg(new_mark, &_mark, old_mark, order); 82 } 83 84 void oopDesc::init_mark() { 85 set_mark(markWord::prototype_for_object(this)); 86 } 87 88 void oopDesc::init_mark_raw() { 89 set_mark_raw(markWord::prototype_for_object(this)); 90 } 91 92 Klass* oopDesc::klass() const { 93 if (UseCompressedClassPointers) { 94 return CompressedKlassPointers::decode_not_null(_metadata._compressed_klass); 95 } else { 96 return _metadata._klass; 97 } 98 } 99 100 Klass* oopDesc::klass_or_null() const volatile { 101 if (UseCompressedClassPointers) { 102 return CompressedKlassPointers::decode(_metadata._compressed_klass); 103 } else { 104 return _metadata._klass; 105 } 106 } 107 108 Klass* oopDesc::klass_or_null_acquire() const volatile { 109 if (UseCompressedClassPointers) { 464 markWord mrk = mark(); 465 if (mrk.is_unlocked() && !mrk.has_no_hash()) { 466 return mrk.hash(); 467 } else if (mrk.is_marked()) { 468 return mrk.hash(); 469 } else { 470 return slow_identity_hash(); 471 } 472 } 473 474 bool oopDesc::has_displaced_mark_raw() const { 475 return mark_raw().has_displaced_mark_helper(); 476 } 477 478 markWord oopDesc::displaced_mark_raw() const { 479 return mark_raw().displaced_mark_helper(); 480 } 481 482 void oopDesc::set_displaced_mark_raw(markWord m) { 483 mark_raw().set_displaced_mark_helper(m); 484 } 485 486 #endif // SHARE_OOPS_OOP_INLINE_HPP | 65 } 66 67 void oopDesc::set_mark_raw(HeapWord* mem, markWord m) { 68 *(markWord*)(((char*)mem) + mark_offset_in_bytes()) = m; 69 } 70 71 void oopDesc::release_set_mark(markWord m) { 72 HeapAccess<MO_RELEASE>::store_at(as_oop(), mark_offset_in_bytes(), m.value()); 73 } 74 75 markWord oopDesc::cas_set_mark(markWord new_mark, markWord old_mark) { 76 uintptr_t v = HeapAccess<>::atomic_cmpxchg_at(new_mark.value(), as_oop(), mark_offset_in_bytes(), old_mark.value()); 77 return markWord(v); 78 } 79 80 markWord oopDesc::cas_set_mark_raw(markWord new_mark, markWord old_mark, atomic_memory_order order) { 81 return Atomic::cmpxchg(new_mark, &_mark, old_mark, order); 82 } 83 84 void oopDesc::init_mark() { 85 set_mark(markWord::prototype_for_klass(klass())); 86 } 87 88 void oopDesc::init_mark_raw() { 89 set_mark_raw(markWord::prototype_for_klass(klass())); 90 } 91 92 Klass* oopDesc::klass() const { 93 if (UseCompressedClassPointers) { 94 return CompressedKlassPointers::decode_not_null(_metadata._compressed_klass); 95 } else { 96 return _metadata._klass; 97 } 98 } 99 100 Klass* oopDesc::klass_or_null() const volatile { 101 if (UseCompressedClassPointers) { 102 return CompressedKlassPointers::decode(_metadata._compressed_klass); 103 } else { 104 return _metadata._klass; 105 } 106 } 107 108 Klass* oopDesc::klass_or_null_acquire() const volatile { 109 if (UseCompressedClassPointers) { 464 markWord mrk = mark(); 465 if (mrk.is_unlocked() && !mrk.has_no_hash()) { 466 return mrk.hash(); 467 } else if (mrk.is_marked()) { 468 return mrk.hash(); 469 } else { 470 return slow_identity_hash(); 471 } 472 } 473 474 bool oopDesc::has_displaced_mark_raw() const { 475 return mark_raw().has_displaced_mark_helper(); 476 } 477 478 markWord oopDesc::displaced_mark_raw() const { 479 return mark_raw().displaced_mark_helper(); 480 } 481 482 void oopDesc::set_displaced_mark_raw(markWord m) { 483 mark_raw().set_displaced_mark_helper(m); 484 } 485 486 // Supports deferred calling of obj->klass(). 487 class DeferredObjectToKlass { 488 const oopDesc* _obj; 489 490 public: 491 DeferredObjectToKlass(const oopDesc* obj) : _obj(obj) {} 492 493 // Implicitly convertible to const Klass*. 494 operator const Klass*() const { 495 return _obj->klass(); 496 } 497 }; 498 499 bool oopDesc::mark_must_be_preserved(markWord m) const { 500 // There's a circular dependency between oop.inline.hpp and 501 // markWord.inline.hpp because markWord::must_be_preserved wants to call 502 // oopDesc::klass(). This could be solved by calling klass() here. However, 503 // not all paths inside must_be_preserved calls klass(). Defer the call until 504 // the klass is actually needed. 505 return m.must_be_preserved(DeferredObjectToKlass(this)); 506 } 507 508 bool oopDesc::mark_must_be_preserved_for_promotion_failure(markWord m) const { 509 return m.must_be_preserved_for_promotion_failure(DeferredObjectToKlass(this)); 510 } 511 512 #endif // SHARE_OOPS_OOP_INLINE_HPP |