138 Entry* e = bucket(index);
139 while (e != NULL) {
140 Entry* next = e->next();
141 if (should_remove(e->literal())) {
142 remove_entry(e, previous);
143 ++num_removed;
144 } else {
145 previous = e;
146 }
147 e = next;
148 }
149 }
150 return num_removed;
151 }
152
153 G1CodeRootSet::~G1CodeRootSet() {
154 delete _table;
155 }
156
157 G1CodeRootSetTable* G1CodeRootSet::load_acquire_table() {
158 return (G1CodeRootSetTable*) OrderAccess::load_ptr_acquire(&_table);
159 }
160
161 void G1CodeRootSet::allocate_small_table() {
162 G1CodeRootSetTable* temp = new G1CodeRootSetTable(SmallSize);
163
164 OrderAccess::release_store_ptr(&_table, temp);
165 }
166
167 void G1CodeRootSetTable::purge_list_append(G1CodeRootSetTable* table) {
168 for (;;) {
169 table->_purge_next = _purge_list;
170 G1CodeRootSetTable* old = (G1CodeRootSetTable*) Atomic::cmpxchg_ptr(table, &_purge_list, table->_purge_next);
171 if (old == table->_purge_next) {
172 break;
173 }
174 }
175 }
176
177 void G1CodeRootSetTable::purge() {
178 G1CodeRootSetTable* table = _purge_list;
179 _purge_list = NULL;
180 while (table != NULL) {
181 G1CodeRootSetTable* to_purge = table;
182 table = table->_purge_next;
183 delete to_purge;
184 }
185 }
186
187 void G1CodeRootSet::move_to_large() {
188 G1CodeRootSetTable* temp = new G1CodeRootSetTable(LargeSize);
189
190 _table->copy_to(temp);
191
192 G1CodeRootSetTable::purge_list_append(_table);
193
194 OrderAccess::release_store_ptr(&_table, temp);
195 }
196
197 void G1CodeRootSet::purge() {
198 G1CodeRootSetTable::purge();
199 }
200
201 size_t G1CodeRootSet::static_mem_size() {
202 return G1CodeRootSetTable::static_mem_size();
203 }
204
205 void G1CodeRootSet::add(nmethod* method) {
206 bool added = false;
207 if (is_empty()) {
208 allocate_small_table();
209 }
210 added = _table->add(method);
211 if (added) {
212 if (_length == Threshold) {
213 move_to_large();
214 }
|
138 Entry* e = bucket(index);
139 while (e != NULL) {
140 Entry* next = e->next();
141 if (should_remove(e->literal())) {
142 remove_entry(e, previous);
143 ++num_removed;
144 } else {
145 previous = e;
146 }
147 e = next;
148 }
149 }
150 return num_removed;
151 }
152
153 G1CodeRootSet::~G1CodeRootSet() {
154 delete _table;
155 }
156
157 G1CodeRootSetTable* G1CodeRootSet::load_acquire_table() {
158 return OrderAccess::load_acquire(&_table);
159 }
160
161 void G1CodeRootSet::allocate_small_table() {
162 G1CodeRootSetTable* temp = new G1CodeRootSetTable(SmallSize);
163
164 OrderAccess::release_store(&_table, temp);
165 }
166
167 void G1CodeRootSetTable::purge_list_append(G1CodeRootSetTable* table) {
168 for (;;) {
169 table->_purge_next = _purge_list;
170 G1CodeRootSetTable* old = Atomic::cmpxchg(table, &_purge_list, table->_purge_next);
171 if (old == table->_purge_next) {
172 break;
173 }
174 }
175 }
176
177 void G1CodeRootSetTable::purge() {
178 G1CodeRootSetTable* table = _purge_list;
179 _purge_list = NULL;
180 while (table != NULL) {
181 G1CodeRootSetTable* to_purge = table;
182 table = table->_purge_next;
183 delete to_purge;
184 }
185 }
186
187 void G1CodeRootSet::move_to_large() {
188 G1CodeRootSetTable* temp = new G1CodeRootSetTable(LargeSize);
189
190 _table->copy_to(temp);
191
192 G1CodeRootSetTable::purge_list_append(_table);
193
194 OrderAccess::release_store(&_table, temp);
195 }
196
197 void G1CodeRootSet::purge() {
198 G1CodeRootSetTable::purge();
199 }
200
201 size_t G1CodeRootSet::static_mem_size() {
202 return G1CodeRootSetTable::static_mem_size();
203 }
204
205 void G1CodeRootSet::add(nmethod* method) {
206 bool added = false;
207 if (is_empty()) {
208 allocate_small_table();
209 }
210 added = _table->add(method);
211 if (added) {
212 if (_length == Threshold) {
213 move_to_large();
214 }
|