< prev index next >
src/hotspot/share/prims/resolvedMethodTable.cpp
Print this page
@@ -55,10 +55,11 @@
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,10 +113,11 @@
}
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,13 +144,23 @@
// 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,14 +183,16 @@
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 >