--- old/src/hotspot/share/runtime/biasedLocking.cpp 2019-05-20 10:56:03.675781638 +0200 +++ new/src/hotspot/share/runtime/biasedLocking.cpp 2019-05-20 10:56:02.957757246 +0200 @@ -628,11 +628,37 @@ event->commit(); } -BiasedLocking::Condition fast_revoke(Handle obj, markOop mark, bool attempt_rebias, JavaThread* thread = NULL) { +BiasedLocking::Condition BiasedLocking::revoke_own_locks_in_handshake(Handle obj, TRAPS) { + markOop mark = obj->mark(); + + if (!mark->has_bias_pattern()) { + return NOT_BIASED; + } + + Klass *k = obj->klass(); + markOop prototype_header = k->prototype_header(); + assert(mark->biased_locker() == THREAD && + prototype_header->bias_epoch() == mark->bias_epoch(), "Revoke failed, unhandled biased lock state"); + ResourceMark rm; + log_info(biasedlocking)("Revoking bias by walking my own stack:"); + EventBiasedLockSelfRevocation event; + BiasedLocking::Condition cond = revoke_bias(obj(), false, false, (JavaThread*) THREAD, NULL); + ((JavaThread*) THREAD)->set_cached_monitor_info(NULL); + assert(cond == BIAS_REVOKED, "why not?"); + if (event.should_commit()) { + post_self_revocation_event(&event, k); + } + return cond; +} + +BiasedLocking::Condition BiasedLocking::revoke_and_rebias(Handle obj, bool attempt_rebias, TRAPS) { + assert(!SafepointSynchronize::is_at_safepoint(), "must not be called while at safepoint"); + // We can revoke the biases of anonymously-biased objects // efficiently enough that we should not cause these revocations to // update the heuristics because doing so may cause unwanted bulk // revocations (which are expensive) to occur. + markOop mark = obj->mark(); if (mark->is_biased_anonymously() && !attempt_rebias) { // We are probably trying to revoke the bias of this object due to // an identity hash code computation. Try to revoke the bias @@ -644,7 +670,7 @@ markOop unbiased_prototype = markOopDesc::prototype()->set_age(mark->age()); markOop res_mark = obj->cas_set_mark(unbiased_prototype, mark); if (res_mark == biased_value) { - return BiasedLocking::BIAS_REVOKED; + return BIAS_REVOKED; } } else if (mark->has_bias_pattern()) { Klass* k = obj->klass(); @@ -659,7 +685,7 @@ markOop biased_value = mark; markOop res_mark = obj->cas_set_mark(prototype_header, mark); assert(!obj->mark()->has_bias_pattern(), "even if we raced, should still be revoked"); - return BiasedLocking::BIAS_REVOKED; + return BIAS_REVOKED; } else if (prototype_header->bias_epoch() != mark->bias_epoch()) { // The epoch of this biasing has expired indicating that the // object is effectively unbiased. Depending on whether we need @@ -669,61 +695,23 @@ // can reach this point due to various points in the runtime // needing to revoke biases. if (attempt_rebias) { + assert(THREAD->is_Java_thread(), ""); markOop biased_value = mark; - markOop rebiased_prototype = markOopDesc::encode(thread, mark->age(), prototype_header->bias_epoch()); + markOop rebiased_prototype = markOopDesc::encode((JavaThread*) THREAD, mark->age(), prototype_header->bias_epoch()); markOop res_mark = obj->cas_set_mark(rebiased_prototype, mark); if (res_mark == biased_value) { - return BiasedLocking::BIAS_REVOKED_AND_REBIASED; + return BIAS_REVOKED_AND_REBIASED; } } else { markOop biased_value = mark; markOop unbiased_prototype = markOopDesc::prototype()->set_age(mark->age()); markOop res_mark = obj->cas_set_mark(unbiased_prototype, mark); if (res_mark == biased_value) { - return BiasedLocking::BIAS_REVOKED; + return BIAS_REVOKED; } } } } - return BiasedLocking::NOT_REVOKED; -} - -BiasedLocking::Condition BiasedLocking::revoke_own_locks_in_handshake(Handle obj, TRAPS) { - markOop mark = obj->mark(); - BiasedLocking::Condition bc = fast_revoke(obj, mark, false); - if (bc != NOT_REVOKED) { - return bc; - } - - if (!mark->has_bias_pattern()) { - return NOT_BIASED; - } - - Klass *k = obj->klass(); - markOop prototype_header = k->prototype_header(); - guarantee(mark->biased_locker() == THREAD && - prototype_header->bias_epoch() == mark->bias_epoch(), "Revoke failed, unhandled biased lock state"); - ResourceMark rm; - log_info(biasedlocking)("Revoking bias by walking my own stack:"); - EventBiasedLockSelfRevocation event; - BiasedLocking::Condition cond = revoke_bias(obj(), false, false, (JavaThread*) THREAD, NULL); - ((JavaThread*) THREAD)->set_cached_monitor_info(NULL); - assert(cond == BIAS_REVOKED, "why not?"); - if (event.should_commit()) { - post_self_revocation_event(&event, k); - } - return cond; -} - -BiasedLocking::Condition BiasedLocking::revoke_and_rebias(Handle obj, bool attempt_rebias, TRAPS) { - assert(!SafepointSynchronize::is_at_safepoint(), "must not be called while at safepoint"); - assert(!attempt_rebias || THREAD->is_Java_thread(), ""); - - markOop mark = obj->mark(); - BiasedLocking::Condition bc = fast_revoke(obj, mark, attempt_rebias, (JavaThread*) THREAD); - if (bc != NOT_REVOKED) { - return bc; - } HeuristicsResult heuristics = update_heuristics(obj(), attempt_rebias); if (heuristics == HR_NOT_BIASED) { --- old/src/hotspot/share/runtime/biasedLocking.hpp 2019-05-20 10:56:05.740851790 +0200 +++ new/src/hotspot/share/runtime/biasedLocking.hpp 2019-05-20 10:56:05.000826651 +0200 @@ -159,7 +159,6 @@ static int* slow_path_entry_count_addr(); enum Condition { - NOT_REVOKED = 0, NOT_BIASED = 1, BIAS_REVOKED = 2, BIAS_REVOKED_AND_REBIASED = 3 --- old/src/hotspot/share/runtime/deoptimization.cpp 2019-05-20 10:56:07.797921670 +0200 +++ new/src/hotspot/share/runtime/deoptimization.cpp 2019-05-20 10:56:07.045896123 +0200 @@ -1319,7 +1319,6 @@ for (int i = 0; i < len; i++) { oop obj = (objects_to_revoke->at(i))(); markOop mark = obj->mark(); - assert(!mark->has_bias_pattern() || mark->biased_locker() == thread, "Can't revoke"); BiasedLocking::revoke_own_locks_in_handshake(objects_to_revoke->at(i), thread); assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now"); } --- old/test/hotspot/jtreg/compiler/codecache/stress/UnexpectedDeoptimizationAllTest.java 2019-05-20 10:56:09.883992536 +0200 +++ new/test/hotspot/jtreg/compiler/codecache/stress/UnexpectedDeoptimizationAllTest.java 2019-05-20 10:56:09.170968314 +0200 @@ -56,7 +56,7 @@ public void run() { Helper.WHITE_BOX.deoptimizeAll(); try { - Thread.currentThread().sleep(10); + Thread.sleep(10); } catch (Exception e) { } }