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;
218 static PerfCounter * _sync_Inflations;
219 static PerfCounter * _sync_Deflations;
|
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 // Separate _header and _owner on different cache lines since both can
163 // have busy multi-threaded access. _header, _object and _allocation_state
164 // are set at initial inflation. _object and _allocation_state don't
165 // change until deflation so _object and _allocation_state are good
166 // choices to share the cache line with _header.
167 DEFINE_PAD_MINUS_SIZE(0, OM_CACHE_LINE_SIZE, sizeof(volatile markWord) +
168 sizeof(void* volatile) + sizeof(AllocationState));
169 // Used by async deflation as a marker in the _owner field:
170 #define DEFLATER_MARKER reinterpret_cast<void*>(-1)
171 protected: // protected for JvmtiRawMonitor
172 void* volatile _owner; // pointer to owning thread OR BasicLock
173 private:
174 volatile jlong _previous_owner_tid; // thread id of the previous owner of the monitor
175 // Separate _owner and _ref_count on different cache lines since both
176 // can have busy multi-threaded access. _previous_owner_tid is only
177 // changed by ObjectMonitor::exit() so it is a good choice to share the
178 // cache line with _owner.
179 DEFINE_PAD_MINUS_SIZE(1, OM_CACHE_LINE_SIZE, sizeof(void* volatile) +
180 sizeof(volatile jlong));
181 volatile jint _ref_count; // ref count for ObjectMonitor* and used by the async deflation
182 // protocol. See ObjectSynchronizer::deflate_monitor_using_JT().
183 private:
184 // Separate _ref_count and _next_om on different cache lines since
185 // both can have busy multi-threaded access.
186 DEFINE_PAD_MINUS_SIZE(2, OM_CACHE_LINE_SIZE, sizeof(volatile jint));
187 public: // for static synchronizer.cpp access:
188 ObjectMonitor* volatile _next_om; // Next ObjectMonitor* linkage
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 volatile int visit_marker;
214 static void Initialize();
215
216 // Only perform a PerfData operation if the PerfData object has been
217 // allocated and if the PerfDataManager has not freed the PerfData
218 // objects which can happen at normal VM shutdown.
219 //
220 #define OM_PERFDATA_OP(f, op_str) \
221 do { \
222 if (ObjectMonitor::_sync_ ## f != NULL && \
223 PerfDataManager::has_PerfData()) { \
224 ObjectMonitor::_sync_ ## f->op_str; \
225 } \
226 } while (0)
227
228 static PerfCounter * _sync_ContendedLockAttempts;
229 static PerfCounter * _sync_FutileWakeups;
230 static PerfCounter * _sync_Parks;
231 static PerfCounter * _sync_Notifications;
232 static PerfCounter * _sync_Inflations;
233 static PerfCounter * _sync_Deflations;
|