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. |