< prev index next >

test/hotspot/gtest/gc/shared/test_preservedMarks.cpp

Print this page




  36 // Class to create a "fake" oop with a mark that will
  37 // return true for calls to must_be_preserved().
  38 class FakeOop {
  39   oopDesc _oop;
  40 
  41 public:
  42   FakeOop() : _oop() { _oop.set_mark_raw(originalMark()); }
  43 
  44   oop get_oop() { return &_oop; }
  45   markWord mark() { return _oop.mark_raw(); }
  46   void set_mark(markWord m) { _oop.set_mark_raw(m); }
  47   void forward_to(oop obj) {
  48     markWord m = markWord::encode_pointer_as_mark(obj);
  49     _oop.set_mark_raw(m);
  50   }
  51 
  52   static markWord originalMark() { return markWord(markWord::lock_mask_in_place); }
  53   static markWord changedMark()  { return markWord(0x4711); }
  54 };
  55 


  56 TEST_VM(PreservedMarks, iterate_and_restore) {
  57   // Need to disable biased locking to easily
  58   // create oops that "must_be_preseved"
  59   ScopedDisabledBiasedLocking dbl;
  60 
  61   PreservedMarks pm;
  62   FakeOop o1;
  63   FakeOop o2;
  64   FakeOop o3;
  65   FakeOop o4;
  66 
  67   // Make sure initial marks are correct.
  68   ASSERT_EQ(o1.mark(), FakeOop::originalMark());
  69   ASSERT_EQ(o2.mark(), FakeOop::originalMark());
  70   ASSERT_EQ(o3.mark(), FakeOop::originalMark());
  71   ASSERT_EQ(o4.mark(), FakeOop::originalMark());
  72 
  73   // Change the marks and verify change.
  74   o1.set_mark(FakeOop::changedMark());
  75   o2.set_mark(FakeOop::changedMark());
  76   ASSERT_EQ(o1.mark(), FakeOop::changedMark());
  77   ASSERT_EQ(o2.mark(), FakeOop::changedMark());
  78 
  79   // Push o1 and o2 to have their marks preserved.
  80   pm.push(o1.get_oop(), o1.mark());
  81   pm.push(o2.get_oop(), o2.mark());
  82 
  83   // Fake a move from o1->o3 and o2->o4.
  84   o1.forward_to(o3.get_oop());
  85   o2.forward_to(o4.get_oop());
  86   ASSERT_EQ(o1.get_oop()->forwardee(), o3.get_oop());
  87   ASSERT_EQ(o2.get_oop()->forwardee(), o4.get_oop());
  88   // Adjust will update the PreservedMarks stack to
  89   // make sure the mark is updated at the new location.
  90   pm.adjust_during_full_gc();
  91 
  92   // Restore all preserved and verify that the changed
  93   // mark is now present at o3 and o4.
  94   pm.restore();
  95   ASSERT_EQ(o3.mark(), FakeOop::changedMark());
  96   ASSERT_EQ(o4.mark(), FakeOop::changedMark());
  97 }


  36 // Class to create a "fake" oop with a mark that will
  37 // return true for calls to must_be_preserved().
  38 class FakeOop {
  39   oopDesc _oop;
  40 
  41 public:
  42   FakeOop() : _oop() { _oop.set_mark_raw(originalMark()); }
  43 
  44   oop get_oop() { return &_oop; }
  45   markWord mark() { return _oop.mark_raw(); }
  46   void set_mark(markWord m) { _oop.set_mark_raw(m); }
  47   void forward_to(oop obj) {
  48     markWord m = markWord::encode_pointer_as_mark(obj);
  49     _oop.set_mark_raw(m);
  50   }
  51 
  52   static markWord originalMark() { return markWord(markWord::lock_mask_in_place); }
  53   static markWord changedMark()  { return markWord(0x4711); }
  54 };
  55 
  56 #define ASSERT_MARK_WORD_EQ(a, b) ASSERT_EQ((a).value(), (b).value())
  57 
  58 TEST_VM(PreservedMarks, iterate_and_restore) {
  59   // Need to disable biased locking to easily
  60   // create oops that "must_be_preseved"
  61   ScopedDisabledBiasedLocking dbl;
  62 
  63   PreservedMarks pm;
  64   FakeOop o1;
  65   FakeOop o2;
  66   FakeOop o3;
  67   FakeOop o4;
  68 
  69   // Make sure initial marks are correct.
  70   ASSERT_MARK_WORD_EQ(o1.mark(), FakeOop::originalMark());
  71   ASSERT_MARK_WORD_EQ(o2.mark(), FakeOop::originalMark());
  72   ASSERT_MARK_WORD_EQ(o3.mark(), FakeOop::originalMark());
  73   ASSERT_MARK_WORD_EQ(o4.mark(), FakeOop::originalMark());
  74 
  75   // Change the marks and verify change.
  76   o1.set_mark(FakeOop::changedMark());
  77   o2.set_mark(FakeOop::changedMark());
  78   ASSERT_MARK_WORD_EQ(o1.mark(), FakeOop::changedMark());
  79   ASSERT_MARK_WORD_EQ(o2.mark(), FakeOop::changedMark());
  80 
  81   // Push o1 and o2 to have their marks preserved.
  82   pm.push(o1.get_oop(), o1.mark());
  83   pm.push(o2.get_oop(), o2.mark());
  84 
  85   // Fake a move from o1->o3 and o2->o4.
  86   o1.forward_to(o3.get_oop());
  87   o2.forward_to(o4.get_oop());
  88   ASSERT_EQ(o1.get_oop()->forwardee(), o3.get_oop());
  89   ASSERT_EQ(o2.get_oop()->forwardee(), o4.get_oop());
  90   // Adjust will update the PreservedMarks stack to
  91   // make sure the mark is updated at the new location.
  92   pm.adjust_during_full_gc();
  93 
  94   // Restore all preserved and verify that the changed
  95   // mark is now present at o3 and o4.
  96   pm.restore();
  97   ASSERT_MARK_WORD_EQ(o3.mark(), FakeOop::changedMark());
  98   ASSERT_MARK_WORD_EQ(o4.mark(), FakeOop::changedMark());
  99 }
< prev index next >