annotate src/share/vm/gc_implementation/g1/ptrQueue.hpp @ 20211:82693fb204a5

8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet Summary: The test incorrectly assumed that it had been started with no other previous compilation activity. Fix this by allowing multiple code root free chunk lists, and use one separate from the global one to perform the test. Reviewed-by: brutisso
author tschatzl
date Wed, 16 Apr 2014 10:14:50 +0200
parents 55fb97c4c58d
children 4ca6dc0799b6 42c091d63c72
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 /*
17467
55fb97c4c58d 8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents: 12835
diff changeset
2 * Copyright (c) 2001, 2013, 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 {
12258
69f26e8e09f9 8024760: add more types, fields and constants to VMStructs
twisti
parents: 4787
diff changeset
41 friend class VMStructs;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
42
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
43 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
44 // The ptr queue set to which this queue belongs.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
45 PtrQueueSet* _qset;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47 // Whether updates should be logged.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48 bool _active;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
49
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
50 // The buffer.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
51 void** _buf;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
52 // 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
53 // (indicating an empty buffer) and goes towards zero.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
54 size_t _index;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
55
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56 // The size of the buffer.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
57 size_t _sz;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
58
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
59 // 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
60 // 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
61 // be legally locked by then.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
62 bool _perm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
63
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
64 // 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
65 Mutex* _lock;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
66
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
67 PtrQueueSet* qset() { return _qset; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
68
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
69 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 // 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
71 // given PtrQueueSet.
2149
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
72 PtrQueue(PtrQueueSet* qset, bool perm = false, bool active = false);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
73 // Release any contained resources.
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 2149
diff changeset
74 virtual void flush();
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 342
diff changeset
75 // Calls flush() when destroyed.
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 342
diff changeset
76 ~PtrQueue() { flush(); }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78 // Associate a lock with a ptr queue.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
79 void set_lock(Mutex* lock) { _lock = lock; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
80
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
81 void reset() { if (_buf != NULL) _index = _sz; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
82
12835
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12258
diff changeset
83 void enqueue(volatile void* ptr) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12258
diff changeset
84 enqueue((void*)(ptr));
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12258
diff changeset
85 }
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12258
diff changeset
86
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
87 // Enqueues the given "obj".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
88 void enqueue(void* ptr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
89 if (!_active) return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
90 else enqueue_known_active(ptr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
91 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
92
2149
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
93 // 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
94 // 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
95 // 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
96 // true if the buffer should be enqueued, or false if enough
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
97 // 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
98 // 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
99 // get into an infinite loop).
7e37af9d69ef 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 1972
diff changeset
100 virtual bool should_enqueue_buffer() { return true; }
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
101 void handle_zero_index();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
102 void locking_enqueue_completed_buffer(void** buf);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
103
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
104 void enqueue_known_active(void* ptr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
105
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
106 size_t size() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
107 assert(_sz >= _index, "Invariant.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
108 return _buf == NULL ? 0 : _sz - _index;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
109 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
110
1842
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1552
diff changeset
111 bool is_empty() {
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1552
diff changeset
112 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
113 }
6e0aac35bfa9 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 1552
diff changeset
114
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
115 // 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
116 // 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
117 // log to the empty state.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
118 void set_active(bool b) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
119 _active = b;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
120 if (!b && _buf != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
121 _index = _sz;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
122 } else if (b && _buf != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
123 assert(_index == _sz, "invariant: queues are empty when activated.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
124 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
125 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
126
1317
d4197f8d516a 6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents: 1111
diff changeset
127 bool is_active() { return _active; }
d4197f8d516a 6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents: 1111
diff changeset
128
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
129 static int byte_index_to_index(int ind) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
130 assert((ind % oopSize) == 0, "Invariant.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
131 return ind / oopSize;
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
134 static int index_to_byte_index(int byte_ind) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
135 return byte_ind * oopSize;
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
138 // To support compiler.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
139 static ByteSize byte_offset_of_index() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
140 return byte_offset_of(PtrQueue, _index);
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_index() { return in_ByteSize(sizeof(size_t)); }
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_buf() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 return byte_offset_of(PtrQueue, _buf);
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_buf() { return in_ByteSize(sizeof(void*)); }
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 static ByteSize byte_offset_of_active() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
150 return byte_offset_of(PtrQueue, _active);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
151 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
152 static ByteSize byte_width_of_active() { return in_ByteSize(sizeof(bool)); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
153
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
154 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
155
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
156 class BufferNode {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
157 size_t _index;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
158 BufferNode* _next;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
159 public:
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
160 BufferNode() : _index(0), _next(NULL) { }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
161 BufferNode* next() const { return _next; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
162 void set_next(BufferNode* n) { _next = n; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
163 size_t index() const { return _index; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
164 void set_index(size_t i) { _index = i; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
165
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
166 // Align the size of the structure to the size of the pointer
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
167 static size_t aligned_size() {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
168 static const size_t alignment = round_to(sizeof(BufferNode), sizeof(void*));
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
169 return alignment;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
170 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
171
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
172 // BufferNode is allocated before the buffer.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
173 // The chunk of memory that holds both of them is a block.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
174
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
175 // Produce a new BufferNode given a buffer.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
176 static BufferNode* new_from_buffer(void** buf) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
177 return new (make_block_from_buffer(buf)) BufferNode;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
178 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
179
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
180 // The following are the required conversion routines:
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
181 static BufferNode* make_node_from_buffer(void** buf) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
182 return (BufferNode*)make_block_from_buffer(buf);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
183 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
184 static void** make_buffer_from_node(BufferNode *node) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
185 return make_buffer_from_block(node);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
186 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
187 static void* make_block_from_node(BufferNode *node) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
188 return (void*)node;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
189 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
190 static void** make_buffer_from_block(void* p) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
191 return (void**)((char*)p + aligned_size());
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
192 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
193 static void* make_block_from_buffer(void** p) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
194 return (void*)((char*)p - aligned_size());
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
195 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
196 };
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
197
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198 // A PtrQueueSet represents resources common to a set of pointer queues.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
199 // In particular, the individual queues allocate buffers from this shared
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
200 // set, and return completed buffers to the set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
201 // 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
202 class PtrQueueSet VALUE_OBJ_CLASS_SPEC {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 Monitor* _cbl_mon; // Protects the fields below.
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
205 BufferNode* _completed_buffers_head;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
206 BufferNode* _completed_buffers_tail;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
207 int _n_completed_buffers;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
208 int _process_completed_threshold;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209 volatile bool _process_completed;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 // This (and the interpretation of the first element as a "next"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212 // pointer) are protected by the TLOQ_FL_lock.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
213 Mutex* _fl_lock;
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
214 BufferNode* _buf_free_list;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215 size_t _buf_free_list_sz;
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
216 // 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
217 // 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
218 PtrQueueSet* _fl_owner;
342
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 // The size of all buffers in the set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
221 size_t _sz;
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 bool _all_active;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
224
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
225 // 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
226 bool _notify_when_complete;
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 // Maximum number of elements allowed on completed queue: after that,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
229 // enqueuer does the work itself. Zero indicates no maximum.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
230 int _max_completed_queue;
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
231 int _completed_queue_padding;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
232
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
233 int completed_buffers_list_length();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
234 void assert_completed_buffer_list_len_correct_locked();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
235 void assert_completed_buffer_list_len_correct();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
236
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
237 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
238 // A mutator thread does the the work of processing a buffer.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
239 // 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
240 // deallocated).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
241 virtual bool mut_process_buffer(void** buf) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
242 ShouldNotReachHere();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
243 return 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
246 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
247 // Create an empty ptr queue set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
248 PtrQueueSet(bool notify_when_complete = false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
249
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
250 // 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
251 // arguments.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
252 void initialize(Monitor* cbl_mon, Mutex* fl_lock,
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
253 int process_completed_threshold,
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
254 int max_completed_queue,
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
255 PtrQueueSet *fl_owner = NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
256 _max_completed_queue = max_completed_queue;
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
257 _process_completed_threshold = process_completed_threshold;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
258 _completed_queue_padding = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
259 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
260 _cbl_mon = cbl_mon;
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
261 _fl_lock = fl_lock;
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
262 _fl_owner = (fl_owner != NULL) ? fl_owner : this;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
263 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
264
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
265 // 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
266 void** allocate_buffer();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
267
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
268 // 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
269 // 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
270 void deallocate_buffer(void** buf);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
271
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
272 // Declares that "buf" is a complete buffer.
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
273 void enqueue_complete_buffer(void** buf, size_t index = 0);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
274
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
275 // To be invoked by the mutator.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
276 bool process_or_enqueue_complete_buffer(void** buf);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
277
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
278 bool completed_buffers_exist_dirty() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
279 return _n_completed_buffers > 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
280 }
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 bool process_completed_buffers() { return _process_completed; }
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
283 void set_process_completed(bool x) { _process_completed = x; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
284
1317
d4197f8d516a 6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents: 1111
diff changeset
285 bool is_active() { return _all_active; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
286
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
287 // Set the buffer size. Should be called before any "enqueue" operation
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
288 // can be called. And should only be called once.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
289 void set_buffer_size(size_t sz);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
290
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
291 // Get the buffer size.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
292 size_t buffer_size() { return _sz; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
293
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
294 // Get/Set the number of completed buffers that triggers log processing.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
295 void set_process_completed_threshold(int sz) { _process_completed_threshold = sz; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
296 int process_completed_threshold() const { return _process_completed_threshold; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
297
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
298 // 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
299 // list size may be reduced, if that is deemed desirable.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
300 void reduce_free_list();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
301
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
302 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
303
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 549
diff changeset
304 void merge_bufferlists(PtrQueueSet* src);
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
305
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
306 void set_max_completed_queue(int m) { _max_completed_queue = m; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
307 int max_completed_queue() { return _max_completed_queue; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
308
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
309 void set_completed_queue_padding(int padding) { _completed_queue_padding = padding; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
310 int completed_queue_padding() { return _completed_queue_padding; }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
311
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
312 // Notify the consumer if the number of buffers crossed the threshold
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 628
diff changeset
313 void notify_if_necessary();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
314 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1842
diff changeset
315
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1842
diff changeset
316 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_PTRQUEUE_HPP