1182 // set handler index |
1182 // set handler index |
1183 assert(_fingerprints->length() == _handlers->length(), "sanity check"); |
1183 assert(_fingerprints->length() == _handlers->length(), "sanity check"); |
1184 handler_index = _fingerprints->length() - 1; |
1184 handler_index = _fingerprints->length() - 1; |
1185 } |
1185 } |
1186 } |
1186 } |
1187 } else { |
1187 // Set handler under SignatureHandlerLibrary_lock |
1188 CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops()); |
|
1189 } |
|
1190 if (handler_index < 0) { |
1188 if (handler_index < 0) { |
1191 // use generic signature handler |
1189 // use generic signature handler |
1192 method->set_signature_handler(Interpreter::slow_signature_handler()); |
1190 method->set_signature_handler(Interpreter::slow_signature_handler()); |
1193 } else { |
1191 } else { |
1194 // set handler |
1192 // set handler |
1195 method->set_signature_handler(_handlers->at(handler_index)); |
1193 method->set_signature_handler(_handlers->at(handler_index)); |
1196 } |
1194 } |
|
1195 } else { |
|
1196 CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops()); |
|
1197 // use generic signature handler |
|
1198 method->set_signature_handler(Interpreter::slow_signature_handler()); |
|
1199 } |
1197 } |
1200 } |
1198 #ifdef ASSERT |
1201 #ifdef ASSERT |
1199 int handler_index, fingerprint_index; |
1202 int handler_index = -1; |
|
1203 int fingerprint_index = -2; |
1200 { |
1204 { |
1201 // '_handlers' and '_fingerprints' are 'GrowableArray's and are NOT synchronized |
1205 // '_handlers' and '_fingerprints' are 'GrowableArray's and are NOT synchronized |
1202 // in any way if accessed from multiple threads. To avoid races with another |
1206 // in any way if accessed from multiple threads. To avoid races with another |
1203 // thread which may change the arrays in the above, mutex protected block, we |
1207 // thread which may change the arrays in the above, mutex protected block, we |
1204 // have to protect this read access here with the same mutex as well! |
1208 // have to protect this read access here with the same mutex as well! |
1205 MutexLocker mu(SignatureHandlerLibrary_lock); |
1209 MutexLocker mu(SignatureHandlerLibrary_lock); |
|
1210 if (_handlers != NULL) { |
1206 handler_index = _handlers->find(method->signature_handler()); |
1211 handler_index = _handlers->find(method->signature_handler()); |
1207 fingerprint_index = _fingerprints->find(Fingerprinter(method).fingerprint()); |
1212 fingerprint_index = _fingerprints->find(Fingerprinter(method).fingerprint()); |
1208 } |
1213 } |
|
1214 } |
1209 assert(method->signature_handler() == Interpreter::slow_signature_handler() || |
1215 assert(method->signature_handler() == Interpreter::slow_signature_handler() || |
1210 handler_index == fingerprint_index, "sanity check"); |
1216 handler_index == fingerprint_index, "sanity check"); |
1211 #endif |
1217 #endif // ASSERT |
1212 } |
1218 } |
1213 |
1219 |
1214 |
1220 |
1215 BufferBlob* SignatureHandlerLibrary::_handler_blob = NULL; |
1221 BufferBlob* SignatureHandlerLibrary::_handler_blob = NULL; |
1216 address SignatureHandlerLibrary::_handler = NULL; |
1222 address SignatureHandlerLibrary::_handler = NULL; |