22 *
23 */
24
25 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHFORWARDING_INLINE_HPP
26 #define SHARE_GC_SHENANDOAH_SHENANDOAHFORWARDING_INLINE_HPP
27
28 #include "gc/shenandoah/shenandoahAsserts.hpp"
29 #include "gc/shenandoah/shenandoahForwarding.hpp"
30 #include "oops/markWord.inline.hpp"
31
32 inline HeapWord* ShenandoahForwarding::get_forwardee_raw(oop obj) {
33 shenandoah_assert_in_heap(NULL, obj);
34 return get_forwardee_raw_unchecked(obj);
35 }
36
37 inline HeapWord* ShenandoahForwarding::get_forwardee_raw_unchecked(oop obj) {
38 markWord mark = obj->mark_raw();
39 if (mark.is_marked()) {
40 return (HeapWord*) mark.clear_lock_bits().to_pointer();
41 } else {
42 return cast_from_oop<HeapWord*>(obj);
43 }
44 }
45
46 inline oop ShenandoahForwarding::get_forwardee(oop obj) {
47 shenandoah_assert_correct(NULL, obj);
48 return oop(get_forwardee_raw_unchecked(obj));
49 }
50
51 inline bool ShenandoahForwarding::is_forwarded(oop obj) {
52 return obj->mark_raw().is_marked();
53 }
54
55 inline oop ShenandoahForwarding::try_update_forwardee(oop obj, oop update) {
56 markWord old_mark = obj->mark_raw();
57 if (old_mark.is_marked()) {
58 return oop(old_mark.clear_lock_bits().to_pointer());
59 }
60
61 markWord new_mark = markWord::encode_pointer_as_mark(update);
62 markWord prev_mark = obj->cas_set_mark_raw(new_mark, old_mark);
|
22 *
23 */
24
25 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHFORWARDING_INLINE_HPP
26 #define SHARE_GC_SHENANDOAH_SHENANDOAHFORWARDING_INLINE_HPP
27
28 #include "gc/shenandoah/shenandoahAsserts.hpp"
29 #include "gc/shenandoah/shenandoahForwarding.hpp"
30 #include "oops/markWord.inline.hpp"
31
32 inline HeapWord* ShenandoahForwarding::get_forwardee_raw(oop obj) {
33 shenandoah_assert_in_heap(NULL, obj);
34 return get_forwardee_raw_unchecked(obj);
35 }
36
37 inline HeapWord* ShenandoahForwarding::get_forwardee_raw_unchecked(oop obj) {
38 markWord mark = obj->mark_raw();
39 if (mark.is_marked()) {
40 return (HeapWord*) mark.clear_lock_bits().to_pointer();
41 } else {
42 return (HeapWord*) obj;
43 }
44 }
45
46 inline oop ShenandoahForwarding::get_forwardee(oop obj) {
47 shenandoah_assert_correct(NULL, obj);
48 return oop(get_forwardee_raw_unchecked(obj));
49 }
50
51 inline bool ShenandoahForwarding::is_forwarded(oop obj) {
52 return obj->mark_raw().is_marked();
53 }
54
55 inline oop ShenandoahForwarding::try_update_forwardee(oop obj, oop update) {
56 markWord old_mark = obj->mark_raw();
57 if (old_mark.is_marked()) {
58 return oop(old_mark.clear_lock_bits().to_pointer());
59 }
60
61 markWord new_mark = markWord::encode_pointer_as_mark(update);
62 markWord prev_mark = obj->cas_set_mark_raw(new_mark, old_mark);
|