annotate src/share/vm/gc_implementation/g1/g1CodeCacheRemSet.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 191174b49bec
children 78bbf4d43a14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
1 /*
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
4 *
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
7 * published by the Free Software Foundation.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
8 *
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
13 * accompanied this code).
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
14 *
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
18 *
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
21 * questions.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
22 *
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
23 */
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
24
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
25
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
26 #include "precompiled.hpp"
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
27 #include "code/nmethod.hpp"
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
28 #include "gc_implementation/g1/g1CodeCacheRemSet.hpp"
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
29 #include "memory/iterator.hpp"
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
30
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
31 G1CodeRootChunk::G1CodeRootChunk() : _top(NULL), _next(NULL), _prev(NULL) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
32 _top = bottom();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
33 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
34
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
35 void G1CodeRootChunk::reset() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
36 _next = _prev = NULL;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
37 _top = bottom();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
38 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
39
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
40 void G1CodeRootChunk::nmethods_do(CodeBlobClosure* cl) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
41 nmethod** cur = bottom();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
42 while (cur != _top) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
43 cl->do_code_blob(*cur);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
44 cur++;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
45 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
46 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
47
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
48 FreeList<G1CodeRootChunk> G1CodeRootSet::_free_list;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
49 size_t G1CodeRootSet::_num_chunks_handed_out = 0;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
50
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
51 G1CodeRootChunk* G1CodeRootSet::new_chunk() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
52 G1CodeRootChunk* result = _free_list.get_chunk_at_head();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
53 if (result == NULL) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
54 result = new G1CodeRootChunk();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
55 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
56 G1CodeRootSet::_num_chunks_handed_out++;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
57 result->reset();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
58 return result;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
59 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
60
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
61 void G1CodeRootSet::free_chunk(G1CodeRootChunk* chunk) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
62 _free_list.return_chunk_at_head(chunk);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
63 G1CodeRootSet::_num_chunks_handed_out--;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
64 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
65
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
66 void G1CodeRootSet::free_all_chunks(FreeList<G1CodeRootChunk>* list) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
67 G1CodeRootSet::_num_chunks_handed_out -= list->count();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
68 _free_list.prepend(list);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
69 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
70
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
71 void G1CodeRootSet::purge_chunks(size_t keep_ratio) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
72 size_t keep = G1CodeRootSet::_num_chunks_handed_out * keep_ratio / 100;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
73
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
74 if (keep >= (size_t)_free_list.count()) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
75 return;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
76 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
77
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
78 FreeList<G1CodeRootChunk> temp;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
79 temp.initialize();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
80 temp.set_size(G1CodeRootChunk::word_size());
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
81
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
82 _free_list.getFirstNChunksFromList((size_t)_free_list.count() - keep, &temp);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
83
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
84 G1CodeRootChunk* cur = temp.get_chunk_at_head();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
85 while (cur != NULL) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
86 delete cur;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
87 cur = temp.get_chunk_at_head();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
88 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
89 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
90
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
91 size_t G1CodeRootSet::static_mem_size() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
92 return sizeof(_free_list) + sizeof(_num_chunks_handed_out);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
93 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
94
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
95 size_t G1CodeRootSet::fl_mem_size() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
96 return _free_list.count() * _free_list.size();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
97 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
98
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
99 void G1CodeRootSet::initialize() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
100 _free_list.initialize();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
101 _free_list.set_size(G1CodeRootChunk::word_size());
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
102 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
103
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
104 G1CodeRootSet::G1CodeRootSet() : _list(), _length(0) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
105 _list.initialize();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
106 _list.set_size(G1CodeRootChunk::word_size());
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
107 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
108
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
109 G1CodeRootSet::~G1CodeRootSet() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
110 clear();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
111 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
112
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
113 void G1CodeRootSet::add(nmethod* method) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
114 if (!contains(method)) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
115 // Try to add the nmethod. If there is not enough space, get a new chunk.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
116 if (_list.head() == NULL || _list.head()->is_full()) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
117 G1CodeRootChunk* cur = new_chunk();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
118 _list.return_chunk_at_head(cur);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
119 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
120 bool result = _list.head()->add(method);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
121 guarantee(result, err_msg("Not able to add nmethod "PTR_FORMAT" to newly allocated chunk.", method));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
122 _length++;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
123 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
124 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
125
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
126 void G1CodeRootSet::remove(nmethod* method) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
127 G1CodeRootChunk* found = find(method);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
128 if (found != NULL) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
129 bool result = found->remove(method);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
130 guarantee(result, err_msg("could not find nmethod "PTR_FORMAT" during removal although we previously found it", method));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
131 // eventually free completely emptied chunk
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
132 if (found->is_empty()) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
133 _list.remove_chunk(found);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
134 free(found);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
135 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
136 _length--;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
137 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
138 assert(!contains(method), err_msg(PTR_FORMAT" still contains nmethod "PTR_FORMAT, this, method));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
139 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
140
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
141 nmethod* G1CodeRootSet::pop() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
142 do {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
143 G1CodeRootChunk* cur = _list.head();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
144 if (cur == NULL) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
145 assert(_length == 0, "when there are no chunks, there should be no elements");
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
146 return NULL;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
147 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
148 nmethod* result = cur->pop();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
149 if (result != NULL) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
150 _length--;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
151 return result;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
152 } else {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
153 free(_list.get_chunk_at_head());
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
154 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
155 } while (true);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
156 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
157
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
158 G1CodeRootChunk* G1CodeRootSet::find(nmethod* method) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
159 G1CodeRootChunk* cur = _list.head();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
160 while (cur != NULL) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
161 if (cur->contains(method)) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
162 return cur;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
163 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
164 cur = (G1CodeRootChunk*)cur->next();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
165 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
166 return NULL;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
167 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
168
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
169 void G1CodeRootSet::free(G1CodeRootChunk* chunk) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
170 free_chunk(chunk);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
171 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
172
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
173 bool G1CodeRootSet::contains(nmethod* method) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
174 return find(method) != NULL;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
175 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
176
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
177 void G1CodeRootSet::clear() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
178 free_all_chunks(&_list);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
179 _length = 0;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
180 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
181
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
182 void G1CodeRootSet::nmethods_do(CodeBlobClosure* blk) const {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
183 G1CodeRootChunk* cur = _list.head();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
184 while (cur != NULL) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
185 cur->nmethods_do(blk);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
186 cur = (G1CodeRootChunk*)cur->next();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
187 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
188 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
189
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
190 size_t G1CodeRootSet::mem_size() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
191 return sizeof(this) + _list.count() * _list.size();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
192 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
193
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
194 #ifndef PRODUCT
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
195
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
196 void G1CodeRootSet::test() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
197 initialize();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
198
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
199 assert(_free_list.count() == 0, "Free List must be empty");
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
200 assert(_num_chunks_handed_out == 0, "No elements must have been handed out yet");
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
201
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
202 // The number of chunks that we allocate for purge testing.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
203 size_t const num_chunks = 10;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
204 {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
205 G1CodeRootSet set1;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
206 assert(set1.is_empty(), "Code root set must be initially empty but is not.");
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
207
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
208 set1.add((nmethod*)1);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
209 assert(_num_chunks_handed_out == 1,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
210 err_msg("Must have allocated and handed out one chunk, but handed out "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
211 SIZE_FORMAT" chunks", _num_chunks_handed_out));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
212 assert(set1.length() == 1, err_msg("Added exactly one element, but set contains "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
213 SIZE_FORMAT" elements", set1.length()));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
214
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
215 // G1CodeRootChunk::word_size() is larger than G1CodeRootChunk::num_entries which
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
216 // we cannot access.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
217 for (uint i = 0; i < G1CodeRootChunk::word_size() + 1; i++) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
218 set1.add((nmethod*)1);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
219 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
220 assert(_num_chunks_handed_out == 1,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
221 err_msg("Duplicate detection must have prevented allocation of further "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
222 "chunks but contains "SIZE_FORMAT, _num_chunks_handed_out));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
223 assert(set1.length() == 1,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
224 err_msg("Duplicate detection should not have increased the set size but "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
225 "is "SIZE_FORMAT, set1.length()));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
226
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
227 size_t num_total_after_add = G1CodeRootChunk::word_size() + 1;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
228 for (size_t i = 0; i < num_total_after_add - 1; i++) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
229 set1.add((nmethod*)(2 + i));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
230 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
231 assert(_num_chunks_handed_out > 1,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
232 "After adding more code roots, more than one chunks should have been handed out");
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
233 assert(set1.length() == num_total_after_add,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
234 err_msg("After adding in total "SIZE_FORMAT" distinct code roots, they "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
235 "need to be in the set, but there are only "SIZE_FORMAT,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
236 num_total_after_add, set1.length()));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
237
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
238 size_t num_popped = 0;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
239 while (set1.pop() != NULL) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
240 num_popped++;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
241 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
242 assert(num_popped == num_total_after_add,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
243 err_msg("Managed to pop "SIZE_FORMAT" code roots, but only "SIZE_FORMAT" "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
244 "were added", num_popped, num_total_after_add));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
245 assert(_num_chunks_handed_out == 0,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
246 err_msg("After popping all elements, all chunks must have been returned "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
247 "but are still "SIZE_FORMAT, _num_chunks_handed_out));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
248
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
249 purge_chunks(0);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
250 assert(_free_list.count() == 0,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
251 err_msg("After purging everything, the free list must be empty but still "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
252 "contains "SIZE_FORMAT" chunks", _free_list.count()));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
253
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
254 // Add some more handed out chunks.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
255 size_t i = 0;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
256 while (_num_chunks_handed_out < num_chunks) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
257 set1.add((nmethod*)i);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
258 i++;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
259 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
260
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
261 {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
262 // Generate chunks on the free list.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
263 G1CodeRootSet set2;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
264 size_t i = 0;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
265 while (_num_chunks_handed_out < num_chunks * 2) {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
266 set2.add((nmethod*)i);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
267 i++;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
268 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
269 // Exit of the scope of the set2 object will call the destructor that generates
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
270 // num_chunks elements on the free list.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
271 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
272
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
273 assert(_num_chunks_handed_out == num_chunks,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
274 err_msg("Deletion of the second set must have resulted in giving back "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
275 "those, but there is still "SIZE_FORMAT" handed out, expecting "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
276 SIZE_FORMAT, _num_chunks_handed_out, num_chunks));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
277 assert((size_t)_free_list.count() == num_chunks,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
278 err_msg("After freeing "SIZE_FORMAT" chunks, they must be on the free list "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
279 "but there are only "SIZE_FORMAT, num_chunks, _free_list.count()));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
280
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
281 size_t const test_percentage = 50;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
282 purge_chunks(test_percentage);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
283 assert(_num_chunks_handed_out == num_chunks,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
284 err_msg("Purging must not hand out chunks but there are "SIZE_FORMAT,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
285 _num_chunks_handed_out));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
286 assert((size_t)_free_list.count() == (ssize_t)(num_chunks * test_percentage / 100),
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
287 err_msg("Must have purged "SIZE_FORMAT" percent of "SIZE_FORMAT" chunks"
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
288 "but there are "SSIZE_FORMAT, test_percentage, num_chunks,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
289 _free_list.count()));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
290 // Purge the remainder of the chunks on the free list.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
291 purge_chunks(0);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
292 assert(_free_list.count() == 0, "Free List must be empty");
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
293 assert(_num_chunks_handed_out == num_chunks,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
294 err_msg("Expected to be "SIZE_FORMAT" chunks handed out from the first set "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
295 "but there are "SIZE_FORMAT, num_chunks, _num_chunks_handed_out));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
296
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
297 // Exit of the scope of the set1 object will call the destructor that generates
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
298 // num_chunks additional elements on the free list.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
299 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
300
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
301 assert(_num_chunks_handed_out == 0,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
302 err_msg("Deletion of the only set must have resulted in no chunks handed "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
303 "out, but there is still "SIZE_FORMAT" handed out", _num_chunks_handed_out));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
304 assert((size_t)_free_list.count() == num_chunks,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
305 err_msg("After freeing "SIZE_FORMAT" chunks, they must be on the free list "
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
306 "but there are only "SSIZE_FORMAT, num_chunks, _free_list.count()));
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
307
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
308 // Restore initial state.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
309 purge_chunks(0);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
310 assert(_free_list.count() == 0, "Free List must be empty");
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
311 assert(_num_chunks_handed_out == 0, "No elements must have been handed out yet");
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
312 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
313
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
314 void TestCodeCacheRemSet_test() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
315 G1CodeRootSet::test();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
316 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
317 #endif