src/hotspot/share/gc/shared/cardTableModRefBSForCTRS.hpp
author sjohanss
Thu, 21 Sep 2017 14:32:05 +0200
changeset 47546 64ba55ba8516
parent 47216 71c04702a3d5
child 47998 fb0275c320a0
permissions -rw-r--r--
8184286: print_tracing_info() does not use Unified Logging for output Reviewed-by: ehelin, sangheki
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31964
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
     1
/*
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
     2
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
     4
 *
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
     7
 * published by the Free Software Foundation.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
     8
 *
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    13
 * accompanied this code).
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    14
 *
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    18
 *
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    21
 * questions.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    22
 *
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    23
 */
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    24
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    25
#ifndef SHARE_VM_GC_SHARED_CARDTABLEMODREFBSFORCTRS_HPP
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    26
#define SHARE_VM_GC_SHARED_CARDTABLEMODREFBSFORCTRS_HPP
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    27
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    28
#include "gc/shared/cardTableModRefBS.hpp"
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    29
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    30
class CardTableRS;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    31
class DirtyCardToOopClosure;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    32
class OopsInGenClosure;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    33
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    34
// A specialization for the CardTableRS gen rem set.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    35
class CardTableModRefBSForCTRS: public CardTableModRefBS {
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    36
  friend class CardTableRS;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    37
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    38
public:
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    39
  CardTableModRefBSForCTRS(MemRegion whole_heap);
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    40
  ~CardTableModRefBSForCTRS();
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    41
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    42
  virtual void initialize();
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    43
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    44
  void set_CTRS(CardTableRS* rs) { _rs = rs; }
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    45
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    46
private:
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    47
  CardTableRS* _rs;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    48
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    49
  // *** Support for parallel card scanning.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    50
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    51
  // dirty and precleaned are equivalent wrt younger_refs_iter.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    52
  static bool card_is_dirty_wrt_gen_iter(jbyte cv) {
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    53
    return cv == dirty_card || cv == precleaned_card;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    54
  }
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    55
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    56
  // Returns "true" iff the value "cv" will cause the card containing it
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    57
  // to be scanned in the current traversal.  May be overridden by
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    58
  // subtypes.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    59
  bool card_will_be_scanned(jbyte cv);
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    60
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    61
  // Returns "true" iff the value "cv" may have represented a dirty card at
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    62
  // some point.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    63
  bool card_may_have_been_dirty(jbyte cv);
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    64
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    65
  // Iterate over the portion of the card-table which covers the given
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    66
  // region mr in the given space and apply cl to any dirty sub-regions
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    67
  // of mr. Clears the dirty cards as they are processed.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    68
  void non_clean_card_iterate_possibly_parallel(Space* sp, MemRegion mr,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    69
                                                OopsInGenClosure* cl, CardTableRS* ct,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    70
                                                uint n_threads);
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    71
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    72
  // Work method used to implement non_clean_card_iterate_possibly_parallel()
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    73
  // above in the parallel case.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    74
  void non_clean_card_iterate_parallel_work(Space* sp, MemRegion mr,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    75
                                            OopsInGenClosure* cl, CardTableRS* ct,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    76
                                            uint n_threads);
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    77
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    78
  // This is an array, one element per covered region of the card table.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    79
  // Each entry is itself an array, with one element per chunk in the
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    80
  // covered region.  Each entry of these arrays is the lowest non-clean
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    81
  // card of the corresponding chunk containing part of an object from the
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    82
  // previous chunk, or else NULL.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    83
  typedef jbyte*  CardPtr;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    84
  typedef CardPtr* CardArr;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    85
  CardArr* _lowest_non_clean;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    86
  size_t*  _lowest_non_clean_chunk_size;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    87
  uintptr_t* _lowest_non_clean_base_chunk_index;
42632
c4f00b77b6d4 8170409: CMS: Crash in CardTableModRefBSForCTRS::process_chunk_boundaries
simonis
parents: 31964
diff changeset
    88
  volatile int* _last_LNC_resizing_collection;
31964
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    89
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    90
  // Initializes "lowest_non_clean" to point to the array for the region
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    91
  // covering "sp", and "lowest_non_clean_base_chunk_index" to the chunk
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    92
  // index of the corresponding to the first element of that array.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    93
  // Ensures that these arrays are of sufficient size, allocating if necessary.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    94
  // May be called by several threads concurrently.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    95
  void get_LNC_array_for_space(Space* sp,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    96
                               jbyte**& lowest_non_clean,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    97
                               uintptr_t& lowest_non_clean_base_chunk_index,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    98
                               size_t& lowest_non_clean_chunk_size);
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
    99
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   100
  // Returns the number of chunks necessary to cover "mr".
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   101
  size_t chunks_to_cover(MemRegion mr) {
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   102
    return (size_t)(addr_to_chunk_index(mr.last()) -
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   103
                    addr_to_chunk_index(mr.start()) + 1);
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   104
  }
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   105
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   106
  // Returns the index of the chunk in a stride which
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   107
  // covers the given address.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   108
  uintptr_t addr_to_chunk_index(const void* addr) {
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   109
    uintptr_t card = (uintptr_t) byte_for(addr);
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   110
    return card / ParGCCardsPerStrideChunk;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   111
  }
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   112
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   113
  // Apply cl, which must either itself apply dcto_cl or be dcto_cl,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   114
  // to the cards in the stride (of n_strides) within the given space.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   115
  void process_stride(Space* sp,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   116
                      MemRegion used,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   117
                      jint stride, int n_strides,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   118
                      OopsInGenClosure* cl,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   119
                      CardTableRS* ct,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   120
                      jbyte** lowest_non_clean,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   121
                      uintptr_t lowest_non_clean_base_chunk_index,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   122
                      size_t lowest_non_clean_chunk_size);
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   123
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   124
  // Makes sure that chunk boundaries are handled appropriately, by
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   125
  // adjusting the min_done of dcto_cl, and by using a special card-table
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   126
  // value to indicate how min_done should be set.
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   127
  void process_chunk_boundaries(Space* sp,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   128
                                DirtyCardToOopClosure* dcto_cl,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   129
                                MemRegion chunk_mr,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   130
                                MemRegion used,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   131
                                jbyte** lowest_non_clean,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   132
                                uintptr_t lowest_non_clean_base_chunk_index,
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   133
                                size_t    lowest_non_clean_chunk_size);
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   134
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   135
};
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   136
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   137
template<>
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   138
struct BarrierSet::GetName<CardTableModRefBSForCTRS> {
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   139
  static const BarrierSet::Name value = BarrierSet::CardTableForRS;
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   140
};
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   141
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   142
#endif // include guard
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents:
diff changeset
   143