annotate src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp @ 795:215f81b4d9b3

6841831: G1: assert(contains_reference(from),"We just added it!") fires Summary: During parallel rset updating we have to make sure that the worker ids of the refinement threads do not intersect with the worker ids that can be claimed by the mutator threads. Reviewed-by: tonyp
author iveresov
date Mon, 18 May 2009 11:52:46 -0700
parents 315a5d70b295
children bd02caa94611 27f6a9b9c311
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 /*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2 * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved.
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 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
21 * have any questions.
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
25 #include "incls/_precompiled.incl"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
26 #include "incls/_concurrentG1RefineThread.cpp.incl"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
27
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
28 // ======= Concurrent Mark Thread ========
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
29
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
30 // The CM thread is created when the G1 garbage collector is used
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
31
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
32 ConcurrentG1RefineThread::
795
215f81b4d9b3 6841831: G1: assert(contains_reference(from),"We just added it!") fires
iveresov
parents: 794
diff changeset
33 ConcurrentG1RefineThread(ConcurrentG1Refine* cg1r, ConcurrentG1RefineThread *next,
215f81b4d9b3 6841831: G1: assert(contains_reference(from),"We just added it!") fires
iveresov
parents: 794
diff changeset
34 int worker_id_offset, int worker_id) :
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
35 ConcurrentGCThread(),
795
215f81b4d9b3 6841831: G1: assert(contains_reference(from),"We just added it!") fires
iveresov
parents: 794
diff changeset
36 _worker_id_offset(worker_id_offset),
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
37 _worker_id(worker_id),
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
38 _active(false),
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
39 _next(next),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
40 _cg1r(cg1r),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
41 _vtime_accum(0.0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
42 _co_tracker(G1CRGroup),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
43 _interval_ms(5.0)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
44 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
45 create_and_start();
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48 void ConcurrentG1RefineThread::sample_young_list_rs_lengths() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
49 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
50 G1CollectorPolicy* g1p = g1h->g1_policy();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
51 if (g1p->adaptive_young_list_length()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
52 int regions_visited = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
53
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
54 g1h->young_list_rs_length_sampling_init();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
55 while (g1h->young_list_rs_length_sampling_more()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56 g1h->young_list_rs_length_sampling_next();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
57 ++regions_visited;
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 // we try to yield every time we visit 10 regions
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
60 if (regions_visited == 10) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
61 if (_sts.should_yield()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
62 _sts.yield("G1 refine");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
63 // we just abandon the iteration
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
64 break;
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 regions_visited = 0;
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 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
69
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 g1p->check_prediction_validity();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
71 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
72 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
73
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
74 void ConcurrentG1RefineThread::run() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
75 initialize_in_thread();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
76 _vtime_start = os::elapsedVTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77 wait_for_universe_init();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
79 _co_tracker.enable();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
80 _co_tracker.start();
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 while (!_should_terminate) {
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
83 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
84 // Wait for completed log buffers to exist.
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
85 {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
86 MutexLockerEx x(DirtyCardQ_CBL_mon, Mutex::_no_safepoint_check_flag);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
87 while (((_worker_id == 0 && !dcqs.process_completed_buffers()) ||
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
88 (_worker_id > 0 && !is_active())) &&
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
89 !_should_terminate) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
90 DirtyCardQ_CBL_mon->wait(Mutex::_no_safepoint_check_flag);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
91 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
92 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
93
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
94 if (_should_terminate) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
95 return;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
96 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
97
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
98 // Now we take them off (this doesn't hold locks while it applies
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
99 // closures.) (If we did a full collection, then we'll do a full
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
100 // traversal.
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
101 _sts.join();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
102 int n_logs = 0;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
103 int lower_limit = 0;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
104 double start_vtime_sec; // only used when G1SmoothConcRefine is on
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
105 int prev_buffer_num; // only used when G1SmoothConcRefine is on
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
106 // This thread activation threshold
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
107 int threshold = DCQBarrierProcessCompletedThreshold * _worker_id;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
108 // Next thread activation threshold
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
109 int next_threshold = threshold + DCQBarrierProcessCompletedThreshold;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
110 int deactivation_threshold = MAX2<int>(threshold - DCQBarrierProcessCompletedThreshold / 2, 0);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
111
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
112 if (G1SmoothConcRefine) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
113 lower_limit = 0;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
114 start_vtime_sec = os::elapsedVTime();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
115 prev_buffer_num = (int) dcqs.completed_buffers_num();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
116 } else {
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
117 lower_limit = DCQBarrierProcessCompletedThreshold / 4; // For now.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
118 }
795
215f81b4d9b3 6841831: G1: assert(contains_reference(from),"We just added it!") fires
iveresov
parents: 794
diff changeset
119 while (dcqs.apply_closure_to_completed_buffer(_worker_id + _worker_id_offset, lower_limit)) {
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
120 double end_vtime_sec;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
121 double elapsed_vtime_sec;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
122 int elapsed_vtime_ms;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
123 int curr_buffer_num = (int) dcqs.completed_buffers_num();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
124
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
125 if (G1SmoothConcRefine) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
126 end_vtime_sec = os::elapsedVTime();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
127 elapsed_vtime_sec = end_vtime_sec - start_vtime_sec;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
128 elapsed_vtime_ms = (int) (elapsed_vtime_sec * 1000.0);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
129
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
130 if (curr_buffer_num > prev_buffer_num ||
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
131 curr_buffer_num > next_threshold) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
132 decreaseInterval(elapsed_vtime_ms);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
133 } else if (curr_buffer_num < prev_buffer_num) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
134 increaseInterval(elapsed_vtime_ms);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
135 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
136 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
137 if (_worker_id == 0) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
138 sample_young_list_rs_lengths();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
139 } else if (curr_buffer_num < deactivation_threshold) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
140 // If the number of the buffer has fallen below our threshold
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
141 // we should deactivate. The predecessor will reactivate this
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
142 // thread should the number of the buffers cross the threshold again.
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
143 MutexLockerEx x(DirtyCardQ_CBL_mon, Mutex::_no_safepoint_check_flag);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
144 deactivate();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
145 if (G1TraceConcurrentRefinement) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
146 gclog_or_tty->print_cr("G1-Refine-deactivated worker %d", _worker_id);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
147 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
148 break;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
149 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
150 _co_tracker.update(false);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
151
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
152 // Check if we need to activate the next thread.
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
153 if (curr_buffer_num > next_threshold && _next != NULL && !_next->is_active()) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
154 MutexLockerEx x(DirtyCardQ_CBL_mon, Mutex::_no_safepoint_check_flag);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
155 _next->activate();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
156 DirtyCardQ_CBL_mon->notify_all();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
157 if (G1TraceConcurrentRefinement) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
158 gclog_or_tty->print_cr("G1-Refine-activated worker %d", _next->_worker_id);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
159 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
160 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
161
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
162 if (G1SmoothConcRefine) {
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
163 prev_buffer_num = curr_buffer_num;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
164 _sts.leave();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
165 os::sleep(Thread::current(), (jlong) _interval_ms, false);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
166 _sts.join();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
167 start_vtime_sec = os::elapsedVTime();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
168 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
169 n_logs++;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
170 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
171 _co_tracker.update(false);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
172 _sts.leave();
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
173
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174 if (os::supports_vtime()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
175 _vtime_accum = (os::elapsedVTime() - _vtime_start);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
176 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 _vtime_accum = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
179 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
180 _sts.join();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
181 _co_tracker.update(true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
182 _sts.leave();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
183 assert(_should_terminate, "just checking");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
184
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
185 terminate();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
186 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
187
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
188
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
189 void ConcurrentG1RefineThread::yield() {
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 616
diff changeset
190 if (G1TraceConcurrentRefinement) gclog_or_tty->print_cr("G1-Refine-yield");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
191 _sts.yield("G1 refine");
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 616
diff changeset
192 if (G1TraceConcurrentRefinement) gclog_or_tty->print_cr("G1-Refine-yield-end");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
193 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
195 void ConcurrentG1RefineThread::stop() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
196 // it is ok to take late safepoints here, if needed
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
197 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198 MutexLockerEx mu(Terminator_lock);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
199 _should_terminate = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
200 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
201
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
202 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 MutexLockerEx x(DirtyCardQ_CBL_mon, Mutex::_no_safepoint_check_flag);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 DirtyCardQ_CBL_mon->notify_all();
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208 MutexLockerEx mu(Terminator_lock);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209 while (!_has_terminated) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210 Terminator_lock->wait();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212 }
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 616
diff changeset
213 if (G1TraceConcurrentRefinement) gclog_or_tty->print_cr("G1-Refine-stop");
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 void ConcurrentG1RefineThread::print() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
217 gclog_or_tty->print("\"Concurrent G1 Refinement Thread\" ");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218 Thread::print();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
219 gclog_or_tty->cr();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
220 }