1
1
/*
2
- * Copyright (c) 2001, 2020 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2001, 2021 , Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
@@ -55,21 +55,10 @@ G1DirtyCardQueue::G1DirtyCardQueue(G1DirtyCardQueueSet* qset) :
55
55
{ }
56
56
57
57
G1DirtyCardQueue::~G1DirtyCardQueue () {
58
- flush ( );
58
+ G1BarrierSet::dirty_card_queue_set (). flush_queue (* this );
59
59
delete _refinement_stats;
60
60
}
61
61
62
- void G1DirtyCardQueue::flush () {
63
- _refinement_stats->inc_dirtied_cards (size ());
64
- flush_impl ();
65
- }
66
-
67
- void G1DirtyCardQueue::on_thread_detach () {
68
- assert (this == &G1ThreadLocalData::dirty_card_queue (Thread::current ()), " precondition" );
69
- flush ();
70
- dirty_card_qset ()->record_detached_refinement_stats (_refinement_stats);
71
- }
72
-
73
62
// Assumed to be zero by concurrent threads.
74
63
static uint par_ids_start () { return 0 ; }
75
64
@@ -95,6 +84,14 @@ uint G1DirtyCardQueueSet::num_par_ids() {
95
84
return (uint )os::initial_active_processor_count ();
96
85
}
97
86
87
+ void G1DirtyCardQueueSet::flush_queue (G1DirtyCardQueue& queue) {
88
+ if (queue.buffer () != nullptr ) {
89
+ G1ConcurrentRefineStats* stats = queue.refinement_stats ();
90
+ stats->inc_dirtied_cards (buffer_size () - queue.index ());
91
+ }
92
+ PtrQueueSet::flush_queue (queue);
93
+ }
94
+
98
95
void G1DirtyCardQueueSet::enqueue (G1DirtyCardQueue& queue,
99
96
volatile CardValue* card_ptr) {
100
97
CardValue* value = const_cast <CardValue*>(card_ptr);
@@ -645,13 +642,16 @@ void G1DirtyCardQueueSet::concatenate_logs() {
645
642
set_max_cards (MaxCardsUnlimited);
646
643
647
644
struct ConcatenateThreadLogClosure : public ThreadClosure {
645
+ G1DirtyCardQueueSet& _qset;
646
+ ConcatenateThreadLogClosure (G1DirtyCardQueueSet& qset) : _qset(qset) {}
648
647
virtual void do_thread (Thread* t) {
649
- G1DirtyCardQueue& dcq = G1ThreadLocalData::dirty_card_queue (t);
650
- if (!dcq.is_empty ()) {
651
- dcq.flush ();
648
+ G1DirtyCardQueue& queue = G1ThreadLocalData::dirty_card_queue (t);
649
+ if ((queue.buffer () != nullptr ) &&
650
+ (queue.index () != _qset.buffer_size ())) {
651
+ _qset.flush_queue (queue);
652
652
}
653
653
}
654
- } closure;
654
+ } closure (* this ) ;
655
655
Threads::threads_do (&closure);
656
656
657
657
G1BarrierSet::shared_dirty_card_queue ().flush ();
0 commit comments