equal
deleted
inserted
replaced
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(); |