< prev index next >

src/hotspot/share/runtime/objectMonitor.inline.hpp

Print this page
rev 59376 : 8153224.v2.10.patch merged with 8153224.v2.11.patch.
rev 59377 : CR1 changes from dcubed, dholmes, eosterlund and rehn.
rev 59378 : CR changes from dholmes, dcubed; fix is_being_async_deflated() race found by eosterlund; WB_ForceSafepoint() should request a special clean up with AsyncDeflateIdleMonitors; add a barrier in install_displaced_markword_in_object() to separate the header load from the preceding loads in is_being_async_deflated().
rev 59379 : eosterlund CR - Switch from three part async deflation protocol to a two part async deflation protocol where a negative contentions field is a linearization point.

*** 65,86 **** return Atomic::load(&_owner) == DEFLATER_MARKER; } // Returns true if 'this' is being async deflated and false otherwise. inline bool ObjectMonitor::is_being_async_deflated() { ! if (AsyncDeflateIdleMonitors && ! // Check first part of the async deflation dance: ! owner_is_DEFLATER_MARKER() && ! // Check second part of the async deflation dance: ! contentions() < 0 && ! // Check third part of the async deflation dance, i.e., the ! // owner field is still DEFLATER_MARKER: ! owner_is_DEFLATER_MARKER() ! ) { ! return true; ! } ! return false; } inline void ObjectMonitor::clear() { assert(Atomic::load(&_header).value() != 0, "must be non-zero"); assert(_owner == NULL, "must be NULL: owner=" INTPTR_FORMAT, p2i(_owner)); --- 65,75 ---- return Atomic::load(&_owner) == DEFLATER_MARKER; } // Returns true if 'this' is being async deflated and false otherwise. inline bool ObjectMonitor::is_being_async_deflated() { ! return AsyncDeflateIdleMonitors && contentions() < 0; } inline void ObjectMonitor::clear() { assert(Atomic::load(&_header).value() != 0, "must be non-zero"); assert(_owner == NULL, "must be NULL: owner=" INTPTR_FORMAT, p2i(_owner));
*** 91,105 **** } inline void ObjectMonitor::clear_common() { if (AsyncDeflateIdleMonitors) { // Async deflation protocol uses the header, owner and contentions ! // fields. While the ObjectMonitor being deflated is on the global free ! // list, we leave those three fields alone; owner == DEFLATER_MARKER ! // and contentions < 0 will force any racing threads to retry. The ! // header field is used by install_displaced_markword_in_object() ! // to restore the object's header so we cannot check its value here. guarantee(_owner == NULL || _owner == DEFLATER_MARKER, "must be NULL or DEFLATER_MARKER: owner=" INTPTR_FORMAT, p2i(_owner)); } assert(contentions() <= 0, "must not be positive: contentions=%d", contentions()); --- 80,94 ---- } inline void ObjectMonitor::clear_common() { if (AsyncDeflateIdleMonitors) { // Async deflation protocol uses the header, owner and contentions ! // fields. While the ObjectMonitor being deflated is on the global ! // free list, we leave those three fields alone; contentions < 0 ! // will force any racing threads to retry. The header field is used ! // by install_displaced_markword_in_object() to restore the object's ! // header so we cannot check its value here. guarantee(_owner == NULL || _owner == DEFLATER_MARKER, "must be NULL or DEFLATER_MARKER: owner=" INTPTR_FORMAT, p2i(_owner)); } assert(contentions() <= 0, "must not be positive: contentions=%d", contentions());
< prev index next >