10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11 * version 2 for more details (a copy is included in the LICENSE file that
12 * accompanied this code).
13 *
14 * You should have received a copy of the GNU General Public License version
15 * 2 along with this work; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 #include "precompiled.hpp"
25
26 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
27 #include "gc/shenandoah/shenandoahSATBMarkQueueSet.hpp"
28 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
29
30 ShenandoahSATBMarkQueueSet::ShenandoahSATBMarkQueueSet() :
31 _heap(NULL),
32 _satb_mark_queue_buffer_allocator("SATB Buffer Allocator", ShenandoahSATBBufferSize)
33 {}
34
35 void ShenandoahSATBMarkQueueSet::initialize(ShenandoahHeap* const heap,
36 int process_completed_threshold,
37 uint buffer_enqueue_threshold_percentage) {
38 SATBMarkQueueSet::initialize(&_satb_mark_queue_buffer_allocator,
39 process_completed_threshold,
40 buffer_enqueue_threshold_percentage);
41 _heap = heap;
42 }
43
44 SATBMarkQueue& ShenandoahSATBMarkQueueSet::satb_queue_for_thread(Thread* const t) const {
45 return ShenandoahThreadLocalData::satb_mark_queue(t);
46 }
47
48 template <bool RESOLVE>
49 class ShenandoahSATBMarkQueueFilterFn {
50 ShenandoahHeap* const _heap;
51
52 public:
53 ShenandoahSATBMarkQueueFilterFn(ShenandoahHeap* heap) : _heap(heap) {}
54
55 // Return true if entry should be filtered out (removed), false if
56 // it should be retained.
57 bool operator()(const void* entry) const {
58 return !_heap->requires_marking<RESOLVE>(entry);
59 }
60 };
61
62 void ShenandoahSATBMarkQueueSet::filter(SATBMarkQueue* queue) {
63 assert(_heap != NULL, "SATB queue set not initialized");
64 if (_heap->has_forwarded_objects()) {
65 apply_filter(ShenandoahSATBMarkQueueFilterFn<true>(_heap), queue);
66 } else {
67 apply_filter(ShenandoahSATBMarkQueueFilterFn<false>(_heap), queue);
68 }
69 }
70
71 void ShenandoahSATBMarkQueue::handle_completed_buffer() {
72 SATBMarkQueue::handle_completed_buffer();
73 if (!is_empty()) {
74 Thread* t = Thread::current();
75 if (ShenandoahThreadLocalData::is_force_satb_flush(t)) {
76 // Non-empty buffer is compacted, and we decided not to enqueue it.
77 // We still want to know about leftover work in that buffer eventually.
78 // This avoid dealing with these leftovers during the final-mark, after
79 // the buffers are drained completely. See JDK-8205353 for more discussion.
80 ShenandoahThreadLocalData::set_force_satb_flush(t, false);
81 enqueue_completed_buffer();
82 }
83 }
84 }
|
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11 * version 2 for more details (a copy is included in the LICENSE file that
12 * accompanied this code).
13 *
14 * You should have received a copy of the GNU General Public License version
15 * 2 along with this work; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 #include "precompiled.hpp"
25
26 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
27 #include "gc/shenandoah/shenandoahSATBMarkQueueSet.hpp"
28 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
29
30 ShenandoahSATBMarkQueueSet::ShenandoahSATBMarkQueueSet(BufferNode::Allocator* allocator) :
31 SATBMarkQueueSet(allocator)
32 {}
33
34 SATBMarkQueue& ShenandoahSATBMarkQueueSet::satb_queue_for_thread(Thread* const t) const {
35 return ShenandoahThreadLocalData::satb_mark_queue(t);
36 }
37
38 template <bool RESOLVE>
39 class ShenandoahSATBMarkQueueFilterFn {
40 ShenandoahHeap* const _heap;
41
42 public:
43 ShenandoahSATBMarkQueueFilterFn(ShenandoahHeap* heap) : _heap(heap) {}
44
45 // Return true if entry should be filtered out (removed), false if
46 // it should be retained.
47 bool operator()(const void* entry) const {
48 return !_heap->requires_marking<RESOLVE>(entry);
49 }
50 };
51
52 void ShenandoahSATBMarkQueueSet::filter(SATBMarkQueue* queue) {
53 ShenandoahHeap* heap = ShenandoahHeap::heap();
54 if (heap->has_forwarded_objects()) {
55 apply_filter(ShenandoahSATBMarkQueueFilterFn<true>(heap), queue);
56 } else {
57 apply_filter(ShenandoahSATBMarkQueueFilterFn<false>(heap), queue);
58 }
59 }
60
61 void ShenandoahSATBMarkQueue::handle_completed_buffer() {
62 SATBMarkQueue::handle_completed_buffer();
63 if (!is_empty()) {
64 Thread* t = Thread::current();
65 if (ShenandoahThreadLocalData::is_force_satb_flush(t)) {
66 // Non-empty buffer is compacted, and we decided not to enqueue it.
67 // We still want to know about leftover work in that buffer eventually.
68 // This avoid dealing with these leftovers during the final-mark, after
69 // the buffers are drained completely. See JDK-8205353 for more discussion.
70 ShenandoahThreadLocalData::set_force_satb_flush(t, false);
71 enqueue_completed_buffer();
72 }
73 }
74 }
|