< prev index next >

src/hotspot/share/gc/z/zNMethodTable.cpp


261 
262     index = next_index(index, size);                                                                                                 
263   }                                                                                                                                  
264 }                                                                                                                                    
265 
266 void ZNMethodTable::unregister_entry(ZNMethodTableEntry* table, size_t size, nmethod* nm) {                                          
267   if (size == 0) {                                                                                                                   
268     // Table is empty                                                                                                                
269     return;                                                                                                                          
270   }                                                                                                                                  
271 
272   size_t index = first_index(nm, size);                                                                                              
273 
274   for (;;) {                                                                                                                         
275     const ZNMethodTableEntry table_entry = table[index];                                                                             
276     assert(table_entry.registered() || table_entry.unregistered(), "Entry not found");                                               
277 
278     if (table_entry.registered() && table_entry.method() == nm) {                                                                    
279       // Remove entry                                                                                                                
280       table[index] = ZNMethodTableEntry(true /* unregistered */);                                                                    
281                                                                                                                                      
282       // Destroy GC data                                                                                                             
283       ZNMethodData::destroy(gc_data(nm));                                                                                            
284       set_gc_data(nm, NULL);                                                                                                         
285       return;                                                                                                                        
286     }                                                                                                                                
287 
288     index = next_index(index, size);                                                                                                 
289   }                                                                                                                                  
290 }                                                                                                                                    
291 
292 void ZNMethodTable::rebuild(size_t new_size) {                                                                                       
293   ZLocker<ZLock> locker(&_iter_lock);                                                                                                
294   assert(is_power_of_2(new_size), "Invalid size");                                                                                   
295 
296   log_debug(gc, nmethod)("Rebuilding NMethod Table: "                                                                                
297                          SIZE_FORMAT "->" SIZE_FORMAT " entries, "                                                                   
298                          SIZE_FORMAT "(%.0lf%%->%.0lf%%) registered, "                                                               
299                          SIZE_FORMAT "(%.0lf%%->%.0lf%%) unregistered",                                                              
300                          _size, new_size,                                                                                            
301                          _nregistered, percent_of(_nregistered, _size), percent_of(_nregistered, new_size),                          
302                          _nunregistered, percent_of(_nunregistered, _size), 0.0);                                                    
303 

261 
262     index = next_index(index, size);
263   }
264 }
265 
266 void ZNMethodTable::unregister_entry(ZNMethodTableEntry* table, size_t size, nmethod* nm) {
267   if (size == 0) {
268     // Table is empty
269     return;
270   }
271 
272   size_t index = first_index(nm, size);
273 
274   for (;;) {
275     const ZNMethodTableEntry table_entry = table[index];
276     assert(table_entry.registered() || table_entry.unregistered(), "Entry not found");
277 
278     if (table_entry.registered() && table_entry.method() == nm) {
279       // Remove entry
280       table[index] = ZNMethodTableEntry(true /* unregistered */);




281       return;
282     }
283 
284     index = next_index(index, size);
285   }
286 }
287 
288 void ZNMethodTable::rebuild(size_t new_size) {
289   ZLocker<ZLock> locker(&_iter_lock);
290   assert(is_power_of_2(new_size), "Invalid size");
291 
292   log_debug(gc, nmethod)("Rebuilding NMethod Table: "
293                          SIZE_FORMAT "->" SIZE_FORMAT " entries, "
294                          SIZE_FORMAT "(%.0lf%%->%.0lf%%) registered, "
295                          SIZE_FORMAT "(%.0lf%%->%.0lf%%) unregistered",
296                          _size, new_size,
297                          _nregistered, percent_of(_nregistered, _size), percent_of(_nregistered, new_size),
298                          _nunregistered, percent_of(_nunregistered, _size), 0.0);
299 

447   }                                                                                                                                  
448 
449   while (_iter_table != NULL) {                                                                                                      
450     MutexUnlockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);                                                             
451     os::naked_short_sleep(1);                                                                                                        
452   }                                                                                                                                  
453 }                                                                                                                                    
454 
455 void ZNMethodTable::unregister_nmethod(nmethod* nm) {                                                                                
456   assert(CodeCache_lock->owned_by_self(), "Lock must be held");                                                                      
457   ResourceMark rm;                                                                                                                   
458 
459   sweeper_wait_for_iteration();                                                                                                      
460 
461   log_unregister(nm);                                                                                                                
462 
463   // Remove entry                                                                                                                    
464   unregister_entry(_table, _size, nm);                                                                                               
465   _nunregistered++;                                                                                                                  
466   _nregistered--;                                                                                                                    
                                                                                                                                     
                                                                                                                                     
                                                                                                                                     
                                                                                                                                     
                                                                                                                                     
467 }                                                                                                                                    
468 
469 void ZNMethodTable::disarm_nmethod(nmethod* nm) {                                                                                    
470   BarrierSetNMethod* const bs = BarrierSet::barrier_set()->barrier_set_nmethod();                                                    
471   if (bs != NULL) {                                                                                                                  
472     bs->disarm(nm);                                                                                                                  
473   }                                                                                                                                  
474 }                                                                                                                                    
475 
476 void ZNMethodTable::nmethod_entries_do_begin() {                                                                                     
477   MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);                                                                 
478   ZLocker<ZLock> locker(&_iter_lock);                                                                                                
479 
480   // Prepare iteration                                                                                                               
481   _iter_table = _table;                                                                                                              
482   _iter_table_size = _size;                                                                                                          
483   _claimed = 0;                                                                                                                      
484   assert(_iter_deferred_deletes.is_empty(), "Should be emtpy");                                                                      
485 }                                                                                                                                    

443   }
444 
445   while (_iter_table != NULL) {
446     MutexUnlockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
447     os::naked_short_sleep(1);
448   }
449 }
450 
451 void ZNMethodTable::unregister_nmethod(nmethod* nm) {
452   assert(CodeCache_lock->owned_by_self(), "Lock must be held");
453   ResourceMark rm;
454 
455   sweeper_wait_for_iteration();
456 
457   log_unregister(nm);
458 
459   // Remove entry
460   unregister_entry(_table, _size, nm);
461   _nunregistered++;
462   _nregistered--;
463 }
464 
465 void ZNMethodTable::flush_nmethod(nmethod* nm) {
466   // Destroy GC data
467   ZNMethodData::destroy(gc_data(nm));
468 }
469 
470 void ZNMethodTable::disarm_nmethod(nmethod* nm) {
471   BarrierSetNMethod* const bs = BarrierSet::barrier_set()->barrier_set_nmethod();
472   if (bs != NULL) {
473     bs->disarm(nm);
474   }
475 }
476 
477 void ZNMethodTable::nmethod_entries_do_begin() {
478   MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
479   ZLocker<ZLock> locker(&_iter_lock);
480 
481   // Prepare iteration
482   _iter_table = _table;
483   _iter_table_size = _size;
484   _claimed = 0;
485   assert(_iter_deferred_deletes.is_empty(), "Should be emtpy");
486 }
< prev index next >