hotspot/src/share/vm/memory/barrierSet.hpp
author ysr
Thu, 03 Dec 2009 15:01:57 -0800
changeset 4461 c17c526d36ef
parent 3262 30d1c247fc25
child 4886 a2f9a66475b3
permissions -rw-r--r--
6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
670
ddf3e9583f2f 6719955: Update copyright year
xdono
parents: 360
diff changeset
     2
 * Copyright 2000-2008 Sun Microsystems, Inc.  All Rights Reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    21
 * have any questions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
// This class provides the interface between a barrier implementation and
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
// the rest of the system.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
class BarrierSet: public CHeapObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
  enum Name {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
    ModRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
    CardTableModRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
    CardTableExtension,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    35
    G1SATBCT,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    36
    G1SATBCTLogging,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
    Other,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
    Uninit
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  int _max_covered_regions;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  Name _kind;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    47
  BarrierSet() { _kind = Uninit; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  // To get around prohibition on RTTI.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    49
  BarrierSet::Name kind() { return _kind; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  virtual bool is_a(BarrierSet::Name bsn) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  // These operations indicate what kind of barriers the BarrierSet has.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  virtual bool has_read_ref_barrier() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  virtual bool has_read_prim_barrier() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  virtual bool has_write_ref_barrier() = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    56
  virtual bool has_write_ref_pre_barrier() = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  virtual bool has_write_prim_barrier() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  // These functions indicate whether a particular access of the given
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  // kinds requires a barrier.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    61
  virtual bool read_ref_needs_barrier(void* field) = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  virtual bool read_prim_needs_barrier(HeapWord* field, size_t bytes) = 0;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    63
  virtual bool write_ref_needs_barrier(void* field, oop new_val) = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    64
  virtual bool write_prim_needs_barrier(HeapWord* field, size_t bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    65
                                        juint val1, juint val2) = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  // The first four operations provide a direct implementation of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  // barrier set.  An interpreter loop, for example, could call these
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  // directly, as appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  // Invoke the barrier, if any, necessary when reading the given ref field.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    72
  virtual void read_ref_field(void* field) = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  // Invoke the barrier, if any, necessary when reading the given primitive
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  // "field" of "bytes" bytes in "obj".
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  virtual void read_prim_field(HeapWord* field, size_t bytes) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // Invoke the barrier, if any, necessary when writing "new_val" into the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  // ref field at "offset" in "obj".
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // (For efficiency reasons, this operation is specialized for certain
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  // barrier types.  Semantically, it should be thought of as a call to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  // virtual "_work" function below, which must implement the barrier.)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    83
  // First the pre-write versions...
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1388
diff changeset
    84
  template <class T> inline void write_ref_field_pre(T* field, oop new_val);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1388
diff changeset
    85
private:
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1388
diff changeset
    86
  // Keep this private so as to catch violations at build time.
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1388
diff changeset
    87
  virtual void write_ref_field_pre_work(     void* field, oop new_val) { guarantee(false, "Not needed"); };
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    88
protected:
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1388
diff changeset
    89
  virtual void write_ref_field_pre_work(      oop* field, oop new_val) {};
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1388
diff changeset
    90
  virtual void write_ref_field_pre_work(narrowOop* field, oop new_val) {};
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    91
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    92
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    93
  // ...then the post-write version.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    94
  inline void write_ref_field(void* field, oop new_val);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
protected:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    96
  virtual void write_ref_field_work(void* field, oop new_val) = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // Invoke the barrier, if any, necessary when writing the "bytes"-byte
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  // value(s) "val1" (and "val2") into the primitive "field".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  virtual void write_prim_field(HeapWord* field, size_t bytes,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
                                juint val1, juint val2) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  // Operations on arrays, or general regions (e.g., for "clone") may be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // optimized by some barriers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  // The first six operations tell whether such an optimization exists for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  // the particular barrier.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  virtual bool has_read_ref_array_opt() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  virtual bool has_read_prim_array_opt() = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   111
  virtual bool has_write_ref_array_pre_opt() { return true; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  virtual bool has_write_ref_array_opt() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  virtual bool has_write_prim_array_opt() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  virtual bool has_read_region_opt() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  virtual bool has_write_region_opt() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  // These operations should assert false unless the correponding operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  // above returns true.  Otherwise, they should perform an appropriate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  // barrier for an array whose elements are all in the given memory region.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  virtual void read_ref_array(MemRegion mr) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  virtual void read_prim_array(MemRegion mr) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
4461
c17c526d36ef 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 3262
diff changeset
   124
  // Below length is the # array elements being written
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1388
diff changeset
   125
  virtual void write_ref_array_pre(      oop* dst, int length) {}
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1388
diff changeset
   126
  virtual void write_ref_array_pre(narrowOop* dst, int length) {}
4461
c17c526d36ef 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 3262
diff changeset
   127
  // Below MemRegion mr is expected to be HeapWord-aligned
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  inline void write_ref_array(MemRegion mr);
4461
c17c526d36ef 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 3262
diff changeset
   129
  // Below count is the # array elements being written, starting
c17c526d36ef 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 3262
diff changeset
   130
  // at the address "start", which may not necessarily be HeapWord-aligned
c17c526d36ef 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 3262
diff changeset
   131
  inline void write_ref_array(HeapWord* start, size_t count);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   132
4461
c17c526d36ef 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 3262
diff changeset
   133
  // Static versions, suitable for calling from generated code;
c17c526d36ef 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 3262
diff changeset
   134
  // count is # array elements being written, starting with "start",
c17c526d36ef 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 3262
diff changeset
   135
  // which may not necessarily be HeapWord-aligned.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   136
  static void static_write_ref_array_pre(HeapWord* start, size_t count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   137
  static void static_write_ref_array_post(HeapWord* start, size_t count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   138
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  virtual void write_ref_array_work(MemRegion mr) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  virtual void write_prim_array(MemRegion mr) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  virtual void read_region(MemRegion mr) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  // (For efficiency reasons, this operation is specialized for certain
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  // barrier types.  Semantically, it should be thought of as a call to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // virtual "_work" function below, which must implement the barrier.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  inline void write_region(MemRegion mr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  virtual void write_region_work(MemRegion mr) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  // Some barrier sets create tables whose elements correspond to parts of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  // the heap; the CardTableModRefBS is an example.  Such barrier sets will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  // normally reserve space for such tables, and commit parts of the table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  // "covering" parts of the heap that are committed.  The constructor is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  // passed the maximum number of independently committable subregions to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  // be covered, and the "resize_covoered_region" function allows the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  // sub-parts of the heap to inform the barrier set of changes of their
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  // sizes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  BarrierSet(int max_covered_regions) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
    _max_covered_regions(max_covered_regions) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  // Inform the BarrierSet that the the covered heap region that starts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  // with "base" has been changed to have the given size (possibly from 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  // for initialization.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  virtual void resize_covered_region(MemRegion new_region) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  // If the barrier set imposes any alignment restrictions on boundaries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  // within the heap, this function tells whether they are met.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  virtual bool is_aligned(HeapWord* addr) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
};