< prev index next >

src/share/vm/runtime/mutex.hpp

Print this page
rev 12096 : 8166970: Adapt mutex padding according to DEFAULT_CACHE_LINE_SIZE
Reviewed-by:

*** 79,93 **** // See orderAccess.hpp. We assume throughout the VM that mutex lock and // try_lock do fence-lock-acquire, and that unlock does a release-unlock, // *in that order*. If their implementations change such that these // assumptions are violated, a whole lot of code will break. ! // The default length of monitor name is chosen to be 64 to avoid false sharing. ! static const int MONITOR_NAME_LEN = 64; ! ! class Monitor : public CHeapObj<mtInternal> { ! public: // A special lock: Is a lock where you are guaranteed not to block while you are // holding it, i.e., no vm operation can happen, taking other locks, etc. // NOTE: It is critical that the rank 'special' be the lowest (earliest) // (except for "event"?) for the deadlock detection to work correctly. --- 79,89 ---- // See orderAccess.hpp. We assume throughout the VM that mutex lock and // try_lock do fence-lock-acquire, and that unlock does a release-unlock, // *in that order*. If their implementations change such that these // assumptions are violated, a whole lot of code will break. ! class MonitorBase : public CHeapObj<mtInternal> { public: // A special lock: Is a lock where you are guaranteed not to block while you are // holding it, i.e., no vm operation can happen, taking other locks, etc. // NOTE: It is critical that the rank 'special' be the lowest (earliest) // (except for "event"?) for the deadlock detection to work correctly.
*** 127,153 **** ParkEvent * volatile _OnDeck ; // heir-presumptive volatile intptr_t _WaitLock [1] ; // Protects _WaitSet ParkEvent * volatile _WaitSet ; // LL of ParkEvents volatile bool _snuck; // Used for sneaky locking (evil). int NotifyCount ; // diagnostic assist - char _name[MONITOR_NAME_LEN]; // Name of mutex // Debugging fields for naming, deadlock detection, etc. (some only used in debug mode) #ifndef PRODUCT bool _allow_vm_block; debug_only(int _rank;) // rank (to avoid/detect potential deadlocks) debug_only(Monitor * _next;) // Used by a Thread to link up owned locks debug_only(Thread* _last_owner;) // the last thread to own the lock - debug_only(static bool contains(Monitor * locks, Monitor * lock);) - debug_only(static Monitor * get_least_ranked_lock(Monitor * locks);) - debug_only(Monitor * get_least_ranked_lock_besides_this(Monitor * locks);) #endif - void set_owner_implementation(Thread* owner) PRODUCT_RETURN; - void check_prelock_state (Thread* thread) PRODUCT_RETURN; - void check_block_state (Thread* thread) PRODUCT_RETURN; - // platform-dependent support code can go here (in os_<os_family>.cpp) public: enum { _no_safepoint_check_flag = true, _allow_vm_block_flag = true, --- 123,141 ----
*** 175,184 **** --- 163,194 ---- enum WaitResults { CONDVAR_EVENT, // Wait returned because of condition variable notification INTERRUPT_EVENT, // Wait returned because waiting thread was interrupted NUMBER_WAIT_RESULTS }; + }; + + class Monitor : public MonitorBase { + protected: + // The default length of monitor name is chosen to avoid false sharing. + enum { + CACHE_LINE_PADDING = DEFAULT_CACHE_LINE_SIZE - sizeof(MonitorBase), + MONITOR_NAME_LEN = CACHE_LINE_PADDING > 64 ? CACHE_LINE_PADDING : 64 + }; + char _name[MONITOR_NAME_LEN]; // Name of mutex + // Other fields should be declared in MonitorBase. + + public: + #ifndef PRODUCT + debug_only(static bool contains(Monitor * locks, Monitor * lock);) + debug_only(static Monitor * get_least_ranked_lock(Monitor * locks);) + debug_only(Monitor * get_least_ranked_lock_besides_this(Monitor * locks);) + #endif + + void set_owner_implementation(Thread* owner) PRODUCT_RETURN; + void check_prelock_state (Thread* thread) PRODUCT_RETURN; + void check_block_state (Thread* thread) PRODUCT_RETURN; private: int TrySpin (Thread * Self) ; int TryLock () ; int TryFast () ;
< prev index next >