Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp @ 18079:605df8463453 jdk8u25-b06
Merge
author | asaha |
---|---|
date | Wed, 02 Jul 2014 15:42:28 -0700 |
parents | 1772223a25a2 |
children | 581e70386ec9 |
rev | line source |
---|---|
17764 | 1 /* |
2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. | |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
20 * or visit www.oracle.com if you need additional information or have any | |
21 * questions. | |
22 * | |
23 */ | |
24 | |
25 #include "precompiled.hpp" | |
26 #include "gc_implementation/g1/g1Log.hpp" | |
27 #include "gc_implementation/g1/g1StringDedup.hpp" | |
28 #include "gc_implementation/g1/g1StringDedupTable.hpp" | |
29 #include "gc_implementation/g1/g1StringDedupThread.hpp" | |
30 #include "gc_implementation/g1/g1StringDedupQueue.hpp" | |
31 | |
32 G1StringDedupThread* G1StringDedupThread::_thread = NULL; | |
33 | |
34 G1StringDedupThread::G1StringDedupThread() : | |
35 ConcurrentGCThread() { | |
36 set_name("String Deduplication Thread"); | |
37 create_and_start(); | |
38 } | |
39 | |
40 G1StringDedupThread::~G1StringDedupThread() { | |
41 ShouldNotReachHere(); | |
42 } | |
43 | |
44 void G1StringDedupThread::create() { | |
45 assert(G1StringDedup::is_enabled(), "String deduplication not enabled"); | |
46 assert(_thread == NULL, "One string deduplication thread allowed"); | |
47 _thread = new G1StringDedupThread(); | |
48 } | |
49 | |
50 G1StringDedupThread* G1StringDedupThread::thread() { | |
51 assert(G1StringDedup::is_enabled(), "String deduplication not enabled"); | |
52 assert(_thread != NULL, "String deduplication thread not created"); | |
53 return _thread; | |
54 } | |
55 | |
56 void G1StringDedupThread::print_on(outputStream* st) const { | |
57 st->print("\"%s\" ", name()); | |
58 Thread::print_on(st); | |
59 st->cr(); | |
60 } | |
61 | |
62 void G1StringDedupThread::run() { | |
63 G1StringDedupStat total_stat; | |
64 | |
65 initialize_in_thread(); | |
66 wait_for_universe_init(); | |
67 | |
68 // Main loop | |
69 for (;;) { | |
70 G1StringDedupStat stat; | |
71 | |
72 stat.mark_idle(); | |
73 | |
74 // Wait for the queue to become non-empty | |
75 G1StringDedupQueue::wait(); | |
17947
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
76 if (_should_terminate) { |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
77 break; |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
78 } |
17764 | 79 |
80 // Include this thread in safepoints | |
81 stsJoin(); | |
82 | |
83 stat.mark_exec(); | |
84 | |
85 // Process the queue | |
86 for (;;) { | |
87 oop java_string = G1StringDedupQueue::pop(); | |
88 if (java_string == NULL) { | |
89 break; | |
90 } | |
91 | |
92 G1StringDedupTable::deduplicate(java_string, stat); | |
93 | |
94 // Safepoint this thread if needed | |
95 if (stsShouldYield()) { | |
96 stat.mark_block(); | |
97 stsYield(NULL); | |
98 stat.mark_unblock(); | |
99 } | |
100 } | |
101 | |
102 G1StringDedupTable::trim_entry_cache(); | |
103 | |
104 stat.mark_done(); | |
105 | |
106 // Print statistics | |
107 total_stat.add(stat); | |
108 print(gclog_or_tty, stat, total_stat); | |
109 | |
110 // Exclude this thread from safepoints | |
111 stsLeave(); | |
112 } | |
113 | |
17947
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
114 terminate(); |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
115 } |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
116 |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
117 void G1StringDedupThread::stop() { |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
118 { |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
119 MonitorLockerEx ml(Terminator_lock); |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
120 _thread->_should_terminate = true; |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
121 } |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
122 |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
123 G1StringDedupQueue::cancel_wait(); |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
124 |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
125 { |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
126 MonitorLockerEx ml(Terminator_lock); |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
127 while (!_thread->_has_terminated) { |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
128 ml.wait(); |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
129 } |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
130 } |
17764 | 131 } |
132 | |
133 void G1StringDedupThread::print(outputStream* st, const G1StringDedupStat& last_stat, const G1StringDedupStat& total_stat) { | |
134 if (G1Log::fine() || PrintStringDeduplicationStatistics) { | |
135 G1StringDedupStat::print_summary(st, last_stat, total_stat); | |
136 if (PrintStringDeduplicationStatistics) { | |
137 G1StringDedupStat::print_statistics(st, last_stat, false); | |
138 G1StringDedupStat::print_statistics(st, total_stat, true); | |
139 G1StringDedupTable::print_statistics(st); | |
140 G1StringDedupQueue::print_statistics(st); | |
141 } | |
142 } | |
143 } |