annotate src/share/vm/gc_implementation/g1/g1StringDedup.hpp @ 20211:82693fb204a5

8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet Summary: The test incorrectly assumed that it had been started with no other previous compilation activity. Fix this by allowing multiple code root free chunk lists, and use one separate from the global one to perform the test. Reviewed-by: brutisso
author tschatzl
date Wed, 16 Apr 2014 10:14:50 +0200
parents 1772223a25a2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
1 /*
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
4 *
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
7 * published by the Free Software Foundation.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
8 *
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
13 * accompanied this code).
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
14 *
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
18 *
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
21 * questions.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
22 *
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
23 */
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
24
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUP_HPP
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUP_HPP
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
27
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
28 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
29 // String Deduplication
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
30 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
31 // String deduplication aims to reduce the heap live-set by deduplicating identical
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
32 // instances of String so that they share the same backing character array.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
33 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
34 // The deduplication process is divided in two main parts, 1) finding the objects to
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
35 // deduplicate, and 2) deduplicating those objects. The first part is done as part of
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
36 // a normal GC cycle when objects are marked or evacuated. At this time a check is
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
37 // applied on each object to check if it is a candidate for deduplication. If so, the
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
38 // object is placed on the deduplication queue for later processing. The second part,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
39 // processing the objects on the deduplication queue, is a concurrent phase which
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
40 // starts right after the stop-the-wold marking/evacuation phase. This phase is
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
41 // executed by the deduplication thread, which pulls deduplication candidates of the
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
42 // deduplication queue and tries to deduplicate them.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
43 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
44 // A deduplication hashtable is used to keep track of all unique character arrays
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
45 // used by String objects. When deduplicating, a lookup is made in this table to see
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
46 // if there is already an identical character array somewhere on the heap. If so, the
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
47 // String object is adjusted to point to that character array, releasing the reference
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
48 // to the original array allowing it to eventually be garbage collected. If the lookup
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
49 // fails the character array is instead inserted into the hashtable so that this array
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
50 // can be shared at some point in the future.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
51 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
52 // Candidate selection
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
53 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
54 // An object is considered a deduplication candidate if all of the following
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
55 // statements are true:
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
56 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
57 // - The object is an instance of java.lang.String
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
58 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
59 // - The object is being evacuated from a young heap region
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
60 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
61 // - The object is being evacuated to a young/survivor heap region and the
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
62 // object's age is equal to the deduplication age threshold
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
63 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
64 // or
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
65 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
66 // The object is being evacuated to an old heap region and the object's age is
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
67 // less than the deduplication age threshold
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
68 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
69 // Once an string object has been promoted to an old region, or its age is higher
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
70 // than the deduplication age threshold, is will never become a candidate again.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
71 // This approach avoids making the same object a candidate more than once.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
72 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
73 // Interned strings are a bit special. They are explicitly deduplicated just before
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
74 // being inserted into the StringTable (to avoid counteracting C2 optimizations done
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
75 // on string literals), then they also become deduplication candidates if they reach
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
76 // the deduplication age threshold or are evacuated to an old heap region. The second
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
77 // attempt to deduplicate such strings will be in vain, but we have no fast way of
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
78 // filtering them out. This has not shown to be a problem, as the number of interned
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
79 // strings is usually dwarfed by the number of normal (non-interned) strings.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
80 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
81 // For additional information on string deduplication, please see JEP 192,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
82 // http://openjdk.java.net/jeps/192
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
83 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
84
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
85 #include "memory/allocation.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
86 #include "oops/oop.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
87
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
88 class OopClosure;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
89 class BoolObjectClosure;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
90 class ThreadClosure;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
91 class outputStream;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
92 class G1StringDedupTable;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
93
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
94 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
95 // Main interface for interacting with string deduplication.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
96 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
97 class G1StringDedup : public AllStatic {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
98 private:
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
99 // Single state for checking if both G1 and string deduplication is enabled.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
100 static bool _enabled;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
101
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
102 // Candidate selection policies, returns true if the given object is
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
103 // candidate for string deduplication.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
104 static bool is_candidate_from_mark(oop obj);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
105 static bool is_candidate_from_evacuation(bool from_young, bool to_young, oop obj);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
106
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
107 public:
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
108 // Returns true if both G1 and string deduplication is enabled.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
109 static bool is_enabled() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
110 return _enabled;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
111 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
112
17947
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
113 // Initialize string deduplication.
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
114 static void initialize();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
115
17947
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
116 // Stop the deduplication thread.
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
117 static void stop();
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
118
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
119 // Immediately deduplicates the given String object, bypassing the
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
120 // the deduplication queue.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
121 static void deduplicate(oop java_string);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
122
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
123 // Enqueues a deduplication candidate for later processing by the deduplication
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
124 // thread. Before enqueuing, these functions apply the appropriate candidate
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
125 // selection policy to filters out non-candidates.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
126 static void enqueue_from_mark(oop java_string);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
127 static void enqueue_from_evacuation(bool from_young, bool to_young,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
128 unsigned int queue, oop java_string);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
129
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
130 static void oops_do(OopClosure* keep_alive);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
131 static void unlink(BoolObjectClosure* is_alive);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
132 static void unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
133 bool allow_resize_and_rehash = true);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
134
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
135 static void threads_do(ThreadClosure* tc);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
136 static void print_worker_threads_on(outputStream* st);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
137 static void verify();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
138 };
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
139
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
140 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
141 // This closure encapsulates the state and the closures needed when scanning
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
142 // the deduplication queue and table during the unlink_or_oops_do() operation.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
143 // A single instance of this closure is created and then shared by all worker
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
144 // threads participating in the scan. The _next_queue and _next_bucket fields
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
145 // provide a simple mechanism for GC workers to claim exclusive access to a
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
146 // queue or a table partition.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
147 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
148 class G1StringDedupUnlinkOrOopsDoClosure : public StackObj {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
149 private:
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
150 BoolObjectClosure* _is_alive;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
151 OopClosure* _keep_alive;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
152 G1StringDedupTable* _resized_table;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
153 G1StringDedupTable* _rehashed_table;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
154 size_t _next_queue;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
155 size_t _next_bucket;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
156
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
157 public:
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
158 G1StringDedupUnlinkOrOopsDoClosure(BoolObjectClosure* is_alive,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
159 OopClosure* keep_alive,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
160 bool allow_resize_and_rehash);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
161 ~G1StringDedupUnlinkOrOopsDoClosure();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
162
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
163 bool is_resizing() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
164 return _resized_table != NULL;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
165 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
166
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
167 G1StringDedupTable* resized_table() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
168 return _resized_table;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
169 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
170
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
171 bool is_rehashing() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
172 return _rehashed_table != NULL;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
173 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
174
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
175 // Atomically claims the next available queue for exclusive access by
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
176 // the current thread. Returns the queue number of the claimed queue.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
177 size_t claim_queue() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
178 return (size_t)Atomic::add_ptr(1, &_next_queue) - 1;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
179 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
180
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
181 // Atomically claims the next available table partition for exclusive
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
182 // access by the current thread. Returns the table bucket number where
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
183 // the claimed partition starts.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
184 size_t claim_table_partition(size_t partition_size) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
185 return (size_t)Atomic::add_ptr(partition_size, &_next_bucket) - partition_size;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
186 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
187
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
188 // Applies and returns the result from the is_alive closure, or
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
189 // returns true if no such closure was provided.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
190 bool is_alive(oop o) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
191 if (_is_alive != NULL) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
192 return _is_alive->do_object_b(o);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
193 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
194 return true;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
195 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
196
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
197 // Applies the keep_alive closure, or does nothing if no such
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
198 // closure was provided.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
199 void keep_alive(oop* p) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
200 if (_keep_alive != NULL) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
201 _keep_alive->do_oop(p);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
202 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
203 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
204 };
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
205
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
206 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUP_HPP