annotate src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp @ 17833:bfdf528be8e8

8038498: Fix includes and C inlining after 8035330 Summary: Change 8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure broke the debug build on AIX. The method do_oop_partial_array() is added in a header, but requires the inline function par_write_ref() through several inlined calls. In some cpp files, like arguments.cpp, par_write_ref() is not defined as the corresponding inline header and is not included. The AIX debug VM does not start because of the missing symbol. This change solves this by cleaning up include dependencies. Reviewed-by: tschatzl, stefank
author tschatzl
date Fri, 04 Apr 2014 10:43:56 +0200
parents 595c0f60d50d
children 1772223a25a2
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 #include "precompiled.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
26 #include "classfile/javaClasses.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
27 #include "gc_implementation/g1/g1StringDedupQueue.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
28 #include "memory/gcLocker.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
29 #include "runtime/mutexLocker.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
30 #include "utilities/stack.inline.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
31
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
32 G1StringDedupQueue* G1StringDedupQueue::_queue = NULL;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
33 const size_t G1StringDedupQueue::_max_size = 1000000; // Max number of elements per queue
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
34 const size_t G1StringDedupQueue::_max_cache_size = 0; // Max cache size per queue
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
35
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
36 G1StringDedupQueue::G1StringDedupQueue() :
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
37 _cursor(0),
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
38 _empty(true),
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
39 _dropped(0) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
40 _nqueues = MAX2(ParallelGCThreads, (size_t)1);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
41 _queues = NEW_C_HEAP_ARRAY(G1StringDedupWorkerQueue, _nqueues, mtGC);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
42 for (size_t i = 0; i < _nqueues; i++) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
43 new (_queues + i) G1StringDedupWorkerQueue(G1StringDedupWorkerQueue::default_segment_size(), _max_cache_size, _max_size);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
44 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
45 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
46
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
47 G1StringDedupQueue::~G1StringDedupQueue() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
48 ShouldNotReachHere();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
49 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
50
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
51 void G1StringDedupQueue::create() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
52 assert(_queue == NULL, "One string deduplication queue allowed");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
53 _queue = new G1StringDedupQueue();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
54 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
55
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
56 void G1StringDedupQueue::wait() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
57 MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
58 while (_queue->_empty) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
59 ml.wait(Mutex::_no_safepoint_check_flag);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
60 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
61 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
62
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
63 void G1StringDedupQueue::push(uint worker_id, oop java_string) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
64 assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
65 assert(worker_id < _queue->_nqueues, "Invalid queue");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
66
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
67 // Push and notify waiter
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
68 G1StringDedupWorkerQueue& worker_queue = _queue->_queues[worker_id];
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
69 if (!worker_queue.is_full()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
70 worker_queue.push(java_string);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
71 if (_queue->_empty) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
72 MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
73 if (_queue->_empty) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
74 // Mark non-empty and notify waiter
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
75 _queue->_empty = false;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
76 ml.notify();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
77 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
78 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
79 } else {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
80 // Queue is full, drop the string and update the statistics
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
81 Atomic::inc_ptr(&_queue->_dropped);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
82 }
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 oop G1StringDedupQueue::pop() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
86 assert(!SafepointSynchronize::is_at_safepoint(), "Must not be at safepoint");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
87 No_Safepoint_Verifier nsv;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
88
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
89 // Try all queues before giving up
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
90 for (size_t tries = 0; tries < _queue->_nqueues; tries++) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
91 // The cursor indicates where we left of last time
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
92 G1StringDedupWorkerQueue* queue = &_queue->_queues[_queue->_cursor];
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
93 while (!queue->is_empty()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
94 oop obj = queue->pop();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
95 // The oop we pop can be NULL if it was marked
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
96 // dead. Just ignore those and pop the next oop.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
97 if (obj != NULL) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
98 return obj;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
99 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
100 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
101
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
102 // Try next queue
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
103 _queue->_cursor = (_queue->_cursor + 1) % _queue->_nqueues;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
104 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
105
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
106 // Mark empty
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
107 _queue->_empty = true;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
108
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
109 return NULL;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
110 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
111
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
112 void G1StringDedupQueue::unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
113 // A worker thread first claims a queue, which ensures exclusive
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
114 // access to that queue, then continues to process it.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
115 for (;;) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
116 // Grab next queue to scan
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
117 size_t queue = cl->claim_queue();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
118 if (queue >= _queue->_nqueues) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
119 // End of queues
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
120 break;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
121 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
122
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
123 // Scan the queue
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
124 unlink_or_oops_do(cl, queue);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
125 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
126 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
127
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
128 void G1StringDedupQueue::unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl, size_t queue) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
129 assert(queue < _queue->_nqueues, "Invalid queue");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
130 StackIterator<oop, mtGC> iter(_queue->_queues[queue]);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
131 while (!iter.is_empty()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
132 oop* p = iter.next_addr();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
133 if (*p != NULL) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
134 if (cl->is_alive(*p)) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
135 cl->keep_alive(p);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
136 } else {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
137 // Clear dead reference
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
138 *p = NULL;
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 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
142 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
143
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
144 void G1StringDedupQueue::print_statistics(outputStream* st) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
145 st->print_cr(
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
146 " [Queue]\n"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
147 " [Dropped: "UINTX_FORMAT"]", _queue->_dropped);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
148 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
149
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
150 void G1StringDedupQueue::verify() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
151 for (size_t i = 0; i < _queue->_nqueues; i++) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
152 StackIterator<oop, mtGC> iter(_queue->_queues[i]);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
153 while (!iter.is_empty()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
154 oop obj = iter.next();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
155 if (obj != NULL) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
156 guarantee(Universe::heap()->is_in_reserved(obj), "Object must be on the heap");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
157 guarantee(!obj->is_forwarded(), "Object must not be forwarded");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
158 guarantee(java_lang_String::is_instance(obj), "Object must be a String");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
159 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
160 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
161 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
162 }