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