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 } |