src/hotspot/share/runtime/synchronizer.cpp
changeset 59156 14fa9e70ae71
parent 58291 a013100f7a35
child 59225 80e1201f6c9a
equal deleted inserted replaced
59154:0c2e1808f800 59156:14fa9e70ae71
   357 //  2) wait on lock2
   357 //  2) wait on lock2
   358 //  3) when notified on lock2, unlock lock2
   358 //  3) when notified on lock2, unlock lock2
   359 //  4) reenter lock1 with original recursion count
   359 //  4) reenter lock1 with original recursion count
   360 //  5) lock lock2
   360 //  5) lock lock2
   361 // NOTE: must use heavy weight monitor to handle complete_exit/reenter()
   361 // NOTE: must use heavy weight monitor to handle complete_exit/reenter()
   362 intptr_t ObjectSynchronizer::complete_exit(Handle obj, TRAPS) {
   362 intx ObjectSynchronizer::complete_exit(Handle obj, TRAPS) {
   363   if (UseBiasedLocking) {
   363   if (UseBiasedLocking) {
   364     BiasedLocking::revoke(obj, THREAD);
   364     BiasedLocking::revoke(obj, THREAD);
   365     assert(!obj->mark().has_bias_pattern(), "biases should be revoked by now");
   365     assert(!obj->mark().has_bias_pattern(), "biases should be revoked by now");
   366   }
   366   }
   367 
   367 
   369 
   369 
   370   return monitor->complete_exit(THREAD);
   370   return monitor->complete_exit(THREAD);
   371 }
   371 }
   372 
   372 
   373 // NOTE: must use heavy weight monitor to handle complete_exit/reenter()
   373 // NOTE: must use heavy weight monitor to handle complete_exit/reenter()
   374 void ObjectSynchronizer::reenter(Handle obj, intptr_t recursion, TRAPS) {
   374 void ObjectSynchronizer::reenter(Handle obj, intx recursions, TRAPS) {
   375   if (UseBiasedLocking) {
   375   if (UseBiasedLocking) {
   376     BiasedLocking::revoke(obj, THREAD);
   376     BiasedLocking::revoke(obj, THREAD);
   377     assert(!obj->mark().has_bias_pattern(), "biases should be revoked by now");
   377     assert(!obj->mark().has_bias_pattern(), "biases should be revoked by now");
   378   }
   378   }
   379 
   379 
   380   ObjectMonitor* monitor = inflate(THREAD, obj(), inflate_cause_vm_internal);
   380   ObjectMonitor* monitor = inflate(THREAD, obj(), inflate_cause_vm_internal);
   381 
   381 
   382   monitor->reenter(recursion, THREAD);
   382   monitor->reenter(recursions, THREAD);
   383 }
   383 }
   384 // -----------------------------------------------------------------------------
   384 // -----------------------------------------------------------------------------
   385 // JNI locks on java objects
   385 // JNI locks on java objects
   386 // NOTE: must use heavy weight monitor to handle jni monitor enter
   386 // NOTE: must use heavy weight monitor to handle jni monitor enter
   387 void ObjectSynchronizer::jni_enter(Handle obj, TRAPS) {
   387 void ObjectSynchronizer::jni_enter(Handle obj, TRAPS) {
  1138                                     bool from_per_thread_alloc) {
  1138                                     bool from_per_thread_alloc) {
  1139   guarantee(m->header().value() == 0, "invariant");
  1139   guarantee(m->header().value() == 0, "invariant");
  1140   guarantee(m->object() == NULL, "invariant");
  1140   guarantee(m->object() == NULL, "invariant");
  1141   stringStream ss;
  1141   stringStream ss;
  1142   guarantee((m->is_busy() | m->_recursions) == 0, "freeing in-use monitor: "
  1142   guarantee((m->is_busy() | m->_recursions) == 0, "freeing in-use monitor: "
  1143             "%s, recursions=" INTPTR_FORMAT, m->is_busy_to_string(&ss),
  1143             "%s, recursions=" INTX_FORMAT, m->is_busy_to_string(&ss),
  1144             m->_recursions);
  1144             m->_recursions);
  1145   // _next_om is used for both per-thread in-use and free lists so
  1145   // _next_om is used for both per-thread in-use and free lists so
  1146   // we have to remove 'm' from the in-use list first (as needed).
  1146   // we have to remove 'm' from the in-use list first (as needed).
  1147   if (from_per_thread_alloc) {
  1147   if (from_per_thread_alloc) {
  1148     // Need to remove 'm' from om_in_use_list.
  1148     // Need to remove 'm' from om_in_use_list.