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