diff -r 389ec536ece9 -r 80d91e264baf hotspot/src/share/vm/runtime/objectMonitor.hpp --- a/hotspot/src/share/vm/runtime/objectMonitor.hpp Thu Nov 06 13:57:26 2014 +0000 +++ b/hotspot/src/share/vm/runtime/objectMonitor.hpp Thu Nov 06 13:05:14 2014 -0800 @@ -228,6 +228,20 @@ static int Responsible_offset_in_bytes() { return offset_of(ObjectMonitor, _Responsible); } static int Spinner_offset_in_bytes() { return offset_of(ObjectMonitor, _Spinner); } + // ObjectMonitor references can be ORed with markOopDesc::monitor_value + // as part of the ObjectMonitor tagging mechanism. When we combine an + // ObjectMonitor reference with an offset, we need to remove the tag + // value in order to generate the proper address. + // + // We can either adjust the ObjectMonitor reference and then add the + // offset or we can adjust the offset that is added to the ObjectMonitor + // reference. The latter avoids an AGI (Address Generation Interlock) + // stall so the helper macro adjusts the offset value that is returned + // to the ObjectMonitor reference manipulation code: + // + #define OM_OFFSET_NO_MONITOR_VALUE_TAG(f) \ + ((ObjectMonitor::f ## _offset_in_bytes()) - markOopDesc::monitor_value) + // Eventually we'll make provisions for multiple callbacks, but // now one will suffice. static int (*SpinCallbackFunction)(intptr_t, int);