< prev index next >

src/hotspot/share/gc/shared/preservedMarks.cpp

Print this page
*** 22,10 ***
--- 22,11 ---
   *
   */
  
  #include "precompiled.hpp"
  #include "gc/shared/preservedMarks.inline.hpp"
+ #include "gc/shared/slidingForwarding.inline.hpp"
  #include "gc/shared/workgroup.hpp"
  #include "memory/allocation.inline.hpp"
  #include "memory/resourceArea.hpp"
  #include "oops/oop.inline.hpp"
  #include "runtime/atomic.hpp"

*** 37,10 ***
--- 38,12 ---
      elem.set_mark();
    }
    assert_empty();
  }
  
+ // TODO: This method is unused, except in the gunit test. Change the test
+ // to exercise the updated method below instead, and remove this one.
  void PreservedMarks::adjust_during_full_gc() {
    StackIterator<OopAndMarkWord, mtGC> iter(_stack);
    while (!iter.is_empty()) {
      OopAndMarkWord* elem = iter.next_addr();
  

*** 49,10 ***
--- 52,22 ---
        elem->set_oop(obj->forwardee());
      }
    }
  }
  
+ void PreservedMarks::adjust_during_full_gc(const SlidingForwarding* const forwarding) {
+   StackIterator<OopAndMarkWord, mtGC> iter(_stack);
+   while (!iter.is_empty()) {
+     OopAndMarkWord* elem = iter.next_addr();
+ 
+     oop obj = elem->get_oop();
+     if (obj->is_forwarded()) {
+       elem->set_oop(forwarding->forwardee(obj));
+     }
+   }
+ }
+ 
  void PreservedMarks::restore_and_increment(volatile size_t* const total_size_addr) {
    const size_t stack_size = size();
    restore();
    // Only do the atomic add if the size is > 0.
    if (stack_size > 0) {

*** 70,11 ***
  }
  #endif // ndef PRODUCT
  
  void RemoveForwardedPointerClosure::do_object(oop obj) {
    if (obj->is_forwarded()) {
!     PreservedMarks::init_forwarded_mark(obj);
    }
  }
  
  void PreservedMarksSet::init(uint num) {
    assert(_stacks == nullptr && _num == 0, "do not re-initialize");
--- 85,25 ---
  }
  #endif // ndef PRODUCT
  
  void RemoveForwardedPointerClosure::do_object(oop obj) {
    if (obj->is_forwarded()) {
! #ifdef _LP64
+     if (UseCompactObjectHeaders) {
+       oop forwardee = obj->forwardee();
+       markWord header = forwardee->mark();
+       if (header.has_displaced_mark_helper()) {
+         header = header.displaced_mark_helper();
+       }
+       assert(UseCompressedClassPointers, "assume +UseCompressedClassPointers");
+       narrowKlass nklass = header.narrow_klass();
+       obj->set_mark(markWord::prototype().set_narrow_klass(nklass));
+     } else
+ #endif
+     {
+       PreservedMarks::init_forwarded_mark(obj);
+     }
    }
  }
  
  void PreservedMarksSet::init(uint num) {
    assert(_stacks == nullptr && _num == 0, "do not re-initialize");
< prev index next >