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. |