hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
changeset 8109 26c288ddbec3
parent 8107 78e5bd944384
child 8676 9098d4e927e1
equal deleted inserted replaced
8108:b47e79fa1431 8109:26c288ddbec3
  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;