hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.hpp
author ysr
Thu, 21 Oct 2010 17:29:24 -0700
changeset 6984 c6718f921eb6
parent 5547 f4b087cbb361
child 7397 5b173b4ca846
permissions -rw-r--r--
6992998: CMSWaitDuration=0 causes hangs with +ExplicitGCInvokesConcurrent Summary: Closed a timing hole during which concurrent full gc requests can be missed. The hole can increase the latency of the response to a full gc request by up to the value of CMSWaitDuration. If CMSWaitDuration=0 is, as currently, interpreted as an unbounded wait, suitable in certain tuning scenarios, the application can potentially hang. Made two obscure tunables, including CMSWaitDuration, manageable. Reviewed-by: jcoomes, tonyp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5541
diff changeset
     2
 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
     4
 *
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
     7
 * published by the Free Software Foundation.
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
     8
 *
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    13
 * accompanied this code).
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    14
 *
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5541
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5541
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5541
diff changeset
    21
 * questions.
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    22
 *
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    23
 */
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    24
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    25
// Forward declarations
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    26
class CompactibleFreeListSpace;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    27
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    28
class PromotedObject VALUE_OBJ_CLASS_SPEC {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    29
 private:
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    30
  enum {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    31
    promoted_mask  = right_n_bits(2),   // i.e. 0x3
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    32
    displaced_mark = nth_bit(2),        // i.e. 0x4
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    33
    next_mask      = ~(right_n_bits(3)) // i.e. ~(0x7)
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    34
  };
5541
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    35
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    36
  // Below, we want _narrow_next in the "higher" 32 bit slot,
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    37
  // whose position will depend on endian-ness of the platform.
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    38
  // This is so that there is no interference with the
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    39
  // cms_free_bit occupying bit position 7 (lsb == 0)
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    40
  // when we are using compressed oops; see FreeChunk::isFree().
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    41
  // We cannot move the cms_free_bit down because currently
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    42
  // biased locking code assumes that age bits are contiguous
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    43
  // with the lock bits. Even if that assumption were relaxed,
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    44
  // the least position we could move this bit to would be
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    45
  // to bit position 3, which would require 16 byte alignment.
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    46
  typedef struct {
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    47
#ifdef VM_LITTLE_ENDIAN
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    48
    LP64_ONLY(narrowOop _pad;)
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    49
              narrowOop _narrow_next;
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    50
#else
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    51
              narrowOop _narrow_next;
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    52
    LP64_ONLY(narrowOop _pad;)
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    53
#endif
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    54
  } Data;
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    55
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    56
  union {
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    57
    intptr_t _next;
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    58
    Data     _data;
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    59
  };
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    60
 public:
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    61
  inline PromotedObject* next() const {
5541
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    62
    assert(!((FreeChunk*)this)->isFree(), "Error");
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    63
    PromotedObject* res;
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    64
    if (UseCompressedOops) {
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    65
      // The next pointer is a compressed oop stored in the top 32 bits
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    66
      res = (PromotedObject*)oopDesc::decode_heap_oop(_data._narrow_next);
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    67
    } else {
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    68
      res = (PromotedObject*)(_next & next_mask);
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    69
    }
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    70
    assert(oop(res)->is_oop_or_null(true /* ignore mark word */), "Not an oop?");
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    71
    return res;
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    72
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    73
  inline void setNext(PromotedObject* x) {
5541
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    74
    assert(((intptr_t)x & ~next_mask) == 0, "Conflict in bit usage, "
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    75
           "or insufficient alignment of objects");
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    76
    if (UseCompressedOops) {
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    77
      assert(_data._narrow_next == 0, "Overwrite?");
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    78
      _data._narrow_next = oopDesc::encode_heap_oop(oop(x));
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    79
    } else {
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    80
      _next |= (intptr_t)x;
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    81
    }
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    82
    assert(!((FreeChunk*)this)->isFree(), "Error");
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    83
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    84
  inline void setPromotedMark() {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    85
    _next |= promoted_mask;
5541
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    86
    assert(!((FreeChunk*)this)->isFree(), "Error");
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    87
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    88
  inline bool hasPromotedMark() const {
5541
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    89
    assert(!((FreeChunk*)this)->isFree(), "Error");
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    90
    return (_next & promoted_mask) == promoted_mask;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    91
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    92
  inline void setDisplacedMark() {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    93
    _next |= displaced_mark;
5541
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    94
    assert(!((FreeChunk*)this)->isFree(), "Error");
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    95
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    96
  inline bool hasDisplacedMark() const {
5541
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
    97
    assert(!((FreeChunk*)this)->isFree(), "Error");
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    98
    return (_next & displaced_mark) != 0;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
    99
  }
5541
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
   100
  inline void clearNext()        {
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
   101
    _next = 0;
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
   102
    assert(!((FreeChunk*)this)->isFree(), "Error");
19c39d42a747 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 5434
diff changeset
   103
  }
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   104
  debug_only(void *next_addr() { return (void *) &_next; })
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   105
};
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   106
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   107
class SpoolBlock: public FreeChunk {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   108
  friend class PromotionInfo;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   109
 protected:
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   110
  SpoolBlock*  nextSpoolBlock;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   111
  size_t       bufferSize;        // number of usable words in this block
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   112
  markOop*     displacedHdr;      // the displaced headers start here
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   113
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   114
  // Note about bufferSize: it denotes the number of entries available plus 1;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   115
  // legal indices range from 1 through BufferSize - 1.  See the verification
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   116
  // code verify() that counts the number of displaced headers spooled.
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   117
  size_t computeBufferSize() {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   118
    return (size() * sizeof(HeapWord) - sizeof(*this)) / sizeof(markOop);
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   119
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   120
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   121
 public:
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   122
  void init() {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   123
    bufferSize = computeBufferSize();
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   124
    displacedHdr = (markOop*)&displacedHdr;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   125
    nextSpoolBlock = NULL;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   126
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   127
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   128
  void print_on(outputStream* st) const;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   129
  void print() const { print_on(gclog_or_tty); }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   130
};
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   131
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   132
class PromotionInfo VALUE_OBJ_CLASS_SPEC {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   133
  bool            _tracking;      // set if tracking
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   134
  CompactibleFreeListSpace* _space; // the space to which this belongs
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   135
  PromotedObject* _promoHead;     // head of list of promoted objects
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   136
  PromotedObject* _promoTail;     // tail of list of promoted objects
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   137
  SpoolBlock*     _spoolHead;     // first spooling block
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   138
  SpoolBlock*     _spoolTail;     // last  non-full spooling block or null
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   139
  SpoolBlock*     _splice_point;  // when _spoolTail is null, holds list tail
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   140
  SpoolBlock*     _spareSpool;    // free spool buffer
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   141
  size_t          _firstIndex;    // first active index in
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   142
                                  // first spooling block (_spoolHead)
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   143
  size_t          _nextIndex;     // last active index + 1 in last
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   144
                                  // spooling block (_spoolTail)
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   145
 private:
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   146
  // ensure that spooling space exists; return true if there is spooling space
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   147
  bool ensure_spooling_space_work();
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   148
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   149
 public:
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   150
  PromotionInfo() :
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   151
    _tracking(0), _space(NULL),
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   152
    _promoHead(NULL), _promoTail(NULL),
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   153
    _spoolHead(NULL), _spoolTail(NULL),
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   154
    _spareSpool(NULL), _firstIndex(1),
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   155
    _nextIndex(1) {}
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   156
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   157
  bool noPromotions() const {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   158
    assert(_promoHead != NULL || _promoTail == NULL, "list inconsistency");
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   159
    return _promoHead == NULL;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   160
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   161
  void startTrackingPromotions();
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   162
  void stopTrackingPromotions(uint worker_id = 0);
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   163
  bool tracking() const          { return _tracking;  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   164
  void track(PromotedObject* trackOop);      // keep track of a promoted oop
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   165
  // The following variant must be used when trackOop is not fully
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   166
  // initialized and has a NULL klass:
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   167
  void track(PromotedObject* trackOop, klassOop klassOfOop); // keep track of a promoted oop
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   168
  void setSpace(CompactibleFreeListSpace* sp) { _space = sp; }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   169
  CompactibleFreeListSpace* space() const     { return _space; }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   170
  markOop nextDisplacedHeader(); // get next header & forward spool pointer
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   171
  void    saveDisplacedHeader(markOop hdr);
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   172
                                 // save header and forward spool
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   173
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   174
  inline size_t refillSize() const;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   175
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   176
  SpoolBlock* getSpoolBlock();   // return a free spooling block
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   177
  inline bool has_spooling_space() {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   178
    return _spoolTail != NULL && _spoolTail->bufferSize > _nextIndex;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   179
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   180
  // ensure that spooling space exists
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   181
  bool ensure_spooling_space() {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   182
    return has_spooling_space() || ensure_spooling_space_work();
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   183
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   184
  #define PROMOTED_OOPS_ITERATE_DECL(OopClosureType, nv_suffix)  \
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   185
    void promoted_oops_iterate##nv_suffix(OopClosureType* cl);
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   186
  ALL_SINCE_SAVE_MARKS_CLOSURES(PROMOTED_OOPS_ITERATE_DECL)
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   187
  #undef PROMOTED_OOPS_ITERATE_DECL
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   188
  void promoted_oops_iterate(OopsInGenClosure* cl) {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   189
    promoted_oops_iterate_v(cl);
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   190
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   191
  void verify()  const;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   192
  void reset() {
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   193
    _promoHead = NULL;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   194
    _promoTail = NULL;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   195
    _spoolHead = NULL;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   196
    _spoolTail = NULL;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   197
    _spareSpool = NULL;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   198
    _firstIndex = 0;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   199
    _nextIndex = 0;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   200
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   201
  }
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   202
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   203
  void print_on(outputStream* st) const;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   204
  void print_statistics(uint worker_id) const;
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   205
};
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents:
diff changeset
   206