src/hotspot/share/gc/z/zBarrier.cpp
changeset 58066 8407928b9fe5
parent 54488 25199b48f34f
equal deleted inserted replaced
58065:3fee0e6b54f5 58066:8407928b9fe5
    70 
    70 
    71   // Mark through
    71   // Mark through
    72   return true;
    72   return true;
    73 }
    73 }
    74 
    74 
    75 template <bool finalizable, bool publish>
    75 template <bool follow, bool finalizable, bool publish>
    76 uintptr_t ZBarrier::mark(uintptr_t addr) {
    76 uintptr_t ZBarrier::mark(uintptr_t addr) {
    77   uintptr_t good_addr;
    77   uintptr_t good_addr;
    78 
    78 
    79   if (ZAddress::is_marked(addr)) {
    79   if (ZAddress::is_marked(addr)) {
    80     // Already marked, but try to mark though anyway
    80     // Already marked, but try to mark though anyway
    87     good_addr = remap(addr);
    87     good_addr = remap(addr);
    88   }
    88   }
    89 
    89 
    90   // Mark
    90   // Mark
    91   if (should_mark_through<finalizable>(addr)) {
    91   if (should_mark_through<finalizable>(addr)) {
    92     ZHeap::heap()->mark_object<finalizable, publish>(good_addr);
    92     ZHeap::heap()->mark_object<follow, finalizable, publish>(good_addr);
    93   }
    93   }
    94 
    94 
    95   return good_addr;
    95   return good_addr;
    96 }
    96 }
    97 
    97 
   106   assert(!ZAddress::is_weak_good(addr), "Should not be weak good");
   106   assert(!ZAddress::is_weak_good(addr), "Should not be weak good");
   107   return ZHeap::heap()->relocate_object(addr);
   107   return ZHeap::heap()->relocate_object(addr);
   108 }
   108 }
   109 
   109 
   110 uintptr_t ZBarrier::relocate_or_mark(uintptr_t addr) {
   110 uintptr_t ZBarrier::relocate_or_mark(uintptr_t addr) {
   111   return during_relocate() ? relocate(addr) : mark<Strong, Publish>(addr);
   111   return during_relocate() ? relocate(addr) : mark<Follow, Strong, Publish>(addr);
   112 }
   112 }
   113 
   113 
   114 uintptr_t ZBarrier::relocate_or_remap(uintptr_t addr) {
   114 uintptr_t ZBarrier::relocate_or_remap(uintptr_t addr) {
   115   return during_relocate() ? relocate(addr) : remap(addr);
   115   return during_relocate() ? relocate(addr) : remap(addr);
   116 }
   116 }
   172 
   172 
   173 //
   173 //
   174 // Mark barrier
   174 // Mark barrier
   175 //
   175 //
   176 uintptr_t ZBarrier::mark_barrier_on_oop_slow_path(uintptr_t addr) {
   176 uintptr_t ZBarrier::mark_barrier_on_oop_slow_path(uintptr_t addr) {
   177   return mark<Strong, Overflow>(addr);
   177   return mark<Follow, Strong, Overflow>(addr);
   178 }
   178 }
   179 
   179 
   180 uintptr_t ZBarrier::mark_barrier_on_finalizable_oop_slow_path(uintptr_t addr) {
   180 uintptr_t ZBarrier::mark_barrier_on_finalizable_oop_slow_path(uintptr_t addr) {
   181   const uintptr_t good_addr = mark<Finalizable, Overflow>(addr);
   181   const uintptr_t good_addr = mark<Follow, Finalizable, Overflow>(addr);
   182   if (ZAddress::is_good(addr)) {
   182   if (ZAddress::is_good(addr)) {
   183     // If the oop was already strongly marked/good, then we do
   183     // If the oop was already strongly marked/good, then we do
   184     // not want to downgrade it to finalizable marked/good.
   184     // not want to downgrade it to finalizable marked/good.
   185     return good_addr;
   185     return good_addr;
   186   }
   186   }
   198 uintptr_t ZBarrier::mark_barrier_on_root_oop_slow_path(uintptr_t addr) {
   198 uintptr_t ZBarrier::mark_barrier_on_root_oop_slow_path(uintptr_t addr) {
   199   assert(SafepointSynchronize::is_at_safepoint(), "Should be at safepoint");
   199   assert(SafepointSynchronize::is_at_safepoint(), "Should be at safepoint");
   200   assert(during_mark(), "Invalid phase");
   200   assert(during_mark(), "Invalid phase");
   201 
   201 
   202   // Mark
   202   // Mark
   203   return mark<Strong, Publish>(addr);
   203   return mark<Follow, Strong, Publish>(addr);
       
   204 }
       
   205 
       
   206 uintptr_t ZBarrier::mark_barrier_on_invisible_root_oop_slow_path(uintptr_t addr) {
       
   207   assert(SafepointSynchronize::is_at_safepoint(), "Should be at safepoint");
       
   208   assert(during_mark(), "Invalid phase");
       
   209 
       
   210   // Mark
       
   211   return mark<DontFollow, Strong, Publish>(addr);
   204 }
   212 }
   205 
   213 
   206 //
   214 //
   207 // Relocate barrier
   215 // Relocate barrier
   208 //
   216 //