109 // - Adjacent ObjectMonitors should be separated by enough space to avoid
110 // false sharing. This is handled by the ObjectMonitor allocation code
111 // in synchronizer.cpp. Also see TEST_VM(SynchronizerTest, sanity) gtest.
112 //
113 // Futures notes:
114 // - Separating _owner from the <remaining_fields> by enough space to
115 // avoid false sharing might be profitable. Given
116 // http://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate
117 // we know that the CAS in monitorenter will invalidate the line
118 // underlying _owner. We want to avoid an L1 data cache miss on that
119 // same line for monitorexit. Putting these <remaining_fields>:
120 // _recursions, _EntryList, _cxq, and _succ, all of which may be
121 // fetched in the inflated unlock path, on a different cache line
122 // would make them immune to CAS-based invalidation from the _owner
123 // field.
124 //
125 // - The _recursions field should be of type int, or int32_t but not
126 // intptr_t. There's no reason to use a 64-bit type for this field
127 // in a 64-bit JVM.
128
129 class ObjectMonitor {
130 public:
131 enum {
132 OM_OK, // no error
133 OM_SYSTEM_ERROR, // operating system error
134 OM_ILLEGAL_MONITOR_STATE, // IllegalMonitorStateException
135 OM_INTERRUPTED, // Thread.interrupt()
136 OM_TIMED_OUT // Object.wait() timed out
137 };
138
139 private:
140 friend class ObjectMonitorHandle;
141 friend class ObjectSynchronizer;
142 friend class ObjectWaiter;
143 friend class VMStructs;
144 JVMCI_ONLY(friend class JVMCIVMStructs;)
145
146 // The sync code expects the header field to be at offset zero (0).
147 // Enforced by the assert() in header_addr().
148 volatile markWord _header; // displaced object header word - mark
149 void* volatile _object; // backward object pointer - strong root
150 public:
151 ObjectMonitor* _next_om; // Next ObjectMonitor* linkage
152 private:
153 // Separate _header and _owner on different cache lines since both can
154 // have busy multi-threaded access. _header and _object are set at
155 // initial inflation and _object doesn't change until deflation so
156 // _object is a good choice to share the cache line with _header.
157 // _next_om shares _header's cache line for pre-monitor list historical
158 // reasons. _next_om only changes if the next ObjectMonitor is deflated.
159 DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE,
160 sizeof(volatile markWord) + sizeof(void* volatile) +
161 sizeof(ObjectMonitor *));
162 // Used by async deflation as a marker in the _owner field:
163 #define DEFLATER_MARKER reinterpret_cast<void*>(-1)
164 protected: // protected for JvmtiRawMonitor
165 void* volatile _owner; // pointer to owning thread OR BasicLock
166 private:
167 volatile jlong _previous_owner_tid; // thread id of the previous owner of the monitor
168 protected: // protected for JvmtiRawMonitor
169 volatile intptr_t _recursions; // recursion count, 0 for first entry
170 ObjectWaiter* volatile _EntryList; // Threads blocked on entry or reentry.
171 // The list is actually composed of WaitNodes,
172 // acting as proxies for Threads.
173 private:
174 ObjectWaiter* volatile _cxq; // LL of recently-arrived threads blocked on entry.
175 Thread* volatile _succ; // Heir presumptive thread - used for futile wakeup throttling
176 Thread* volatile _Responsible;
177
178 volatile int _Spinner; // for exit->spinner handoff optimization
179 volatile int _SpinDuration;
180
181 volatile jint _contentions; // Number of active contentions in enter(). It is used by is_busy()
182 // along with other fields to determine if an ObjectMonitor can be
183 // deflated. See ObjectSynchronizer::deflate_monitor() and
184 // ObjectSynchronizer::deflate_monitor_using_JT().
185 protected:
186 ObjectWaiter* volatile _WaitSet; // LL of threads wait()ing on the monitor
187 volatile jint _waiters; // number of waiting threads
188 private:
189 volatile int _WaitSetLock; // protects Wait Queue - simple spinlock
190 volatile jint _ref_count; // ref count for ObjectMonitor* and used by the async deflation
191 // protocol. See ObjectSynchronizer::deflate_monitor_using_JT().
192 typedef enum {
193 Free = 0, // Free must be 0 for monitor to be free after memset(..,0,..).
194 New,
195 Old
196 } AllocationState;
197 AllocationState _allocation_state;
198
199 public:
200 static void Initialize();
201
202 // Only perform a PerfData operation if the PerfData object has been
203 // allocated and if the PerfDataManager has not freed the PerfData
204 // objects which can happen at normal VM shutdown.
205 //
206 #define OM_PERFDATA_OP(f, op_str) \
207 do { \
208 if (ObjectMonitor::_sync_ ## f != NULL && \
209 PerfDataManager::has_PerfData()) { \
210 ObjectMonitor::_sync_ ## f->op_str; \
211 } \
212 } while (0)
213
214 static PerfCounter * _sync_ContendedLockAttempts;
215 static PerfCounter * _sync_FutileWakeups;
216 static PerfCounter * _sync_Parks;
217 static PerfCounter * _sync_Notifications;
|
109 // - Adjacent ObjectMonitors should be separated by enough space to avoid
110 // false sharing. This is handled by the ObjectMonitor allocation code
111 // in synchronizer.cpp. Also see TEST_VM(SynchronizerTest, sanity) gtest.
112 //
113 // Futures notes:
114 // - Separating _owner from the <remaining_fields> by enough space to
115 // avoid false sharing might be profitable. Given
116 // http://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate
117 // we know that the CAS in monitorenter will invalidate the line
118 // underlying _owner. We want to avoid an L1 data cache miss on that
119 // same line for monitorexit. Putting these <remaining_fields>:
120 // _recursions, _EntryList, _cxq, and _succ, all of which may be
121 // fetched in the inflated unlock path, on a different cache line
122 // would make them immune to CAS-based invalidation from the _owner
123 // field.
124 //
125 // - The _recursions field should be of type int, or int32_t but not
126 // intptr_t. There's no reason to use a 64-bit type for this field
127 // in a 64-bit JVM.
128
129 #ifndef OM_CACHE_LINE_SIZE
130 // Use DEFAULT_CACHE_LINE_SIZE if not already specified for
131 // the current build platform.
132 #define OM_CACHE_LINE_SIZE DEFAULT_CACHE_LINE_SIZE
133 #endif
134
135 class ObjectMonitor {
136 public:
137 enum {
138 OM_OK, // no error
139 OM_SYSTEM_ERROR, // operating system error
140 OM_ILLEGAL_MONITOR_STATE, // IllegalMonitorStateException
141 OM_INTERRUPTED, // Thread.interrupt()
142 OM_TIMED_OUT // Object.wait() timed out
143 };
144
145 private:
146 friend class ObjectMonitorHandle;
147 friend class ObjectSynchronizer;
148 friend class ObjectWaiter;
149 friend class VMStructs;
150 JVMCI_ONLY(friend class JVMCIVMStructs;)
151
152 // The sync code expects the header field to be at offset zero (0).
153 // Enforced by the assert() in header_addr().
154 volatile markWord _header; // displaced object header word - mark
155 void* volatile _object; // backward object pointer - strong root
156 typedef enum {
157 Free = 0, // Free must be 0 for monitor to be free after memset(..,0,..).
158 New,
159 Old
160 } AllocationState;
161 AllocationState _allocation_state;
162 public:
163 ObjectMonitor* _next_om; // Next ObjectMonitor* linkage
164 private:
165 // Separate _header and _owner on different cache lines since both can
166 // have busy multi-threaded access. _header, _object and _allocation_state
167 // are set at initial inflation. _object and _allocation_state don't
168 // change until deflation so _object and _allocation_state are good
169 // choices to share the cache line with _header. _next_om shares _header's
170 // cache line for pre-monitor list historical reasons. _next_om only
171 // changes if the next ObjectMonitor is deflated.
172 DEFINE_PAD_MINUS_SIZE(0, OM_CACHE_LINE_SIZE, sizeof(volatile markWord) +
173 sizeof(void* volatile) + sizeof(AllocationState) +
174 sizeof(ObjectMonitor*));
175 // Used by async deflation as a marker in the _owner field:
176 #define DEFLATER_MARKER reinterpret_cast<void*>(-1)
177 protected: // protected for JvmtiRawMonitor
178 void* volatile _owner; // pointer to owning thread OR BasicLock
179 private:
180 volatile jlong _previous_owner_tid; // thread id of the previous owner of the monitor
181 // Separate _owner and _ref_count on different cache lines since both
182 // can have busy multi-threaded access. _previous_owner_tid is only
183 // changed by ObjectMonitor::exit() so it is a good choice to share the
184 // cache line with _owner.
185 DEFINE_PAD_MINUS_SIZE(1, OM_CACHE_LINE_SIZE, sizeof(void* volatile) +
186 sizeof(volatile jlong));
187 volatile jint _ref_count; // ref count for ObjectMonitor* and used by the async deflation
188 // protocol. See ObjectSynchronizer::deflate_monitor_using_JT().
189 protected: // protected for JvmtiRawMonitor
190 volatile intptr_t _recursions; // recursion count, 0 for first entry
191 ObjectWaiter* volatile _EntryList; // Threads blocked on entry or reentry.
192 // The list is actually composed of WaitNodes,
193 // acting as proxies for Threads.
194 private:
195 ObjectWaiter* volatile _cxq; // LL of recently-arrived threads blocked on entry.
196 Thread* volatile _succ; // Heir presumptive thread - used for futile wakeup throttling
197 Thread* volatile _Responsible;
198
199 volatile int _Spinner; // for exit->spinner handoff optimization
200 volatile int _SpinDuration;
201
202 volatile jint _contentions; // Number of active contentions in enter(). It is used by is_busy()
203 // along with other fields to determine if an ObjectMonitor can be
204 // deflated. See ObjectSynchronizer::deflate_monitor() and
205 // ObjectSynchronizer::deflate_monitor_using_JT().
206 protected:
207 ObjectWaiter* volatile _WaitSet; // LL of threads wait()ing on the monitor
208 volatile jint _waiters; // number of waiting threads
209 private:
210 volatile int _WaitSetLock; // protects Wait Queue - simple spinlock
211
212 public:
213 static void Initialize();
214
215 // Only perform a PerfData operation if the PerfData object has been
216 // allocated and if the PerfDataManager has not freed the PerfData
217 // objects which can happen at normal VM shutdown.
218 //
219 #define OM_PERFDATA_OP(f, op_str) \
220 do { \
221 if (ObjectMonitor::_sync_ ## f != NULL && \
222 PerfDataManager::has_PerfData()) { \
223 ObjectMonitor::_sync_ ## f->op_str; \
224 } \
225 } while (0)
226
227 static PerfCounter * _sync_ContendedLockAttempts;
228 static PerfCounter * _sync_FutileWakeups;
229 static PerfCounter * _sync_Parks;
230 static PerfCounter * _sync_Notifications;
|