1 /*
2  * Copyright (c) 2018, 2019, 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 #ifndef SHARE_GC_SHARED_STRINGDEDUP_STRINGDEDUPTHREAD_INLINE_HPP
26 #define SHARE_GC_SHARED_STRINGDEDUP_STRINGDEDUPTHREAD_INLINE_HPP
27 
28 #include "gc/shared/suspendibleThreadSet.hpp"
29 #include "gc/shared/stringdedup/stringDedupQueue.inline.hpp"
30 #include "gc/shared/stringdedup/stringDedupThread.hpp"
31 
32 template <typename S>
do_deduplication()33 void StringDedupThreadImpl<S>::do_deduplication() {
34   S total_stat;
35 
36   {
37     // Block safepoints while deduplicating shared strings
38     SuspendibleThreadSetJoiner sts_join;
39     deduplicate_shared_strings(&total_stat);
40   }
41 
42   // Main loop
43   for (;;) {
44     S stat;
45 
46     stat.mark_idle();
47 
48     // Wait for the queue to become non-empty
49     StringDedupQueue::wait();
50     if (this->should_terminate()) {
51       break;
52     }
53 
54     {
55       // Include thread in safepoints
56       SuspendibleThreadSetJoiner sts_join;
57 
58       stat.mark_exec();
59       StringDedupStat::print_start(&stat);
60 
61       // Process the queue
62       for (;;) {
63         oop java_string = StringDedupQueue::pop();
64         if (java_string == NULL) {
65           break;
66         }
67 
68         StringDedupTable::deduplicate(java_string, &stat);
69 
70         // Safepoint this thread if needed
71         if (sts_join.should_yield()) {
72           stat.mark_block();
73           sts_join.yield();
74           stat.mark_unblock();
75         }
76       }
77 
78       stat.mark_done();
79 
80       total_stat.add(&stat);
81       print_end(&stat, &total_stat);
82       stat.reset();
83     }
84 
85     StringDedupTable::clean_entry_cache();
86   }
87 }
88 
89 template <typename S>
create()90 void StringDedupThreadImpl<S>::create() {
91   assert(_thread == NULL, "One string deduplication thread allowed");
92   _thread = new StringDedupThreadImpl<S>();
93 }
94 
95 #endif // SHARE_GC_SHARED_STRINGDEDUP_STRINGDEDUPTHREAD_INLINE_HPP
96