< prev index next >

src/hotspot/share/oops/oop.inline.hpp

Print this page




  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
< prev index next >