8184181: Use oopDesc::cas_set_mark() instead of raw CAS when accessing oop header
Reviewed-by: dcubed, kbarrett
This commit is contained in:
parent
63ac8937a1
commit
1772da638b
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -579,7 +579,7 @@ BiasedLocking::Condition BiasedLocking::revoke_and_rebias(Handle obj, bool attem
|
|||||||
// the bias of the object.
|
// the bias of the object.
|
||||||
markOop biased_value = mark;
|
markOop biased_value = mark;
|
||||||
markOop unbiased_prototype = markOopDesc::prototype()->set_age(mark->age());
|
markOop unbiased_prototype = markOopDesc::prototype()->set_age(mark->age());
|
||||||
markOop res_mark = (markOop) Atomic::cmpxchg_ptr(unbiased_prototype, obj->mark_addr(), mark);
|
markOop res_mark = obj->cas_set_mark(unbiased_prototype, mark);
|
||||||
if (res_mark == biased_value) {
|
if (res_mark == biased_value) {
|
||||||
return BIAS_REVOKED;
|
return BIAS_REVOKED;
|
||||||
}
|
}
|
||||||
@ -594,7 +594,7 @@ BiasedLocking::Condition BiasedLocking::revoke_and_rebias(Handle obj, bool attem
|
|||||||
// by another thread so we simply return and let the caller deal
|
// by another thread so we simply return and let the caller deal
|
||||||
// with it.
|
// with it.
|
||||||
markOop biased_value = mark;
|
markOop biased_value = mark;
|
||||||
markOop res_mark = (markOop) Atomic::cmpxchg_ptr(prototype_header, obj->mark_addr(), mark);
|
markOop res_mark = obj->cas_set_mark(prototype_header, mark);
|
||||||
assert(!(*(obj->mark_addr()))->has_bias_pattern(), "even if we raced, should still be revoked");
|
assert(!(*(obj->mark_addr()))->has_bias_pattern(), "even if we raced, should still be revoked");
|
||||||
return BIAS_REVOKED;
|
return BIAS_REVOKED;
|
||||||
} else if (prototype_header->bias_epoch() != mark->bias_epoch()) {
|
} else if (prototype_header->bias_epoch() != mark->bias_epoch()) {
|
||||||
@ -609,14 +609,14 @@ BiasedLocking::Condition BiasedLocking::revoke_and_rebias(Handle obj, bool attem
|
|||||||
assert(THREAD->is_Java_thread(), "");
|
assert(THREAD->is_Java_thread(), "");
|
||||||
markOop biased_value = mark;
|
markOop biased_value = mark;
|
||||||
markOop rebiased_prototype = markOopDesc::encode((JavaThread*) THREAD, mark->age(), prototype_header->bias_epoch());
|
markOop rebiased_prototype = markOopDesc::encode((JavaThread*) THREAD, mark->age(), prototype_header->bias_epoch());
|
||||||
markOop res_mark = (markOop) Atomic::cmpxchg_ptr(rebiased_prototype, obj->mark_addr(), mark);
|
markOop res_mark = obj->cas_set_mark(rebiased_prototype, mark);
|
||||||
if (res_mark == biased_value) {
|
if (res_mark == biased_value) {
|
||||||
return BIAS_REVOKED_AND_REBIASED;
|
return BIAS_REVOKED_AND_REBIASED;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
markOop biased_value = mark;
|
markOop biased_value = mark;
|
||||||
markOop unbiased_prototype = markOopDesc::prototype()->set_age(mark->age());
|
markOop unbiased_prototype = markOopDesc::prototype()->set_age(mark->age());
|
||||||
markOop res_mark = (markOop) Atomic::cmpxchg_ptr(unbiased_prototype, obj->mark_addr(), mark);
|
markOop res_mark = obj->cas_set_mark(unbiased_prototype, mark);
|
||||||
if (res_mark == biased_value) {
|
if (res_mark == biased_value) {
|
||||||
return BIAS_REVOKED;
|
return BIAS_REVOKED;
|
||||||
}
|
}
|
||||||
|
@ -323,7 +323,7 @@ void ObjectSynchronizer::fast_exit(oop object, BasicLock* lock, TRAPS) {
|
|||||||
// If the object is stack-locked by the current thread, try to
|
// If the object is stack-locked by the current thread, try to
|
||||||
// swing the displaced header from the BasicLock back to the mark.
|
// swing the displaced header from the BasicLock back to the mark.
|
||||||
assert(dhw->is_neutral(), "invariant");
|
assert(dhw->is_neutral(), "invariant");
|
||||||
if ((markOop) Atomic::cmpxchg_ptr(dhw, object->mark_addr(), mark) == mark) {
|
if (object->cas_set_mark(dhw, mark) == mark) {
|
||||||
TEVENT(fast_exit: release stack-lock);
|
TEVENT(fast_exit: release stack-lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -348,7 +348,7 @@ void ObjectSynchronizer::slow_enter(Handle obj, BasicLock* lock, TRAPS) {
|
|||||||
// Anticipate successful CAS -- the ST of the displaced mark must
|
// Anticipate successful CAS -- the ST of the displaced mark must
|
||||||
// be visible <= the ST performed by the CAS.
|
// be visible <= the ST performed by the CAS.
|
||||||
lock->set_displaced_header(mark);
|
lock->set_displaced_header(mark);
|
||||||
if (mark == (markOop) Atomic::cmpxchg_ptr(lock, obj()->mark_addr(), mark)) {
|
if (mark == obj()->cas_set_mark((markOop) lock, mark)) {
|
||||||
TEVENT(slow_enter: release stacklock);
|
TEVENT(slow_enter: release stacklock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -758,7 +758,7 @@ intptr_t ObjectSynchronizer::FastHashCode(Thread * Self, oop obj) {
|
|||||||
hash = get_next_hash(Self, obj); // allocate a new hash code
|
hash = get_next_hash(Self, obj); // allocate a new hash code
|
||||||
temp = mark->copy_set_hash(hash); // merge the hash code into header
|
temp = mark->copy_set_hash(hash); // merge the hash code into header
|
||||||
// use (machine word version) atomic operation to install the hash
|
// use (machine word version) atomic operation to install the hash
|
||||||
test = (markOop) Atomic::cmpxchg_ptr(temp, obj->mark_addr(), mark);
|
test = obj->cas_set_mark(temp, mark);
|
||||||
if (test == mark) {
|
if (test == mark) {
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
@ -1452,7 +1452,7 @@ ObjectMonitor* ObjectSynchronizer::inflate(Thread * Self,
|
|||||||
m->_recursions = 0;
|
m->_recursions = 0;
|
||||||
m->_SpinDuration = ObjectMonitor::Knob_SpinLimit; // Consider: maintain by type/class
|
m->_SpinDuration = ObjectMonitor::Knob_SpinLimit; // Consider: maintain by type/class
|
||||||
|
|
||||||
markOop cmp = (markOop) Atomic::cmpxchg_ptr(markOopDesc::INFLATING(), object->mark_addr(), mark);
|
markOop cmp = object->cas_set_mark(markOopDesc::INFLATING(), mark);
|
||||||
if (cmp != mark) {
|
if (cmp != mark) {
|
||||||
omRelease(Self, m, true);
|
omRelease(Self, m, true);
|
||||||
continue; // Interference -- just retry
|
continue; // Interference -- just retry
|
||||||
@ -1547,7 +1547,7 @@ ObjectMonitor* ObjectSynchronizer::inflate(Thread * Self,
|
|||||||
m->_Responsible = NULL;
|
m->_Responsible = NULL;
|
||||||
m->_SpinDuration = ObjectMonitor::Knob_SpinLimit; // consider: keep metastats by type/class
|
m->_SpinDuration = ObjectMonitor::Knob_SpinLimit; // consider: keep metastats by type/class
|
||||||
|
|
||||||
if (Atomic::cmpxchg_ptr (markOopDesc::encode(m), object->mark_addr(), mark) != mark) {
|
if (object->cas_set_mark(markOopDesc::encode(m), mark) != mark) {
|
||||||
m->set_object(NULL);
|
m->set_object(NULL);
|
||||||
m->set_owner(NULL);
|
m->set_owner(NULL);
|
||||||
m->Recycle();
|
m->Recycle();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user