src/hotspot/share/gc/z/zBarrier.inline.hpp
author eosterlund
Tue, 12 Nov 2019 20:14:49 +0000
changeset 59040 1251d78fafbf
parent 58958 7bfe7df764a2
child 59252 623722a6aeb9
permissions -rw-r--r--
8230661: ZGC: Stop reloading oops in load barriers Reviewed-by: pliden, stefank
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     1
/*
59040
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
     2
 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     4
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     7
 * published by the Free Software Foundation.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     8
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    13
 * accompanied this code).
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    14
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    18
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    21
 * questions.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    22
 */
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    23
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    24
#ifndef SHARE_GC_Z_ZBARRIER_INLINE_HPP
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    25
#define SHARE_GC_Z_ZBARRIER_INLINE_HPP
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    26
55555
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
    27
#include "classfile/javaClasses.hpp"
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    28
#include "gc/z/zAddress.inline.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    29
#include "gc/z/zBarrier.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    30
#include "gc/z/zOop.inline.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    31
#include "gc/z/zResurrection.inline.hpp"
55555
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
    32
#include "oops/oop.hpp"
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    33
#include "runtime/atomic.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    34
59040
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    35
inline void ZBarrier::self_heal(volatile oop* p, uintptr_t addr, uintptr_t heal_addr) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    36
  if (heal_addr == 0) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    37
    // Never heal with null since it interacts badly with reference processing.
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    38
    // A mutator clearing an oop would be similar to calling Reference.clear(),
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    39
    // which would make the reference non-discoverable or silently dropped
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    40
    // by the reference processor.
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    41
    return;
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    42
  }
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    43
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    44
  for (;;) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    45
    if (addr == heal_addr) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    46
      // Already healed
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    47
      return;
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    48
    }
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    49
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    50
    // Heal
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    51
    const uintptr_t prev_addr = Atomic::cmpxchg(heal_addr, (volatile uintptr_t*)p, addr);
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    52
    if (prev_addr == addr) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    53
      // Success
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    54
      return;
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    55
    }
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    56
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    57
    if (ZAddress::is_good_or_null(prev_addr)) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    58
      // No need to heal
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    59
      return;
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    60
    }
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    61
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    62
    // The oop location was healed by another barrier, but it is still not
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    63
    // good or null. Re-apply healing to make sure the oop is not left with
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    64
    // weaker (remapped or finalizable) metadata bits than what this barrier
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    65
    // tried to apply.
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    66
    assert(ZAddress::offset(prev_addr) == ZAddress::offset(heal_addr), "Invalid offset");
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    67
    addr = prev_addr;
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    68
  }
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    69
}
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    70
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    71
template <ZBarrierFastPath fast_path, ZBarrierSlowPath slow_path>
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    72
inline oop ZBarrier::barrier(volatile oop* p, oop o) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    73
  uintptr_t addr = ZOop::to_address(o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    74
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    75
  // Fast path
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    76
  if (fast_path(addr)) {
54488
25199b48f34f 8221984: ZGC: Clean up ZOop
pliden
parents: 52939
diff changeset
    77
    return ZOop::from_address(addr);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    78
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    79
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    80
  // Slow path
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    81
  const uintptr_t good_addr = slow_path(addr);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    82
59040
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    83
  if (p != NULL) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
    84
    self_heal(p, addr, good_addr);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    85
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    86
54488
25199b48f34f 8221984: ZGC: Clean up ZOop
pliden
parents: 52939
diff changeset
    87
  return ZOop::from_address(good_addr);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    88
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    89
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    90
template <ZBarrierFastPath fast_path, ZBarrierSlowPath slow_path>
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    91
inline oop ZBarrier::weak_barrier(volatile oop* p, oop o) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    92
  const uintptr_t addr = ZOop::to_address(o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    93
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    94
  // Fast path
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    95
  if (fast_path(addr)) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    96
    // Return the good address instead of the weak good address
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    97
    // to ensure that the currently active heap view is used.
54488
25199b48f34f 8221984: ZGC: Clean up ZOop
pliden
parents: 52939
diff changeset
    98
    return ZOop::from_address(ZAddress::good_or_null(addr));
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    99
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   100
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   101
  // Slow path
59040
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   102
  const uintptr_t good_addr = slow_path(addr);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   103
59040
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   104
  if (p != NULL) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   105
    // The slow path returns a good/marked address or null, but we never mark
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   106
    // oops in a weak load barrier so we always heal with the remapped address.
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   107
    self_heal(p, addr, ZAddress::remapped_or_null(good_addr));
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   108
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   109
54488
25199b48f34f 8221984: ZGC: Clean up ZOop
pliden
parents: 52939
diff changeset
   110
  return ZOop::from_address(good_addr);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   111
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   112
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   113
template <ZBarrierFastPath fast_path, ZBarrierSlowPath slow_path>
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   114
inline void ZBarrier::root_barrier(oop* p, oop o) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   115
  const uintptr_t addr = ZOop::to_address(o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   116
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   117
  // Fast path
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   118
  if (fast_path(addr)) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   119
    return;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   120
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   121
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   122
  // Slow path
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   123
  const uintptr_t good_addr = slow_path(addr);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   124
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   125
  // Non-atomic healing helps speed up root scanning. This is safe to do
52939
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   126
  // since we are always healing roots in a safepoint, or under a lock,
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   127
  // which ensures we are never racing with mutators modifying roots while
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   128
  // we are healing them. It's also safe in case multiple GC threads try
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   129
  // to heal the same root if it is aligned, since they would always heal
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   130
  // the root in the same way and it does not matter in which order it
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   131
  // happens. For misaligned oops, there needs to be mutual exclusion.
54488
25199b48f34f 8221984: ZGC: Clean up ZOop
pliden
parents: 52939
diff changeset
   132
  *p = ZOop::from_address(good_addr);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   133
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   134
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   135
inline bool ZBarrier::is_null_fast_path(uintptr_t addr) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   136
  return ZAddress::is_null(addr);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   137
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   138
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   139
inline bool ZBarrier::is_good_or_null_fast_path(uintptr_t addr) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   140
  return ZAddress::is_good_or_null(addr);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   141
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   142
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   143
inline bool ZBarrier::is_weak_good_or_null_fast_path(uintptr_t addr) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   144
  return ZAddress::is_weak_good_or_null(addr);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   145
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   146
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   147
//
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   148
// Load barrier
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   149
//
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   150
inline oop ZBarrier::load_barrier_on_oop(oop o) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   151
  return load_barrier_on_oop_field_preloaded((oop*)NULL, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   152
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   153
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   154
inline oop ZBarrier::load_barrier_on_oop_field(volatile oop* p) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   155
  const oop o = *p;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   156
  return load_barrier_on_oop_field_preloaded(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   157
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   158
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   159
inline oop ZBarrier::load_barrier_on_oop_field_preloaded(volatile oop* p, oop o) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   160
  return barrier<is_good_or_null_fast_path, load_barrier_on_oop_slow_path>(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   161
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   162
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   163
inline void ZBarrier::load_barrier_on_oop_array(volatile oop* p, size_t length) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   164
  for (volatile const oop* const end = p + length; p < end; p++) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   165
    load_barrier_on_oop_field(p);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   166
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   167
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   168
55555
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   169
// ON_WEAK barriers should only ever be applied to j.l.r.Reference.referents.
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   170
inline void verify_on_weak(volatile oop* referent_addr) {
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   171
#ifdef ASSERT
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   172
  if (referent_addr != NULL) {
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   173
    uintptr_t base = (uintptr_t)referent_addr - java_lang_ref_Reference::referent_offset;
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   174
    oop obj = cast_to_oop(base);
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   175
    assert(oopDesc::is_oop(obj), "Verification failed for: ref " PTR_FORMAT " obj: " PTR_FORMAT, (uintptr_t)referent_addr, base);
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   176
    assert(java_lang_ref_Reference::is_referent_field(obj, java_lang_ref_Reference::referent_offset), "Sanity");
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   177
  }
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   178
#endif
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   179
}
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   180
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   181
inline oop ZBarrier::load_barrier_on_weak_oop_field_preloaded(volatile oop* p, oop o) {
55555
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   182
  verify_on_weak(p);
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   183
59040
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   184
  if (ZResurrection::is_blocked()) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   185
    return barrier<is_good_or_null_fast_path, weak_load_barrier_on_weak_oop_slow_path>(p, o);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   186
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   187
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   188
  return load_barrier_on_oop_field_preloaded(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   189
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   190
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   191
inline oop ZBarrier::load_barrier_on_phantom_oop_field_preloaded(volatile oop* p, oop o) {
59040
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   192
  if (ZResurrection::is_blocked()) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   193
    return barrier<is_good_or_null_fast_path, weak_load_barrier_on_phantom_oop_slow_path>(p, o);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   194
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   195
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   196
  return load_barrier_on_oop_field_preloaded(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   197
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   198
52939
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   199
inline void ZBarrier::load_barrier_on_root_oop_field(oop* p) {
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   200
  const oop o = *p;
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   201
  root_barrier<is_good_or_null_fast_path, load_barrier_on_oop_slow_path>(p, o);
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   202
}
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   203
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   204
//
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   205
// Weak load barrier
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   206
//
50622
21b96ce2ed10 8205163: ZGC: Keeps finalizable marked PhantomReference referents strongly alive
stefank
parents: 50525
diff changeset
   207
inline oop ZBarrier::weak_load_barrier_on_oop_field(volatile oop* p) {
21b96ce2ed10 8205163: ZGC: Keeps finalizable marked PhantomReference referents strongly alive
stefank
parents: 50525
diff changeset
   208
  assert(!ZResurrection::is_blocked(), "Should not be called during resurrection blocked phase");
21b96ce2ed10 8205163: ZGC: Keeps finalizable marked PhantomReference referents strongly alive
stefank
parents: 50525
diff changeset
   209
  const oop o = *p;
21b96ce2ed10 8205163: ZGC: Keeps finalizable marked PhantomReference referents strongly alive
stefank
parents: 50525
diff changeset
   210
  return weak_load_barrier_on_oop_field_preloaded(p, o);
21b96ce2ed10 8205163: ZGC: Keeps finalizable marked PhantomReference referents strongly alive
stefank
parents: 50525
diff changeset
   211
}
21b96ce2ed10 8205163: ZGC: Keeps finalizable marked PhantomReference referents strongly alive
stefank
parents: 50525
diff changeset
   212
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   213
inline oop ZBarrier::weak_load_barrier_on_oop_field_preloaded(volatile oop* p, oop o) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   214
  return weak_barrier<is_weak_good_or_null_fast_path, weak_load_barrier_on_oop_slow_path>(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   215
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   216
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   217
inline oop ZBarrier::weak_load_barrier_on_weak_oop(oop o) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   218
  return weak_load_barrier_on_weak_oop_field_preloaded((oop*)NULL, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   219
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   220
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   221
inline oop ZBarrier::weak_load_barrier_on_weak_oop_field(volatile oop* p) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   222
  const oop o = *p;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   223
  return weak_load_barrier_on_weak_oop_field_preloaded(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   224
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   225
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   226
inline oop ZBarrier::weak_load_barrier_on_weak_oop_field_preloaded(volatile oop* p, oop o) {
55555
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   227
  verify_on_weak(p);
9a5e9537fe1a 8227085: ZGC: Add on_weak load barrier verification
stefank
parents: 54488
diff changeset
   228
59040
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   229
  if (ZResurrection::is_blocked()) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   230
    return barrier<is_good_or_null_fast_path, weak_load_barrier_on_weak_oop_slow_path>(p, o);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   231
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   232
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   233
  return weak_load_barrier_on_oop_field_preloaded(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   234
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   235
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   236
inline oop ZBarrier::weak_load_barrier_on_phantom_oop(oop o) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   237
  return weak_load_barrier_on_phantom_oop_field_preloaded((oop*)NULL, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   238
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   239
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   240
inline oop ZBarrier::weak_load_barrier_on_phantom_oop_field(volatile oop* p) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   241
  const oop o = *p;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   242
  return weak_load_barrier_on_phantom_oop_field_preloaded(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   243
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   244
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   245
inline oop ZBarrier::weak_load_barrier_on_phantom_oop_field_preloaded(volatile oop* p, oop o) {
59040
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   246
  if (ZResurrection::is_blocked()) {
1251d78fafbf 8230661: ZGC: Stop reloading oops in load barriers
eosterlund
parents: 58958
diff changeset
   247
    return barrier<is_good_or_null_fast_path, weak_load_barrier_on_phantom_oop_slow_path>(p, o);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   248
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   249
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   250
  return weak_load_barrier_on_oop_field_preloaded(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   251
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   252
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   253
//
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   254
// Is alive barrier
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   255
//
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   256
inline bool ZBarrier::is_alive_barrier_on_weak_oop(oop o) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   257
  // Check if oop is logically non-null. This operation
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   258
  // is only valid when resurrection is blocked.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   259
  assert(ZResurrection::is_blocked(), "Invalid phase");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   260
  return weak_load_barrier_on_weak_oop(o) != NULL;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   261
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   262
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   263
inline bool ZBarrier::is_alive_barrier_on_phantom_oop(oop o) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   264
  // Check if oop is logically non-null. This operation
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   265
  // is only valid when resurrection is blocked.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   266
  assert(ZResurrection::is_blocked(), "Invalid phase");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   267
  return weak_load_barrier_on_phantom_oop(o) != NULL;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   268
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   269
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   270
//
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   271
// Keep alive barrier
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   272
//
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   273
inline void ZBarrier::keep_alive_barrier_on_weak_oop_field(volatile oop* p) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   274
  // This operation is only valid when resurrection is blocked.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   275
  assert(ZResurrection::is_blocked(), "Invalid phase");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   276
  const oop o = *p;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   277
  barrier<is_good_or_null_fast_path, keep_alive_barrier_on_weak_oop_slow_path>(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   278
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   279
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   280
inline void ZBarrier::keep_alive_barrier_on_phantom_oop_field(volatile oop* p) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   281
  // This operation is only valid when resurrection is blocked.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   282
  assert(ZResurrection::is_blocked(), "Invalid phase");
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   283
  const oop o = *p;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   284
  barrier<is_good_or_null_fast_path, keep_alive_barrier_on_phantom_oop_slow_path>(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   285
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   286
52939
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   287
inline void ZBarrier::keep_alive_barrier_on_phantom_root_oop_field(oop* p) {
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   288
  // This operation is only valid when resurrection is blocked.
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   289
  assert(ZResurrection::is_blocked(), "Invalid phase");
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   290
  const oop o = *p;
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   291
  root_barrier<is_good_or_null_fast_path, keep_alive_barrier_on_phantom_oop_slow_path>(p, o);
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   292
}
9a8585f60c32 8214897: ZGC: Concurrent Class Unloading
eosterlund
parents: 50622
diff changeset
   293
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   294
//
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   295
// Mark barrier
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   296
//
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   297
inline void ZBarrier::mark_barrier_on_oop_field(volatile oop* p, bool finalizable) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   298
  // The fast path only checks for null since the GC worker
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   299
  // threads doing marking wants to mark through good oops.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   300
  const oop o = *p;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   301
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   302
  if (finalizable) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   303
    barrier<is_null_fast_path, mark_barrier_on_finalizable_oop_slow_path>(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   304
  } else {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   305
    barrier<is_null_fast_path, mark_barrier_on_oop_slow_path>(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   306
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   307
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   308
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   309
inline void ZBarrier::mark_barrier_on_oop_array(volatile oop* p, size_t length, bool finalizable) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   310
  for (volatile const oop* const end = p + length; p < end; p++) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   311
    mark_barrier_on_oop_field(p, finalizable);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   312
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   313
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   314
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   315
inline void ZBarrier::mark_barrier_on_root_oop_field(oop* p) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   316
  const oop o = *p;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   317
  root_barrier<is_good_or_null_fast_path, mark_barrier_on_root_oop_slow_path>(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   318
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   319
58066
8407928b9fe5 8230566: ZGC: Don't substitute klass pointer during array clearing
pliden
parents: 55555
diff changeset
   320
inline void ZBarrier::mark_barrier_on_invisible_root_oop_field(oop* p) {
8407928b9fe5 8230566: ZGC: Don't substitute klass pointer during array clearing
pliden
parents: 55555
diff changeset
   321
  const oop o = *p;
8407928b9fe5 8230566: ZGC: Don't substitute klass pointer during array clearing
pliden
parents: 55555
diff changeset
   322
  root_barrier<is_good_or_null_fast_path, mark_barrier_on_invisible_root_oop_slow_path>(p, o);
8407928b9fe5 8230566: ZGC: Don't substitute klass pointer during array clearing
pliden
parents: 55555
diff changeset
   323
}
8407928b9fe5 8230566: ZGC: Don't substitute klass pointer during array clearing
pliden
parents: 55555
diff changeset
   324
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   325
//
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   326
// Relocate barrier
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   327
//
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   328
inline void ZBarrier::relocate_barrier_on_root_oop_field(oop* p) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   329
  const oop o = *p;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   330
  root_barrier<is_good_or_null_fast_path, relocate_barrier_on_root_oop_slow_path>(p, o);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   331
}
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   332
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   333
#endif // SHARE_GC_Z_ZBARRIER_INLINE_HPP