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