hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp
author tonyp
Wed, 19 Jan 2011 09:35:17 -0500
changeset 7920 298df61588a2
parent 7397 5b173b4ca846
child 11455 a6ab3d8b9a4c
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: 6768
diff changeset
    25
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_PTRQUEUE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6768
diff changeset
    26
#define SHARE_VM_GC_IMPLEMENTATION_G1_PTRQUEUE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6768
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6768
diff changeset
    28
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6768
diff changeset
    29
#include "utilities/sizes.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6768
diff changeset
    30
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    31
// There are various techniques that require threads to be able to log
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    32
// addresses.  For example, a generational write barrier might log
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    33
// the addresses of modified old-generation objects.  This type supports
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    34
// this operation.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    35
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
    36
// The definition of placement operator new(size_t, void*) in the <new>.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
    37
#include <new>
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
    38
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    39
class PtrQueueSet;
2013
49e915da0905 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 1623
diff changeset
    40
class PtrQueue VALUE_OBJ_CLASS_SPEC {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    41
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    42
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    43
  // The ptr queue set to which this queue belongs.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    44
  PtrQueueSet* _qset;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    45
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    46
  // Whether updates should be logged.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    47
  bool _active;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    48
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    49
  // The buffer.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    50
  void** _buf;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    51
  // The index at which an object was last enqueued.  Starts at "_sz"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    52
  // (indicating an empty buffer) and goes towards zero.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    53
  size_t _index;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    54
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
  // The size of the buffer.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
  size_t _sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    58
  // If true, the queue is permanent, and doesn't need to deallocate
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
  // its buffer in the destructor (since that obtains a lock which may not
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
  // be legally locked by then.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
  bool _perm;
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
  // If there is a lock associated with this buffer, this is that lock.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
  Mutex* _lock;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    65
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    66
  PtrQueueSet* qset() { return _qset; }
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
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    69
  // Initialize this queue to contain a null buffer, and be part of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    70
  // given PtrQueueSet.
7920
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
    71
  PtrQueue(PtrQueueSet* qset, bool perm = false, bool active = false);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
  // Release any contained resources.
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1374
diff changeset
    73
  void flush();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1374
diff changeset
    74
  // Calls flush() when destroyed.
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1374
diff changeset
    75
  ~PtrQueue() { flush(); }
1374
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
  // Associate a lock with a ptr queue.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    78
  void set_lock(Mutex* lock) { _lock = lock; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    79
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    80
  void reset() { if (_buf != NULL) _index = _sz; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    81
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    82
  // Enqueues the given "obj".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    83
  void enqueue(void* ptr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    84
    if (!_active) return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    85
    else enqueue_known_active(ptr);
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
7920
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
    88
  // This method is called when we're doing the zero index handling
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
    89
  // and gives a chance to the queues to do any pre-enqueueing
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
    90
  // processing they might want to do on the buffer. It should return
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
    91
  // true if the buffer should be enqueued, or false if enough
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
    92
  // entries were cleared from it so that it can be re-used. It should
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
    93
  // not return false if the buffer is still full (otherwise we can
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
    94
  // get into an infinite loop).
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7397
diff changeset
    95
  virtual bool should_enqueue_buffer() { return true; }
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
    96
  void handle_zero_index();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    97
  void locking_enqueue_completed_buffer(void** buf);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    98
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
  void enqueue_known_active(void* ptr);
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
  size_t size() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   102
    assert(_sz >= _index, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   103
    return _buf == NULL ? 0 : _sz - _index;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   104
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   105
6768
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 5547
diff changeset
   106
  bool is_empty() {
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 5547
diff changeset
   107
    return _buf == NULL || _sz == _index;
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 5547
diff changeset
   108
  }
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 5547
diff changeset
   109
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   110
  // Set the "active" property of the queue to "b".  An enqueue to an
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   111
  // inactive thread is a no-op.  Setting a queue to inactive resets its
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   112
  // log to the empty state.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   113
  void set_active(bool b) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   114
    _active = b;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   115
    if (!b && _buf != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   116
      _index = _sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   117
    } else if (b && _buf != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   118
      assert(_index == _sz, "invariant: queues are empty when activated.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   119
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   120
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   121
5082
19e725a3d2eb 6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents: 4481
diff changeset
   122
  bool is_active() { return _active; }
19e725a3d2eb 6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents: 4481
diff changeset
   123
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   124
  static int byte_index_to_index(int ind) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   125
    assert((ind % oopSize) == 0, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   126
    return ind / oopSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   127
  }
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
  static int index_to_byte_index(int byte_ind) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   130
    return byte_ind * oopSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   131
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   133
  // To support compiler.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   134
  static ByteSize byte_offset_of_index() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
    return byte_offset_of(PtrQueue, _index);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
  static ByteSize byte_width_of_index() { return in_ByteSize(sizeof(size_t)); }
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
  static ByteSize byte_offset_of_buf() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
    return byte_offset_of(PtrQueue, _buf);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   141
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
  static ByteSize byte_width_of_buf() { return in_ByteSize(sizeof(void*)); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
  static ByteSize byte_offset_of_active() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
    return byte_offset_of(PtrQueue, _active);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   146
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
  static ByteSize byte_width_of_active() { return in_ByteSize(sizeof(bool)); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   149
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   151
class BufferNode {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   152
  size_t _index;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   153
  BufferNode* _next;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   154
public:
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   155
  BufferNode() : _index(0), _next(NULL) { }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   156
  BufferNode* next() const     { return _next;  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   157
  void set_next(BufferNode* n) { _next = n;     }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   158
  size_t index() const         { return _index; }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   159
  void set_index(size_t i)     { _index = i;    }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   160
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   161
  // Align the size of the structure to the size of the pointer
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   162
  static size_t aligned_size() {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   163
    static const size_t alignment = round_to(sizeof(BufferNode), sizeof(void*));
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   164
    return alignment;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   165
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   166
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   167
  // BufferNode is allocated before the buffer.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   168
  // The chunk of memory that holds both of them is a block.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   169
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   170
  // Produce a new BufferNode given a buffer.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   171
  static BufferNode* new_from_buffer(void** buf) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   172
    return new (make_block_from_buffer(buf)) BufferNode;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   173
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   174
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   175
  // The following are the required conversion routines:
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   176
  static BufferNode* make_node_from_buffer(void** buf) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   177
    return (BufferNode*)make_block_from_buffer(buf);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   178
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   179
  static void** make_buffer_from_node(BufferNode *node) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   180
    return make_buffer_from_block(node);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   181
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   182
  static void* make_block_from_node(BufferNode *node) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   183
    return (void*)node;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   184
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   185
  static void** make_buffer_from_block(void* p) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   186
    return (void**)((char*)p + aligned_size());
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   187
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   188
  static void* make_block_from_buffer(void** p) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   189
    return (void*)((char*)p - aligned_size());
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   190
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   191
};
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   192
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   193
// A PtrQueueSet represents resources common to a set of pointer queues.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   194
// In particular, the individual queues allocate buffers from this shared
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
// set, and return completed buffers to the set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
// All these variables are are protected by the TLOQ_CBL_mon. XXX ???
2013
49e915da0905 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 1623
diff changeset
   197
class PtrQueueSet VALUE_OBJ_CLASS_SPEC {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
  Monitor* _cbl_mon;  // Protects the fields below.
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   200
  BufferNode* _completed_buffers_head;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   201
  BufferNode* _completed_buffers_tail;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   202
  int _n_completed_buffers;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   203
  int _process_completed_threshold;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   204
  volatile bool _process_completed;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   205
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
  // This (and the interpretation of the first element as a "next"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   207
  // pointer) are protected by the TLOQ_FL_lock.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
  Mutex* _fl_lock;
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   209
  BufferNode* _buf_free_list;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
  size_t _buf_free_list_sz;
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2013
diff changeset
   211
  // Queue set can share a freelist. The _fl_owner variable
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2013
diff changeset
   212
  // specifies the owner. It is set to "this" by default.
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2013
diff changeset
   213
  PtrQueueSet* _fl_owner;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   214
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   215
  // The size of all buffers in the set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   216
  size_t _sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   217
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   218
  bool _all_active;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   219
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   220
  // If true, notify_all on _cbl_mon when the threshold is reached.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   221
  bool _notify_when_complete;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   222
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   223
  // Maximum number of elements allowed on completed queue: after that,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   224
  // enqueuer does the work itself.  Zero indicates no maximum.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   225
  int _max_completed_queue;
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   226
  int _completed_queue_padding;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   227
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   228
  int completed_buffers_list_length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
  void assert_completed_buffer_list_len_correct_locked();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   230
  void assert_completed_buffer_list_len_correct();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   231
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   232
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   233
  // A mutator thread does the the work of processing a buffer.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   234
  // Returns "true" iff the work is complete (and the buffer may be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   235
  // deallocated).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
  virtual bool mut_process_buffer(void** buf) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
    ShouldNotReachHere();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   238
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   239
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   241
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   242
  // Create an empty ptr queue set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   243
  PtrQueueSet(bool notify_when_complete = false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   244
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   245
  // Because of init-order concerns, we can't pass these as constructor
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   246
  // arguments.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   247
  void initialize(Monitor* cbl_mon, Mutex* fl_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   248
                  int process_completed_threshold,
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   249
                  int max_completed_queue,
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2013
diff changeset
   250
                  PtrQueueSet *fl_owner = NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   251
    _max_completed_queue = max_completed_queue;
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   252
    _process_completed_threshold = process_completed_threshold;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   253
    _completed_queue_padding = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   254
    assert(cbl_mon != NULL && fl_lock != NULL, "Init order issue?");
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2013
diff changeset
   255
    _cbl_mon = cbl_mon;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2013
diff changeset
   256
    _fl_lock = fl_lock;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2013
diff changeset
   257
    _fl_owner = (fl_owner != NULL) ? fl_owner : this;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   258
  }
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 an empty oop array of size _sz (required to be non-zero).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   261
  void** allocate_buffer();
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
  // Return an empty buffer to the free list.  The "buf" argument is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   264
  // required to be a pointer to the head of an array of length "_sz".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   265
  void deallocate_buffer(void** buf);
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
  // Declares that "buf" is a complete buffer.
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   268
  void enqueue_complete_buffer(void** buf, size_t index = 0);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   269
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   270
  // To be invoked by the mutator.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   271
  bool process_or_enqueue_complete_buffer(void** buf);
1374
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
  bool completed_buffers_exist_dirty() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   274
    return _n_completed_buffers > 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   275
  }
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
  bool process_completed_buffers() { return _process_completed; }
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   278
  void set_process_completed(bool x) { _process_completed = x; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   279
5082
19e725a3d2eb 6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents: 4481
diff changeset
   280
  bool is_active() { return _all_active; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   281
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   282
  // Set the buffer size.  Should be called before any "enqueue" operation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   283
  // can be called.  And should only be called once.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   284
  void set_buffer_size(size_t sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   285
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   286
  // Get the buffer size.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   287
  size_t buffer_size() { return _sz; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   288
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   289
  // Get/Set the number of completed buffers that triggers log processing.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   290
  void set_process_completed_threshold(int sz) { _process_completed_threshold = sz; }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   291
  int process_completed_threshold() const { return _process_completed_threshold; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   292
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   293
  // Must only be called at a safe point.  Indicates that the buffer free
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   294
  // list size may be reduced, if that is deemed desirable.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   295
  void reduce_free_list();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   296
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   297
  int completed_buffers_num() { return _n_completed_buffers; }
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2013
diff changeset
   298
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2013
diff changeset
   299
  void merge_bufferlists(PtrQueueSet* src);
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   300
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   301
  void set_max_completed_queue(int m) { _max_completed_queue = m; }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   302
  int max_completed_queue() { return _max_completed_queue; }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   303
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   304
  void set_completed_queue_padding(int padding) { _completed_queue_padding = padding; }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   305
  int completed_queue_padding() { return _completed_queue_padding; }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   306
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   307
  // Notify the consumer if the number of buffers crossed the threshold
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 2154
diff changeset
   308
  void notify_if_necessary();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   309
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6768
diff changeset
   310
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6768
diff changeset
   311
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_PTRQUEUE_HPP