< prev index next >

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

Print this page




  75   update_barrier_set((void*)p, v, true /* release */);    // cast away type
  76 }
  77 
  78 // Should replace *addr = oop assignments where addr type depends on UseCompressedOops
  79 // (without having to remember the function name this calls).
  80 inline void oop_store_raw(HeapWord* addr, oop value) {
  81   if (UseCompressedOops) {
  82     oopDesc::encode_store_heap_oop((narrowOop*)addr, value);
  83   } else {
  84     oopDesc::encode_store_heap_oop((oop*)addr, value);
  85   }
  86 }
  87 
  88 // Implementation of all inlined member functions defined in oop.hpp
  89 // We need a separate file to avoid circular references
  90 
  91 void oopDesc::release_set_mark(markOop m) {
  92   OrderAccess::release_store_ptr(&_mark, m);
  93 }
  94 
  95 markOop oopDesc::cas_set_mark(markOop new_mark, markOop old_mark) {
  96   return (markOop) Atomic::cmpxchg_ptr(new_mark, &_mark, old_mark);
  97 }
  98 
  99 void oopDesc::init_mark() {
 100   set_mark(markOopDesc::prototype_for_object(this));
 101 }
 102 
 103 Klass* oopDesc::klass() const {
 104   if (UseCompressedClassPointers) {
 105     return Klass::decode_klass_not_null(_metadata._compressed_klass);
 106   } else {
 107     return _metadata._klass;
 108   }
 109 }
 110 
 111 Klass* oopDesc::klass_or_null() const volatile {
 112   // can be NULL in CMS
 113   if (UseCompressedClassPointers) {
 114     return Klass::decode_klass(_metadata._compressed_klass);
 115   } else {
 116     return _metadata._klass;


 561 
 562 // Used by scavengers
 563 bool oopDesc::is_forwarded() const {
 564   // The extra heap check is needed since the obj might be locked, in which case the
 565   // mark would point to a stack location and have the sentinel bit cleared
 566   return mark()->is_marked();
 567 }
 568 
 569 // Used by scavengers
 570 void oopDesc::forward_to(oop p) {
 571   assert(check_obj_alignment(p),
 572          "forwarding to something not aligned");
 573   assert(Universe::heap()->is_in_reserved(p),
 574          "forwarding to something not in heap");
 575   markOop m = markOopDesc::encode_pointer_as_mark(p);
 576   assert(m->decode_pointer() == p, "encoding must be reversable");
 577   set_mark(m);
 578 }
 579 
 580 // Used by parallel scavengers
 581 bool oopDesc::cas_forward_to(oop p, markOop compare) {
 582   assert(check_obj_alignment(p),
 583          "forwarding to something not aligned");
 584   assert(Universe::heap()->is_in_reserved(p),
 585          "forwarding to something not in heap");
 586   markOop m = markOopDesc::encode_pointer_as_mark(p);
 587   assert(m->decode_pointer() == p, "encoding must be reversable");
 588   return cas_set_mark(m, compare) == compare;
 589 }
 590 
 591 #if INCLUDE_ALL_GCS
 592 oop oopDesc::forward_to_atomic(oop p) {
 593   markOop oldMark = mark();
 594   markOop forwardPtrMark = markOopDesc::encode_pointer_as_mark(p);
 595   markOop curMark;
 596 
 597   assert(forwardPtrMark->decode_pointer() == p, "encoding must be reversable");
 598   assert(sizeof(markOop) == sizeof(intptr_t), "CAS below requires this.");
 599 
 600   while (!oldMark->is_marked()) {
 601     curMark = (markOop)Atomic::cmpxchg_ptr(forwardPtrMark, &_mark, oldMark);
 602     assert(is_forwarded(), "object should have been forwarded");
 603     if (curMark == oldMark) {
 604       return NULL;
 605     }
 606     // If the CAS was unsuccessful then curMark->is_marked()
 607     // should return true as another thread has CAS'd in another
 608     // forwarding pointer.




  75   update_barrier_set((void*)p, v, true /* release */);    // cast away type
  76 }
  77 
  78 // Should replace *addr = oop assignments where addr type depends on UseCompressedOops
  79 // (without having to remember the function name this calls).
  80 inline void oop_store_raw(HeapWord* addr, oop value) {
  81   if (UseCompressedOops) {
  82     oopDesc::encode_store_heap_oop((narrowOop*)addr, value);
  83   } else {
  84     oopDesc::encode_store_heap_oop((oop*)addr, value);
  85   }
  86 }
  87 
  88 // Implementation of all inlined member functions defined in oop.hpp
  89 // We need a separate file to avoid circular references
  90 
  91 void oopDesc::release_set_mark(markOop m) {
  92   OrderAccess::release_store_ptr(&_mark, m);
  93 }
  94 
  95 markOop oopDesc::cas_set_mark(markOop new_mark, markOop old_mark, cmpxchg_memory_order order) {
  96   return (markOop) Atomic::cmpxchg_ptr(new_mark, &_mark, old_mark, order);
  97 }
  98 
  99 void oopDesc::init_mark() {
 100   set_mark(markOopDesc::prototype_for_object(this));
 101 }
 102 
 103 Klass* oopDesc::klass() const {
 104   if (UseCompressedClassPointers) {
 105     return Klass::decode_klass_not_null(_metadata._compressed_klass);
 106   } else {
 107     return _metadata._klass;
 108   }
 109 }
 110 
 111 Klass* oopDesc::klass_or_null() const volatile {
 112   // can be NULL in CMS
 113   if (UseCompressedClassPointers) {
 114     return Klass::decode_klass(_metadata._compressed_klass);
 115   } else {
 116     return _metadata._klass;


 561 
 562 // Used by scavengers
 563 bool oopDesc::is_forwarded() const {
 564   // The extra heap check is needed since the obj might be locked, in which case the
 565   // mark would point to a stack location and have the sentinel bit cleared
 566   return mark()->is_marked();
 567 }
 568 
 569 // Used by scavengers
 570 void oopDesc::forward_to(oop p) {
 571   assert(check_obj_alignment(p),
 572          "forwarding to something not aligned");
 573   assert(Universe::heap()->is_in_reserved(p),
 574          "forwarding to something not in heap");
 575   markOop m = markOopDesc::encode_pointer_as_mark(p);
 576   assert(m->decode_pointer() == p, "encoding must be reversable");
 577   set_mark(m);
 578 }
 579 
 580 // Used by parallel scavengers
 581 bool oopDesc::cas_forward_to(oop p, markOop compare, cmpxchg_memory_order order) {
 582   assert(check_obj_alignment(p),
 583          "forwarding to something not aligned");
 584   assert(Universe::heap()->is_in_reserved(p),
 585          "forwarding to something not in heap");
 586   markOop m = markOopDesc::encode_pointer_as_mark(p);
 587   assert(m->decode_pointer() == p, "encoding must be reversable");
 588   return cas_set_mark(m, compare, order) == compare;
 589 }
 590 
 591 #if INCLUDE_ALL_GCS
 592 oop oopDesc::forward_to_atomic(oop p) {
 593   markOop oldMark = mark();
 594   markOop forwardPtrMark = markOopDesc::encode_pointer_as_mark(p);
 595   markOop curMark;
 596 
 597   assert(forwardPtrMark->decode_pointer() == p, "encoding must be reversable");
 598   assert(sizeof(markOop) == sizeof(intptr_t), "CAS below requires this.");
 599 
 600   while (!oldMark->is_marked()) {
 601     curMark = (markOop)Atomic::cmpxchg_ptr(forwardPtrMark, &_mark, oldMark);
 602     assert(is_forwarded(), "object should have been forwarded");
 603     if (curMark == oldMark) {
 604       return NULL;
 605     }
 606     // If the CAS was unsuccessful then curMark->is_marked()
 607     // should return true as another thread has CAS'd in another
 608     // forwarding pointer.


< prev index next >