src/hotspot/share/prims/resolvedMethodTable.cpp
changeset 51472 eb97d1a319f9
parent 49982 9042ffe5b7fe
child 51567 0c4f2b26849e
equal deleted inserted replaced
51471:05223cebd7a2 51472:eb97d1a319f9
    55 
    55 
    56 ResolvedMethodTable::ResolvedMethodTable()
    56 ResolvedMethodTable::ResolvedMethodTable()
    57   : Hashtable<ClassLoaderWeakHandle, mtClass>(_table_size, sizeof(ResolvedMethodEntry)) { }
    57   : Hashtable<ClassLoaderWeakHandle, mtClass>(_table_size, sizeof(ResolvedMethodEntry)) { }
    58 
    58 
    59 oop ResolvedMethodTable::lookup(int index, unsigned int hash, Method* method) {
    59 oop ResolvedMethodTable::lookup(int index, unsigned int hash, Method* method) {
       
    60   assert_locked_or_safepoint(ResolvedMethodTable_lock);
    60   for (ResolvedMethodEntry* p = bucket(index); p != NULL; p = p->next()) {
    61   for (ResolvedMethodEntry* p = bucket(index); p != NULL; p = p->next()) {
    61     if (p->hash() == hash) {
    62     if (p->hash() == hash) {
    62 
    63 
    63       // Peek the object to check if it is the right target.
    64       // Peek the object to check if it is the right target.
    64       oop target = p->object_no_keepalive();
    65       oop target = p->object_no_keepalive();
   112 }
   113 }
   113 
   114 
   114 ResolvedMethodTable* ResolvedMethodTable::_the_table = NULL;
   115 ResolvedMethodTable* ResolvedMethodTable::_the_table = NULL;
   115 
   116 
   116 oop ResolvedMethodTable::find_method(Method* method) {
   117 oop ResolvedMethodTable::find_method(Method* method) {
       
   118   MutexLocker ml(ResolvedMethodTable_lock);
   117   oop entry = _the_table->lookup(method);
   119   oop entry = _the_table->lookup(method);
   118   return entry;
   120   return entry;
   119 }
   121 }
   120 
   122 
   121 oop ResolvedMethodTable::add_method(Handle resolved_method_name) {
   123 oop ResolvedMethodTable::add_method(Handle resolved_method_name) {
   142 
   144 
   143 // Removing entries
   145 // Removing entries
   144 int ResolvedMethodTable::_oops_removed = 0;
   146 int ResolvedMethodTable::_oops_removed = 0;
   145 int ResolvedMethodTable::_oops_counted = 0;
   147 int ResolvedMethodTable::_oops_counted = 0;
   146 
   148 
       
   149 // There are no dead entries at start
       
   150 bool ResolvedMethodTable::_dead_entries = false;
       
   151 
       
   152 void ResolvedMethodTable::trigger_cleanup() {
       
   153   MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
       
   154   _dead_entries = true;
       
   155   Service_lock->notify_all();
       
   156 }
       
   157 
   147 // Serially invoke removed unused oops from the table.
   158 // Serially invoke removed unused oops from the table.
   148 // This is done late during GC.
   159 // This is done by the ServiceThread after being notified on class unloading
   149 void ResolvedMethodTable::unlink() {
   160 void ResolvedMethodTable::unlink() {
       
   161   MutexLocker ml(ResolvedMethodTable_lock);
   150   _oops_removed = 0;
   162   _oops_removed = 0;
   151   _oops_counted = 0;
   163   _oops_counted = 0;
   152   for (int i = 0; i < _the_table->table_size(); ++i) {
   164   for (int i = 0; i < _the_table->table_size(); ++i) {
   153     ResolvedMethodEntry** p = _the_table->bucket_addr(i);
   165     ResolvedMethodEntry** p = _the_table->bucket_addr(i);
   154     ResolvedMethodEntry* entry = _the_table->bucket(i);
   166     ResolvedMethodEntry* entry = _the_table->bucket(i);
   171       entry = (ResolvedMethodEntry*)HashtableEntry<ClassLoaderWeakHandle, mtClass>::make_ptr(*p);
   183       entry = (ResolvedMethodEntry*)HashtableEntry<ClassLoaderWeakHandle, mtClass>::make_ptr(*p);
   172     }
   184     }
   173   }
   185   }
   174   log_debug(membername, table) ("ResolvedMethod entries counted %d removed %d",
   186   log_debug(membername, table) ("ResolvedMethod entries counted %d removed %d",
   175                                 _oops_counted, _oops_removed);
   187                                 _oops_counted, _oops_removed);
       
   188   _dead_entries = false;
   176 }
   189 }
   177 
   190 
   178 #ifndef PRODUCT
   191 #ifndef PRODUCT
   179 void ResolvedMethodTable::print() {
   192 void ResolvedMethodTable::print() {
       
   193   MutexLocker ml(ResolvedMethodTable_lock);
   180   for (int i = 0; i < table_size(); ++i) {
   194   for (int i = 0; i < table_size(); ++i) {
   181     ResolvedMethodEntry* entry = bucket(i);
   195     ResolvedMethodEntry* entry = bucket(i);
   182     while (entry != NULL) {
   196     while (entry != NULL) {
   183       tty->print("%d : ", i);
   197       tty->print("%d : ", i);
   184       oop rmethod_name = entry->object_no_keepalive();
   198       oop rmethod_name = entry->object_no_keepalive();