40 |
40 |
41 public: |
41 public: |
42 FakeOop() : _oop() { _oop.set_mark_raw(originalMark()); } |
42 FakeOop() : _oop() { _oop.set_mark_raw(originalMark()); } |
43 |
43 |
44 oop get_oop() { return &_oop; } |
44 oop get_oop() { return &_oop; } |
45 markOop mark() { return _oop.mark_raw(); } |
45 markWord mark() { return _oop.mark_raw(); } |
46 void set_mark(markOop m) { _oop.set_mark_raw(m); } |
46 void set_mark(markWord m) { _oop.set_mark_raw(m); } |
47 void forward_to(oop obj) { |
47 void forward_to(oop obj) { |
48 markOop m = markOopDesc::encode_pointer_as_mark(obj); |
48 markWord m = markWord::encode_pointer_as_mark(obj); |
49 _oop.set_mark_raw(m); |
49 _oop.set_mark_raw(m); |
50 } |
50 } |
51 |
51 |
52 static markOop originalMark() { return markOop(markOopDesc::lock_mask_in_place); } |
52 static markWord originalMark() { return markWord(markWord::lock_mask_in_place); } |
53 static markOop changedMark() { return markOop(0x4711); } |
53 static markWord changedMark() { return markWord(0x4711); } |
54 }; |
54 }; |
|
55 |
|
56 #define ASSERT_MARK_WORD_EQ(a, b) ASSERT_EQ((a).value(), (b).value()) |
55 |
57 |
56 TEST_VM(PreservedMarks, iterate_and_restore) { |
58 TEST_VM(PreservedMarks, iterate_and_restore) { |
57 // Need to disable biased locking to easily |
59 // Need to disable biased locking to easily |
58 // create oops that "must_be_preseved" |
60 // create oops that "must_be_preseved" |
59 ScopedDisabledBiasedLocking dbl; |
61 ScopedDisabledBiasedLocking dbl; |
63 FakeOop o2; |
65 FakeOop o2; |
64 FakeOop o3; |
66 FakeOop o3; |
65 FakeOop o4; |
67 FakeOop o4; |
66 |
68 |
67 // Make sure initial marks are correct. |
69 // Make sure initial marks are correct. |
68 ASSERT_EQ(o1.mark(), FakeOop::originalMark()); |
70 ASSERT_MARK_WORD_EQ(o1.mark(), FakeOop::originalMark()); |
69 ASSERT_EQ(o2.mark(), FakeOop::originalMark()); |
71 ASSERT_MARK_WORD_EQ(o2.mark(), FakeOop::originalMark()); |
70 ASSERT_EQ(o3.mark(), FakeOop::originalMark()); |
72 ASSERT_MARK_WORD_EQ(o3.mark(), FakeOop::originalMark()); |
71 ASSERT_EQ(o4.mark(), FakeOop::originalMark()); |
73 ASSERT_MARK_WORD_EQ(o4.mark(), FakeOop::originalMark()); |
72 |
74 |
73 // Change the marks and verify change. |
75 // Change the marks and verify change. |
74 o1.set_mark(FakeOop::changedMark()); |
76 o1.set_mark(FakeOop::changedMark()); |
75 o2.set_mark(FakeOop::changedMark()); |
77 o2.set_mark(FakeOop::changedMark()); |
76 ASSERT_EQ(o1.mark(), FakeOop::changedMark()); |
78 ASSERT_MARK_WORD_EQ(o1.mark(), FakeOop::changedMark()); |
77 ASSERT_EQ(o2.mark(), FakeOop::changedMark()); |
79 ASSERT_MARK_WORD_EQ(o2.mark(), FakeOop::changedMark()); |
78 |
80 |
79 // Push o1 and o2 to have their marks preserved. |
81 // Push o1 and o2 to have their marks preserved. |
80 pm.push(o1.get_oop(), o1.mark()); |
82 pm.push(o1.get_oop(), o1.mark()); |
81 pm.push(o2.get_oop(), o2.mark()); |
83 pm.push(o2.get_oop(), o2.mark()); |
82 |
84 |
90 pm.adjust_during_full_gc(); |
92 pm.adjust_during_full_gc(); |
91 |
93 |
92 // Restore all preserved and verify that the changed |
94 // Restore all preserved and verify that the changed |
93 // mark is now present at o3 and o4. |
95 // mark is now present at o3 and o4. |
94 pm.restore(); |
96 pm.restore(); |
95 ASSERT_EQ(o3.mark(), FakeOop::changedMark()); |
97 ASSERT_MARK_WORD_EQ(o3.mark(), FakeOop::changedMark()); |
96 ASSERT_EQ(o4.mark(), FakeOop::changedMark()); |
98 ASSERT_MARK_WORD_EQ(o4.mark(), FakeOop::changedMark()); |
97 } |
99 } |