< prev index next >

src/hotspot/share/runtime/objectMonitor.hpp

Print this page
rev 54612 : Checkpoint latest preliminary review patches for full OpenJDK review; merge with 8222295.patch.
rev 54613 : imported patch dcubed.monitor_deflate_conc.v2.01
rev 54615 : imported patch dcubed.monitor_deflate_conc.v2.03

*** 166,182 **** volatile int _Spinner; // for exit->spinner handoff optimization volatile int _SpinDuration; volatile jint _contentions; // Number of active contentions in enter(). It is used by is_busy() // along with other fields to determine if an ObjectMonitor can be ! // deflated. See ObjectSynchronizer::deflate_monitor(). protected: ObjectWaiter * volatile _WaitSet; // LL of threads wait()ing on the monitor volatile jint _waiters; // number of waiting threads private: volatile int _WaitSetLock; // protects Wait Queue - simple spinlock ! volatile jint _ref_count; // ref count for ObjectMonitor* typedef enum { Free = 0, // Free must be 0 for monitor to be free after memset(..,0,..). New, Old } AllocationState; --- 166,184 ---- volatile int _Spinner; // for exit->spinner handoff optimization volatile int _SpinDuration; volatile jint _contentions; // Number of active contentions in enter(). It is used by is_busy() // along with other fields to determine if an ObjectMonitor can be ! // deflated. See ObjectSynchronizer::deflate_monitor() and ! // ObjectSynchronizer::deflate_monitor_using_JT(). protected: ObjectWaiter * volatile _WaitSet; // LL of threads wait()ing on the monitor volatile jint _waiters; // number of waiting threads private: volatile int _WaitSetLock; // protects Wait Queue - simple spinlock ! volatile jint _ref_count; // ref count for ObjectMonitor* and used by the async deflation ! // protocol. See ObjectSynchronizer::deflate_monitor_using_JT(). typedef enum { Free = 0, // Free must be 0 for monitor to be free after memset(..,0,..). New, Old } AllocationState;
*** 247,266 **** // use which is orthogonal to whether the ObjectMonitor itself // is in use for a locking operation. return _contentions|_waiters|intptr_t(_owner)|intptr_t(_cxq)|intptr_t(_EntryList); } ! // Version of is_busy() that accounts for special values in ! // _contentions and _owner when AsyncDeflateIdleMonitors is enabled. intptr_t is_busy_async() const { ! intptr_t ret_code = _waiters | intptr_t(_cxq) | intptr_t(_EntryList); if (!AsyncDeflateIdleMonitors) { ! ret_code |= _contentions | intptr_t(_owner); } else { - if (_contentions > 0) { - ret_code |= _contentions; - } if (_owner != DEFLATER_MARKER) { ret_code |= intptr_t(_owner); } } return ret_code; --- 249,265 ---- // use which is orthogonal to whether the ObjectMonitor itself // is in use for a locking operation. return _contentions|_waiters|intptr_t(_owner)|intptr_t(_cxq)|intptr_t(_EntryList); } ! // Version of is_busy() that accounts for the special value in ! // _owner when AsyncDeflateIdleMonitors is enabled. intptr_t is_busy_async() const { ! intptr_t ret_code = _contentions | _waiters | intptr_t(_cxq) | intptr_t(_EntryList); if (!AsyncDeflateIdleMonitors) { ! ret_code |= intptr_t(_owner); } else { if (_owner != DEFLATER_MARKER) { ret_code |= intptr_t(_owner); } } return ret_code;
*** 324,342 **** bool check(TRAPS); // true if the thread owns the monitor. void check_slow(TRAPS); void clear(); void clear_using_JT(); ! bool enter(TRAPS); // Returns false if monitor is being async deflated and caller should retry locking the object. void exit(bool not_suspended, TRAPS); void wait(jlong millis, bool interruptable, TRAPS); void notify(TRAPS); void notifyAll(TRAPS); // Use the following at your own risk intptr_t complete_exit(TRAPS); ! bool reenter(intptr_t recursions, TRAPS); // Returns false if monitor is being async deflated and caller should retry locking the object. private: void AddWaiter(ObjectWaiter * waiter); void INotify(Thread * Self); ObjectWaiter * DequeueWaiter(); --- 323,341 ---- bool check(TRAPS); // true if the thread owns the monitor. void check_slow(TRAPS); void clear(); void clear_using_JT(); ! void enter(TRAPS); void exit(bool not_suspended, TRAPS); void wait(jlong millis, bool interruptable, TRAPS); void notify(TRAPS); void notifyAll(TRAPS); // Use the following at your own risk intptr_t complete_exit(TRAPS); ! void reenter(intptr_t recursions, TRAPS); private: void AddWaiter(ObjectWaiter * waiter); void INotify(Thread * Self); ObjectWaiter * DequeueWaiter();
< prev index next >