< prev index next >

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

Print this page
rev 47400 : [mq]: cmpxchg_ptr
rev 47404 : [mq]: load_ptr_acquire
rev 47406 : [mq]: assembler_cmpxchg


 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     }


< prev index next >