hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp
author tonyp
Wed, 19 Jan 2011 09:35:17 -0500
changeset 7920 298df61588a2
parent 7397 5b173b4ca846
child 10565 dc90c239f4ec
permissions -rw-r--r--
7011379: G1: overly long concurrent marking cycles Summary: This changeset introduces filtering of SATB buffers at the point when they are about to be enqueued. If this filtering clears enough entries on each buffer, the buffer can then be re-used and not enqueued. This cuts down the number of SATB buffers that need to be processed by the concurrent marking threads. Reviewed-by: johnc, ysr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     1
/*
7920
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
     2
 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     4
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     7
 * published by the Free Software Foundation.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     8
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    13
 * accompanied this code).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    14
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5082
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5082
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: 5082
diff changeset
    21
 * questions.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    22
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    23
 */
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#include "gc_implementation/g1/ptrQueue.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "runtime/mutex.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "runtime/mutexLocker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
# include "thread_linux.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    35
# include "thread_solaris.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    36
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    37
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    38
# include "thread_windows.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    39
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    40
7920
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
    41
PtrQueue::PtrQueue(PtrQueueSet* qset, bool perm, bool active) :
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
    42
  _qset(qset), _buf(NULL), _index(0), _active(active),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    43
  _perm(perm), _lock(NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    44
{}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    45
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1374
diff changeset
    46
void PtrQueue::flush() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    47
  if (!_perm && _buf != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    48
    if (_index == _sz) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    49
      // No work to do.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    50
      qset()->deallocate_buffer(_buf);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    51
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    52
      // We must NULL out the unused entries, then enqueue.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    53
      for (size_t i = 0; i < _index; i += oopSize) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    54
        _buf[byte_index_to_index((int)i)] = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
      qset()->enqueue_complete_buffer(_buf);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
    }
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1374
diff changeset
    58
    _buf = NULL;
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1374
diff changeset
    59
    _index = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    62
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    63
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
static int byte_index_to_index(int ind) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    65
  assert((ind % oopSize) == 0, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    66
  return ind / oopSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    67
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    68
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    69
static int index_to_byte_index(int byte_ind) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    70
  return byte_ind * oopSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    71
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
void PtrQueue::enqueue_known_active(void* ptr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    74
  assert(0 <= _index && _index <= _sz, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    75
  assert(_index == 0 || _buf != NULL, "invariant");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    76
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
  while (_index == 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    78
    handle_zero_index();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    79
  }
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
    80
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    81
  assert(_index > 0, "postcondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    82
  _index -= oopSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    83
  _buf[byte_index_to_index((int)_index)] = ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    84
  assert(0 <= _index && _index <= _sz, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    85
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    86
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    87
void PtrQueue::locking_enqueue_completed_buffer(void** buf) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    88
  assert(_lock->owned_by_self(), "Required.");
4640
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
    89
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
    90
  // We have to unlock _lock (which may be Shared_DirtyCardQ_lock) before
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
    91
  // we acquire DirtyCardQ_CBL_mon inside enqeue_complete_buffer as they
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
    92
  // have the same rank and we may get the "possible deadlock" message
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    93
  _lock->unlock();
4640
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
    94
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    95
  qset()->enqueue_complete_buffer(buf);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    96
  // We must relock only because the caller will unlock, for the normal
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    97
  // case.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    98
  _lock->lock_without_safepoint_check();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   100
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   101
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   102
PtrQueueSet::PtrQueueSet(bool notify_when_complete) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   103
  _max_completed_queue(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   104
  _cbl_mon(NULL), _fl_lock(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   105
  _notify_when_complete(notify_when_complete),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   106
  _sz(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   107
  _completed_buffers_head(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   108
  _completed_buffers_tail(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   109
  _n_completed_buffers(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   110
  _process_completed_threshold(0), _process_completed(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   111
  _buf_free_list(NULL), _buf_free_list_sz(0)
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   112
{
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   113
  _fl_owner = this;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   114
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   115
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   116
void** PtrQueueSet::allocate_buffer() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   117
  assert(_sz > 0, "Didn't set a buffer size.");
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   118
  MutexLockerEx x(_fl_owner->_fl_lock, Mutex::_no_safepoint_check_flag);
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   119
  if (_fl_owner->_buf_free_list != NULL) {
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   120
    void** res = BufferNode::make_buffer_from_node(_fl_owner->_buf_free_list);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   121
    _fl_owner->_buf_free_list = _fl_owner->_buf_free_list->next();
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   122
    _fl_owner->_buf_free_list_sz--;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   123
    return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   124
  } else {
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   125
    // Allocate space for the BufferNode in front of the buffer.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   126
    char *b =  NEW_C_HEAP_ARRAY(char, _sz + BufferNode::aligned_size());
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   127
    return BufferNode::make_buffer_from_block(b);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   128
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   129
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   130
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   131
void PtrQueueSet::deallocate_buffer(void** buf) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
  assert(_sz > 0, "Didn't set a buffer size.");
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   133
  MutexLockerEx x(_fl_owner->_fl_lock, Mutex::_no_safepoint_check_flag);
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   134
  BufferNode *node = BufferNode::make_node_from_buffer(buf);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   135
  node->set_next(_fl_owner->_buf_free_list);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   136
  _fl_owner->_buf_free_list = node;
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   137
  _fl_owner->_buf_free_list_sz++;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   139
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
void PtrQueueSet::reduce_free_list() {
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   141
  assert(_fl_owner == this, "Free list reduction is allowed only for the owner");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
  // For now we'll adopt the strategy of deleting half.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
  MutexLockerEx x(_fl_lock, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
  size_t n = _buf_free_list_sz / 2;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
  while (n > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   146
    assert(_buf_free_list != NULL, "_buf_free_list_sz must be wrong.");
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   147
    void* b = BufferNode::make_block_from_node(_buf_free_list);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   148
    _buf_free_list = _buf_free_list->next();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   149
    FREE_C_HEAP_ARRAY(char, b);
4454
d27c981064b4 6895788: G1: SATB and update buffer allocation code allocates too much space
johnc
parents: 3261
diff changeset
   150
    _buf_free_list_sz --;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   151
    n--;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   152
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   153
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   154
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   155
void PtrQueue::handle_zero_index() {
7920
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
   156
  assert(_index == 0, "Precondition.");
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
   157
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   158
  // This thread records the full buffer and allocates a new one (while
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   159
  // holding the lock if there is one).
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   160
  if (_buf != NULL) {
7920
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
   161
    if (!should_enqueue_buffer()) {
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
   162
      assert(_index > 0, "the buffer can only be re-used if it's not full");
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
   163
      return;
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
   164
    }
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
   165
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   166
    if (_lock) {
4640
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   167
      assert(_lock->owned_by_self(), "Required.");
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   168
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   169
      // The current PtrQ may be the shared dirty card queue and
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   170
      // may be being manipulated by more than one worker thread
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   171
      // during a pause. Since the enqueuing of the completed
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   172
      // buffer unlocks the Shared_DirtyCardQ_lock more than one
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   173
      // worker thread can 'race' on reading the shared queue attributes
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   174
      // (_buf and _index) and multiple threads can call into this
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   175
      // routine for the same buffer. This will cause the completed
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   176
      // buffer to be added to the CBL multiple times.
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   177
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   178
      // We "claim" the current buffer by caching value of _buf in
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   179
      // a local and clearing the field while holding _lock. When
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   180
      // _lock is released (while enqueueing the completed buffer)
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   181
      // the thread that acquires _lock will skip this code,
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   182
      // preventing the subsequent the multiple enqueue, and
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   183
      // install a newly allocated buffer below.
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   184
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   185
      void** buf = _buf;   // local pointer to completed buffer
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   186
      _buf = NULL;         // clear shared _buf field
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   187
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   188
      locking_enqueue_completed_buffer(buf);  // enqueue completed buffer
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   189
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   190
      // While the current thread was enqueuing the buffer another thread
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   191
      // may have a allocated a new buffer and inserted it into this pointer
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   192
      // queue. If that happens then we just return so that the current
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   193
      // thread doesn't overwrite the buffer allocated by the other thread
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   194
      // and potentially losing some dirtied cards.
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   195
b5edb9b319e4 6915005: G1: Hang in PtrQueueSet::completed_buffers_list_length with gcl001
johnc
parents: 4481
diff changeset
   196
      if (_buf != NULL) return;
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   197
    } else {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   198
      if (qset()->process_or_enqueue_complete_buffer(_buf)) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   199
        // Recycle the buffer. No allocation.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   200
        _sz = qset()->buffer_size();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   201
        _index = _sz;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   202
        return;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   203
      }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   204
    }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   205
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   206
  // Reallocate the buffer
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   207
  _buf = qset()->allocate_buffer();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   208
  _sz = qset()->buffer_size();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   209
  _index = _sz;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   210
  assert(0 <= _index && _index <= _sz, "Invariant.");
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   211
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   213
bool PtrQueueSet::process_or_enqueue_complete_buffer(void** buf) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   214
  if (Thread::current()->is_Java_thread()) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   215
    // We don't lock. It is fine to be epsilon-precise here.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   216
    if (_max_completed_queue == 0 || _max_completed_queue > 0 &&
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   217
        _n_completed_buffers >= _max_completed_queue + _completed_queue_padding) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   218
      bool b = mut_process_buffer(buf);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   219
      if (b) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   220
        // True here means that the buffer hasn't been deallocated and the caller may reuse it.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   221
        return true;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   222
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   223
    }
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   224
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   225
  // The buffer will be enqueued. The caller will have to get a new one.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   226
  enqueue_complete_buffer(buf);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   227
  return false;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   228
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   230
void PtrQueueSet::enqueue_complete_buffer(void** buf, size_t index) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   231
  MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   232
  BufferNode* cbn = BufferNode::new_from_buffer(buf);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   233
  cbn->set_index(index);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   234
  if (_completed_buffers_tail == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   235
    assert(_completed_buffers_head == NULL, "Well-formedness");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
    _completed_buffers_head = cbn;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
    _completed_buffers_tail = cbn;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   238
  } else {
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   239
    _completed_buffers_tail->set_next(cbn);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
    _completed_buffers_tail = cbn;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   241
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   242
  _n_completed_buffers++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   243
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   244
  if (!_process_completed && _process_completed_threshold >= 0 &&
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2142
diff changeset
   245
      _n_completed_buffers >= _process_completed_threshold) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   246
    _process_completed = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   247
    if (_notify_when_complete)
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   248
      _cbl_mon->notify();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   249
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   250
  debug_only(assert_completed_buffer_list_len_correct_locked());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   251
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   252
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   253
int PtrQueueSet::completed_buffers_list_length() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   254
  int n = 0;
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   255
  BufferNode* cbn = _completed_buffers_head;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   256
  while (cbn != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   257
    n++;
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   258
    cbn = cbn->next();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   259
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   260
  return n;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   261
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   262
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   263
void PtrQueueSet::assert_completed_buffer_list_len_correct() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   264
  MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   265
  assert_completed_buffer_list_len_correct_locked();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   266
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   267
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   268
void PtrQueueSet::assert_completed_buffer_list_len_correct_locked() {
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   269
  guarantee(completed_buffers_list_length() ==  _n_completed_buffers,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   270
            "Completed buffer length is wrong.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   271
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   272
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   273
void PtrQueueSet::set_buffer_size(size_t sz) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   274
  assert(_sz == 0 && sz > 0, "Should be called only once.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   275
  _sz = sz * oopSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   276
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   277
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   278
// Merge lists of buffers. Notify the processing threads.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   279
// The source queue is emptied as a result. The queues
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   280
// must share the monitor.
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   281
void PtrQueueSet::merge_bufferlists(PtrQueueSet *src) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   282
  assert(_cbl_mon == src->_cbl_mon, "Should share the same lock");
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   283
  MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   284
  if (_completed_buffers_tail == NULL) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   285
    assert(_completed_buffers_head == NULL, "Well-formedness");
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   286
    _completed_buffers_head = src->_completed_buffers_head;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   287
    _completed_buffers_tail = src->_completed_buffers_tail;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   288
  } else {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   289
    assert(_completed_buffers_head != NULL, "Well formedness");
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   290
    if (src->_completed_buffers_head != NULL) {
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   291
      _completed_buffers_tail->set_next(src->_completed_buffers_head);
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   292
      _completed_buffers_tail = src->_completed_buffers_tail;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   293
    }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   294
  }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   295
  _n_completed_buffers += src->_n_completed_buffers;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   296
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   297
  src->_n_completed_buffers = 0;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   298
  src->_completed_buffers_head = NULL;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   299
  src->_completed_buffers_tail = NULL;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   300
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   301
  assert(_completed_buffers_head == NULL && _completed_buffers_tail == NULL ||
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   302
         _completed_buffers_head != NULL && _completed_buffers_tail != NULL,
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   303
         "Sanity");
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   304
}
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   305
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   306
void PtrQueueSet::notify_if_necessary() {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   307
  MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   308
  if (_n_completed_buffers >= _process_completed_threshold || _max_completed_queue == 0) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   309
    _process_completed = true;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   310
    if (_notify_when_complete)
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4454
diff changeset
   311
      _cbl_mon->notify();
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   312
  }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 1623
diff changeset
   313
}