< 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 ****
--- 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 late during GC.
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 >