< prev index next >

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

Print this page
rev 13451 : imported patch remove_cmpxchg_ptr_users


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


 391     narrowOop old = (narrowOop)Atomic::xchg(val, (narrowOop*)dest);
 392     // decode old from T to oop
 393     return decode_heap_oop(old);
 394   } else {
 395     return (oop)Atomic::xchg_ptr(exchange_value, (oop*)dest);
 396   }
 397 }
 398 
 399 oop oopDesc::atomic_compare_exchange_oop(oop exchange_value,
 400                                          volatile HeapWord *dest,
 401                                          oop compare_value,
 402                                          bool prebarrier) {
 403   if (UseCompressedOops) {
 404     if (prebarrier) {
 405       update_barrier_set_pre((narrowOop*)dest, exchange_value);
 406     }
 407     // encode exchange and compare value from oop to T
 408     narrowOop val = encode_heap_oop(exchange_value);
 409     narrowOop cmp = encode_heap_oop(compare_value);
 410 
 411     narrowOop old = (narrowOop) Atomic::cmpxchg(val, (narrowOop*)dest, cmp);
 412     // decode old from T to oop
 413     return decode_heap_oop(old);
 414   } else {
 415     if (prebarrier) {
 416       update_barrier_set_pre((oop*)dest, exchange_value);
 417     }
 418     return (oop)Atomic::cmpxchg_ptr(exchange_value, (oop*)dest, compare_value);
 419   }
 420 }
 421 
 422 // In order to put or get a field out of an instance, must first check
 423 // if the field has been compressed and uncompress it.
 424 oop oopDesc::obj_field(int offset) const {
 425   return UseCompressedOops ?
 426     load_decode_heap_oop(obj_field_addr<narrowOop>(offset)) :
 427     load_decode_heap_oop(obj_field_addr<oop>(offset));
 428 }
 429 
 430 void oopDesc::obj_field_put(int offset, oop value) {
 431   UseCompressedOops ? oop_store(obj_field_addr<narrowOop>(offset), value) :
 432                       oop_store(obj_field_addr<oop>(offset),       value);
 433 }
 434 
 435 void oopDesc::obj_field_put_raw(int offset, oop value) {
 436   UseCompressedOops ?
 437     encode_store_heap_oop(obj_field_addr<narrowOop>(offset), value) :
 438     encode_store_heap_oop(obj_field_addr<oop>(offset),       value);


 602 bool oopDesc::cas_forward_to(oop p, markOop compare) {
 603   assert(check_obj_alignment(p),
 604          "forwarding to something not aligned");
 605   assert(Universe::heap()->is_in_reserved(p),
 606          "forwarding to something not in heap");
 607   markOop m = markOopDesc::encode_pointer_as_mark(p);
 608   assert(m->decode_pointer() == p, "encoding must be reversable");
 609   return cas_set_mark(m, compare) == compare;
 610 }
 611 
 612 #if INCLUDE_ALL_GCS
 613 oop oopDesc::forward_to_atomic(oop p) {
 614   markOop oldMark = mark();
 615   markOop forwardPtrMark = markOopDesc::encode_pointer_as_mark(p);
 616   markOop curMark;
 617 
 618   assert(forwardPtrMark->decode_pointer() == p, "encoding must be reversable");
 619   assert(sizeof(markOop) == sizeof(intptr_t), "CAS below requires this.");
 620 
 621   while (!oldMark->is_marked()) {
 622     curMark = (markOop)Atomic::cmpxchg_ptr(forwardPtrMark, &_mark, oldMark);
 623     assert(is_forwarded(), "object should have been forwarded");
 624     if (curMark == oldMark) {
 625       return NULL;
 626     }
 627     // If the CAS was unsuccessful then curMark->is_marked()
 628     // should return true as another thread has CAS'd in another
 629     // forwarding pointer.
 630     oldMark = curMark;
 631   }
 632   return forwardee();
 633 }
 634 #endif
 635 
 636 // Note that the forwardee is not the same thing as the displaced_mark.
 637 // The forwardee is used when copying during scavenge and mark-sweep.
 638 // It does need to clear the low two locking- and GC-related bits.
 639 oop oopDesc::forwardee() const {
 640   return (oop) mark()->decode_pointer();
 641 }
 642 




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


 391     narrowOop old = (narrowOop)Atomic::xchg(val, (narrowOop*)dest);
 392     // decode old from T to oop
 393     return decode_heap_oop(old);
 394   } else {
 395     return (oop)Atomic::xchg_ptr(exchange_value, (oop*)dest);
 396   }
 397 }
 398 
 399 oop oopDesc::atomic_compare_exchange_oop(oop exchange_value,
 400                                          volatile HeapWord *dest,
 401                                          oop compare_value,
 402                                          bool prebarrier) {
 403   if (UseCompressedOops) {
 404     if (prebarrier) {
 405       update_barrier_set_pre((narrowOop*)dest, exchange_value);
 406     }
 407     // encode exchange and compare value from oop to T
 408     narrowOop val = encode_heap_oop(exchange_value);
 409     narrowOop cmp = encode_heap_oop(compare_value);
 410 
 411     narrowOop old = Atomic::cmpxchg(val, (narrowOop*)dest, cmp);
 412     // decode old from T to oop
 413     return decode_heap_oop(old);
 414   } else {
 415     if (prebarrier) {
 416       update_barrier_set_pre((oop*)dest, exchange_value);
 417     }
 418     return Atomic::cmpxchg(exchange_value, (oop*)dest, compare_value);
 419   }
 420 }
 421 
 422 // In order to put or get a field out of an instance, must first check
 423 // if the field has been compressed and uncompress it.
 424 oop oopDesc::obj_field(int offset) const {
 425   return UseCompressedOops ?
 426     load_decode_heap_oop(obj_field_addr<narrowOop>(offset)) :
 427     load_decode_heap_oop(obj_field_addr<oop>(offset));
 428 }
 429 
 430 void oopDesc::obj_field_put(int offset, oop value) {
 431   UseCompressedOops ? oop_store(obj_field_addr<narrowOop>(offset), value) :
 432                       oop_store(obj_field_addr<oop>(offset),       value);
 433 }
 434 
 435 void oopDesc::obj_field_put_raw(int offset, oop value) {
 436   UseCompressedOops ?
 437     encode_store_heap_oop(obj_field_addr<narrowOop>(offset), value) :
 438     encode_store_heap_oop(obj_field_addr<oop>(offset),       value);


 602 bool oopDesc::cas_forward_to(oop p, markOop compare) {
 603   assert(check_obj_alignment(p),
 604          "forwarding to something not aligned");
 605   assert(Universe::heap()->is_in_reserved(p),
 606          "forwarding to something not in heap");
 607   markOop m = markOopDesc::encode_pointer_as_mark(p);
 608   assert(m->decode_pointer() == p, "encoding must be reversable");
 609   return cas_set_mark(m, compare) == compare;
 610 }
 611 
 612 #if INCLUDE_ALL_GCS
 613 oop oopDesc::forward_to_atomic(oop p) {
 614   markOop oldMark = mark();
 615   markOop forwardPtrMark = markOopDesc::encode_pointer_as_mark(p);
 616   markOop curMark;
 617 
 618   assert(forwardPtrMark->decode_pointer() == p, "encoding must be reversable");
 619   assert(sizeof(markOop) == sizeof(intptr_t), "CAS below requires this.");
 620 
 621   while (!oldMark->is_marked()) {
 622     curMark = Atomic::cmpxchg(forwardPtrMark, &_mark, oldMark);
 623     assert(is_forwarded(), "object should have been forwarded");
 624     if (curMark == oldMark) {
 625       return NULL;
 626     }
 627     // If the CAS was unsuccessful then curMark->is_marked()
 628     // should return true as another thread has CAS'd in another
 629     // forwarding pointer.
 630     oldMark = curMark;
 631   }
 632   return forwardee();
 633 }
 634 #endif
 635 
 636 // Note that the forwardee is not the same thing as the displaced_mark.
 637 // The forwardee is used when copying during scavenge and mark-sweep.
 638 // It does need to clear the low two locking- and GC-related bits.
 639 oop oopDesc::forwardee() const {
 640   return (oop) mark()->decode_pointer();
 641 }
 642 


< prev index next >