< prev index next >

src/hotspot/share/prims/resolvedMethodTable.cpp

Print this page

        

*** 55,64 **** --- 55,65 ---- ResolvedMethodTable::ResolvedMethodTable() : Hashtable<ClassLoaderWeakHandle, mtClass>(_table_size, sizeof(ResolvedMethodEntry)) { } oop ResolvedMethodTable::lookup(int index, unsigned int hash, Method* method) { + assert_locked_or_safepoint(ResolvedMethodTable_lock); for (ResolvedMethodEntry* p = bucket(index); p != NULL; p = p->next()) { if (p->hash() == hash) { // Peek the object to check if it is the right target. oop target = p->object_no_keepalive();
*** 112,121 **** --- 113,123 ---- } ResolvedMethodTable* ResolvedMethodTable::_the_table = NULL; oop ResolvedMethodTable::find_method(Method* method) { + MutexLocker ml(ResolvedMethodTable_lock); oop entry = _the_table->lookup(method); return entry; } oop ResolvedMethodTable::add_method(Handle resolved_method_name) {
*** 142,154 **** // Removing entries int ResolvedMethodTable::_oops_removed = 0; int ResolvedMethodTable::_oops_counted = 0; // Serially invoke removed unused oops from the table. ! // This is done late during GC. void ResolvedMethodTable::unlink() { _oops_removed = 0; _oops_counted = 0; for (int i = 0; i < _the_table->table_size(); ++i) { ResolvedMethodEntry** p = _the_table->bucket_addr(i); ResolvedMethodEntry* entry = _the_table->bucket(i); --- 144,166 ---- // Removing entries int ResolvedMethodTable::_oops_removed = 0; int ResolvedMethodTable::_oops_counted = 0; + // There are no dead entries at start + bool ResolvedMethodTable::_dead_entries = false; + + void ResolvedMethodTable::trigger_cleanup() { + MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag); + _dead_entries = true; + Service_lock->notify_all(); + } + // Serially invoke removed unused oops from the table. ! // This is done by the ServiceThread after being notified on class unloading void ResolvedMethodTable::unlink() { + MutexLocker ml(ResolvedMethodTable_lock); _oops_removed = 0; _oops_counted = 0; for (int i = 0; i < _the_table->table_size(); ++i) { ResolvedMethodEntry** p = _the_table->bucket_addr(i); ResolvedMethodEntry* entry = _the_table->bucket(i);
*** 171,184 **** --- 183,198 ---- entry = (ResolvedMethodEntry*)HashtableEntry<ClassLoaderWeakHandle, mtClass>::make_ptr(*p); } } log_debug(membername, table) ("ResolvedMethod entries counted %d removed %d", _oops_counted, _oops_removed); + _dead_entries = false; } #ifndef PRODUCT void ResolvedMethodTable::print() { + MutexLocker ml(ResolvedMethodTable_lock); for (int i = 0; i < table_size(); ++i) { ResolvedMethodEntry* entry = bucket(i); while (entry != NULL) { tty->print("%d : ", i); oop rmethod_name = entry->object_no_keepalive();
< prev index next >