< prev index next >

src/hotspot/share/gc/g1/g1CodeCacheRemSet.cpp

Print this page




 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     }


< prev index next >