annotate src/share/vm/gc_implementation/g1/ptrQueue.hpp @ 2149:7e37af9d69ef

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
author tonyp
date Wed, 19 Jan 2011 09:35:17 -0500
parents f95d63e2154a
children 2ace1c4ee8da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1 /*
2149
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4 *
37f87013dfd8 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
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
7 * published by the Free Software Foundation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
8 *
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
13 * accompanied this code).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
14 *
37f87013dfd8 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
37f87013dfd8 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,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1317
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1317
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1317
diff changeset
21 * questions.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
22 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
23 */
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1842
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_PTRQUEUE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1842
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_PTRQUEUE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1842
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1842
diff changeset
28 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1842
diff changeset
29 #include "utilities/sizes.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1842
diff changeset
30
342
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
32 // addresses. For example, a generational write barrier might log
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
33 // the addresses of modified old-generation objects. This type supports
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
34 // this operation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
35
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
36 // The definition of placement operator new(size_t, void*) in the <new>.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
37 #include <new>
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
38
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
39 class PtrQueueSet;
549
fe3d7c11b4b7 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 470
diff changeset
40 class PtrQueue VALUE_OBJ_CLASS_SPEC {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
41
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
42 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
43 // The ptr queue set to which this queue belongs.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
44 PtrQueueSet* _qset;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
45
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46 // Whether updates should be logged.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47 bool _active;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
49 // The buffer.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
50 void** _buf;
37f87013dfd8 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"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
52 // (indicating an empty buffer) and goes towards zero.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
53 size_t _index;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
54
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
55 // The size of the buffer.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56 size_t _sz;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
57
37f87013dfd8 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
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
60 // be legally locked by then.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
61 bool _perm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
62
37f87013dfd8 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.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
64 Mutex* _lock;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
65
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
66 PtrQueueSet* qset() { return _qset; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
67
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
68 public:
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 // given PtrQueueSet.
2149
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
71 PtrQueue(PtrQueueSet* qset, bool perm = false, bool active = false);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
72 // Release any contained resources.
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 342
diff changeset
73 void flush();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 342
diff changeset
74 // Calls flush() when destroyed.
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 342
diff changeset
75 ~PtrQueue() { flush(); }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
76
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77 // Associate a lock with a ptr queue.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78 void set_lock(Mutex* lock) { _lock = lock; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
79
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
80 void reset() { if (_buf != NULL) _index = _sz; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
81
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
82 // Enqueues the given "obj".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
83 void enqueue(void* ptr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
84 if (!_active) return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
85 else enqueue_known_active(ptr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
86 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
87
2149
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
88 // This method is called when we're doing the zero index handling
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
89 // and gives a chance to the queues to do any pre-enqueueing
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
90 // processing they might want to do on the buffer. It should return
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
91 // true if the buffer should be enqueued, or false if enough
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
92 // entries were cleared from it so that it can be re-used. It should
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
93 // not return false if the buffer is still full (otherwise we can
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
94 // get into an infinite loop).
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
95 virtual bool should_enqueue_buffer() { return true; }
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
96 void handle_zero_index();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
97 void locking_enqueue_completed_buffer(void** buf);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
98
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
99 void enqueue_known_active(void* ptr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
100
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
101 size_t size() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
102 assert(_sz >= _index, "Invariant.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
103 return _buf == NULL ? 0 : _sz - _index;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
104 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
105
1842
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1552
diff changeset
106 bool is_empty() {
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1552
diff changeset
107 return _buf == NULL || _sz == _index;
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1552
diff changeset
108 }
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1552
diff changeset
109
342
37f87013dfd8 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
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
112 // log to the empty state.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
113 void set_active(bool b) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
114 _active = b;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
115 if (!b && _buf != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
116 _index = _sz;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
117 } else if (b && _buf != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
118 assert(_index == _sz, "invariant: queues are empty when activated.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
119 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
120 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
121
1317
d4197f8d516a 6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents: 1111
diff changeset
122 bool is_active() { return _active; }
d4197f8d516a 6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents: 1111
diff changeset
123
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
124 static int byte_index_to_index(int ind) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
125 assert((ind % oopSize) == 0, "Invariant.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
126 return ind / oopSize;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
127 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
128
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
129 static int index_to_byte_index(int byte_ind) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
130 return byte_ind * oopSize;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
131 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
132
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
133 // To support compiler.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
134 static ByteSize byte_offset_of_index() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
135 return byte_offset_of(PtrQueue, _index);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
136 }
37f87013dfd8 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)); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
138
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
139 static ByteSize byte_offset_of_buf() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
140 return byte_offset_of(PtrQueue, _buf);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
141 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
142 static ByteSize byte_width_of_buf() { return in_ByteSize(sizeof(void*)); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
143
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
144 static ByteSize byte_offset_of_active() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 return byte_offset_of(PtrQueue, _active);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
146 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
147 static ByteSize byte_width_of_active() { return in_ByteSize(sizeof(bool)); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
148
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
149 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
150
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
151 class BufferNode {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
152 size_t _index;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
153 BufferNode* _next;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
154 public:
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
155 BufferNode() : _index(0), _next(NULL) { }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
156 BufferNode* next() const { return _next; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
157 void set_next(BufferNode* n) { _next = n; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
158 size_t index() const { return _index; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
159 void set_index(size_t i) { _index = i; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
160
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
161 // Align the size of the structure to the size of the pointer
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
162 static size_t aligned_size() {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
163 static const size_t alignment = round_to(sizeof(BufferNode), sizeof(void*));
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
164 return alignment;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
165 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
166
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
167 // BufferNode is allocated before the buffer.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
168 // The chunk of memory that holds both of them is a block.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
169
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
170 // Produce a new BufferNode given a buffer.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
171 static BufferNode* new_from_buffer(void** buf) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
172 return new (make_block_from_buffer(buf)) BufferNode;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
173 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
174
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
175 // The following are the required conversion routines:
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
176 static BufferNode* make_node_from_buffer(void** buf) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
177 return (BufferNode*)make_block_from_buffer(buf);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
178 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
179 static void** make_buffer_from_node(BufferNode *node) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
180 return make_buffer_from_block(node);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
181 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
182 static void* make_block_from_node(BufferNode *node) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
183 return (void*)node;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
184 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
185 static void** make_buffer_from_block(void* p) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
186 return (void**)((char*)p + aligned_size());
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
187 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
188 static void* make_block_from_buffer(void** p) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
189 return (void*)((char*)p - aligned_size());
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
190 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
191 };
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
192
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
193 // A PtrQueueSet represents resources common to a set of pointer queues.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194 // In particular, the individual queues allocate buffers from this shared
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
195 // set, and return completed buffers to the set.
37f87013dfd8 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 ???
549
fe3d7c11b4b7 6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents: 470
diff changeset
197 class PtrQueueSet VALUE_OBJ_CLASS_SPEC {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
199 Monitor* _cbl_mon; // Protects the fields below.
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
200 BufferNode* _completed_buffers_head;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
201 BufferNode* _completed_buffers_tail;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
202 int _n_completed_buffers;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
203 int _process_completed_threshold;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 volatile bool _process_completed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
205
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
206 // This (and the interpretation of the first element as a "next"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207 // pointer) are protected by the TLOQ_FL_lock.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208 Mutex* _fl_lock;
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
209 BufferNode* _buf_free_list;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210 size_t _buf_free_list_sz;
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
211 // Queue set can share a freelist. The _fl_owner variable
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
212 // specifies the owner. It is set to "this" by default.
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
213 PtrQueueSet* _fl_owner;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215 // The size of all buffers in the set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 size_t _sz;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
217
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218 bool _all_active;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
219
37f87013dfd8 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.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
221 bool _notify_when_complete;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
222
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
223 // Maximum number of elements allowed on completed queue: after that,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
224 // enqueuer does the work itself. Zero indicates no maximum.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
225 int _max_completed_queue;
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
226 int _completed_queue_padding;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
227
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
228 int completed_buffers_list_length();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
229 void assert_completed_buffer_list_len_correct_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
230 void assert_completed_buffer_list_len_correct();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
231
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
232 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
233 // A mutator thread does the the work of processing a buffer.
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
235 // deallocated).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
236 virtual bool mut_process_buffer(void** buf) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
237 ShouldNotReachHere();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
238 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
239 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
240
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
241 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
242 // Create an empty ptr queue set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
243 PtrQueueSet(bool notify_when_complete = false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
244
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
246 // arguments.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
247 void initialize(Monitor* cbl_mon, Mutex* fl_lock,
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
248 int process_completed_threshold,
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
249 int max_completed_queue,
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
250 PtrQueueSet *fl_owner = NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
251 _max_completed_queue = max_completed_queue;
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
252 _process_completed_threshold = process_completed_threshold;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
253 _completed_queue_padding = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
254 assert(cbl_mon != NULL && fl_lock != NULL, "Init order issue?");
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
255 _cbl_mon = cbl_mon;
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
256 _fl_lock = fl_lock;
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
257 _fl_owner = (fl_owner != NULL) ? fl_owner : this;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
258 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
259
37f87013dfd8 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).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
261 void** allocate_buffer();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
262
37f87013dfd8 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
37f87013dfd8 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".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
265 void deallocate_buffer(void** buf);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
266
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
267 // Declares that "buf" is a complete buffer.
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
268 void enqueue_complete_buffer(void** buf, size_t index = 0);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
269
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
270 // To be invoked by the mutator.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
271 bool process_or_enqueue_complete_buffer(void** buf);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
272
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
273 bool completed_buffers_exist_dirty() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
274 return _n_completed_buffers > 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
275 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
276
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
277 bool process_completed_buffers() { return _process_completed; }
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
278 void set_process_completed(bool x) { _process_completed = x; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
279
1317
d4197f8d516a 6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents: 1111
diff changeset
280 bool is_active() { return _all_active; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
281
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
282 // Set the buffer size. Should be called before any "enqueue" operation
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
283 // can be called. And should only be called once.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
284 void set_buffer_size(size_t sz);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
285
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
286 // Get the buffer size.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
287 size_t buffer_size() { return _sz; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
288
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
289 // Get/Set the number of completed buffers that triggers log processing.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
290 void set_process_completed_threshold(int sz) { _process_completed_threshold = sz; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
291 int process_completed_threshold() const { return _process_completed_threshold; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
292
37f87013dfd8 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
294 // list size may be reduced, if that is deemed desirable.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
295 void reduce_free_list();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
296
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
297 int completed_buffers_num() { return _n_completed_buffers; }
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
298
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
299 void merge_bufferlists(PtrQueueSet* src);
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
300
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
301 void set_max_completed_queue(int m) { _max_completed_queue = m; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
302 int max_completed_queue() { return _max_completed_queue; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
303
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
304 void set_completed_queue_padding(int padding) { _completed_queue_padding = padding; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
305 int completed_queue_padding() { return _completed_queue_padding; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
306
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
307 // Notify the consumer if the number of buffers crossed the threshold
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
308 void notify_if_necessary();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
309 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1842
diff changeset
310
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1842
diff changeset
311 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_PTRQUEUE_HPP