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 ObjectSynchronizer;
141 friend class ObjectWaiter;
142 friend class VMStructs;
143 JVMCI_ONLY(friend class JVMCIVMStructs;)
144
145 // The sync code expects the header field to be at offset zero (0).
146 // Enforced by the assert() in header_addr().
147 volatile markWord _header; // displaced object header word - mark
148 void* volatile _object; // backward object pointer - strong root
149 public:
150 ObjectMonitor* _next_om; // Next ObjectMonitor* linkage
151 private:
152 // Separate _header and _owner on different cache lines since both can
153 // have busy multi-threaded access. _header and _object are set at
154 // initial inflation and _object doesn't change until deflation so
155 // _object is a good choice to share the cache line with _header.
156 // _next_om shares _header's cache line for pre-monitor list historical
157 // reasons. _next_om only changes if the next ObjectMonitor is deflated.
158 DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE,
159 sizeof(volatile markWord) + sizeof(void* volatile) +
160 sizeof(ObjectMonitor *));
161 protected: // protected for JvmtiRawMonitor
162 void* volatile _owner; // pointer to owning thread OR BasicLock
163 private:
164 volatile jlong _previous_owner_tid; // thread id of the previous owner of the monitor
165 protected: // protected for JvmtiRawMonitor
166 volatile intptr_t _recursions; // recursion count, 0 for first entry
167 ObjectWaiter* volatile _EntryList; // Threads blocked on entry or reentry.
168 // The list is actually composed of WaitNodes,
169 // acting as proxies for Threads.
170 private:
171 ObjectWaiter* volatile _cxq; // LL of recently-arrived threads blocked on entry.
172 Thread* volatile _succ; // Heir presumptive thread - used for futile wakeup throttling
173 Thread* volatile _Responsible;
174
175 volatile int _Spinner; // for exit->spinner handoff optimization
176 volatile int _SpinDuration;
177
178 volatile jint _contentions; // Number of active contentions in enter(). It is used by is_busy()
179 // along with other fields to determine if an ObjectMonitor can be
180 // deflated. See ObjectSynchronizer::deflate_monitor().
181 protected:
182 ObjectWaiter* volatile _WaitSet; // LL of threads wait()ing on the monitor
183 volatile jint _waiters; // number of waiting threads
184 private:
185 volatile int _WaitSetLock; // protects Wait Queue - simple spinlock
186
187 public:
188 static void Initialize();
189
190 // Only perform a PerfData operation if the PerfData object has been
191 // allocated and if the PerfDataManager has not freed the PerfData
192 // objects which can happen at normal VM shutdown.
193 //
194 #define OM_PERFDATA_OP(f, op_str) \
195 do { \
196 if (ObjectMonitor::_sync_ ## f != NULL && \
197 PerfDataManager::has_PerfData()) { \
198 ObjectMonitor::_sync_ ## f->op_str; \
199 } \
200 } while (0)
201
202 static PerfCounter * _sync_ContendedLockAttempts;
203 static PerfCounter * _sync_FutileWakeups;
204 static PerfCounter * _sync_Parks;
205 static PerfCounter * _sync_Notifications;
206 static PerfCounter * _sync_Inflations;
207 static PerfCounter * _sync_Deflations;
227 // ObjectMonitor references can be ORed with markWord::monitor_value
228 // as part of the ObjectMonitor tagging mechanism. When we combine an
229 // ObjectMonitor reference with an offset, we need to remove the tag
230 // value in order to generate the proper address.
231 //
232 // We can either adjust the ObjectMonitor reference and then add the
233 // offset or we can adjust the offset that is added to the ObjectMonitor
234 // reference. The latter avoids an AGI (Address Generation Interlock)
235 // stall so the helper macro adjusts the offset value that is returned
236 // to the ObjectMonitor reference manipulation code:
237 //
238 #define OM_OFFSET_NO_MONITOR_VALUE_TAG(f) \
239 ((ObjectMonitor::f ## _offset_in_bytes()) - markWord::monitor_value)
240
241 markWord header() const;
242 volatile markWord* header_addr();
243 void set_header(markWord hdr);
244
245 intptr_t is_busy() const {
246 // TODO-FIXME: assert _owner == null implies _recursions = 0
247 return _contentions|_waiters|intptr_t(_owner)|intptr_t(_cxq)|intptr_t(_EntryList);
248 }
249 const char* is_busy_to_string(stringStream* ss);
250
251 intptr_t is_entered(Thread* current) const;
252
253 void* owner() const;
254 void set_owner(void* owner);
255
256 jint waiters() const;
257
258 jint contentions() const;
259 intptr_t recursions() const { return _recursions; }
260
261 // JVM/TI GetObjectMonitorUsage() needs this:
262 ObjectWaiter* first_waiter() { return _WaitSet; }
263 ObjectWaiter* next_waiter(ObjectWaiter* o) { return o->_next; }
264 Thread* thread_of_waiter(ObjectWaiter* o) { return o->_thread; }
265
266 protected:
267 // We don't typically expect or want the ctors or dtors to run.
268 // normal ObjectMonitors are type-stable and immortal.
269 ObjectMonitor() { ::memset((void*)this, 0, sizeof(*this)); }
270
271 ~ObjectMonitor() {
272 // TODO: Add asserts ...
273 // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
278 void Recycle() {
279 // TODO: add stronger asserts ...
280 // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
281 // _contentions == 0 EntryList == NULL
282 // _recursions == 0 _WaitSet == NULL
283 DEBUG_ONLY(stringStream ss;)
284 assert((is_busy() | _recursions) == 0, "freeing in-use monitor: %s, "
285 "recursions=" INTPTR_FORMAT, is_busy_to_string(&ss), _recursions);
286 _succ = NULL;
287 _EntryList = NULL;
288 _cxq = NULL;
289 _WaitSet = NULL;
290 _recursions = 0;
291 }
292
293 public:
294
295 void* object() const;
296 void* object_addr();
297 void set_object(void* obj);
298
299 // Returns true if the specified thread owns the ObjectMonitor. Otherwise
300 // returns false and throws IllegalMonitorStateException (IMSE).
301 bool check_owner(Thread* THREAD);
302 void clear();
303
304 void enter(TRAPS);
305 void exit(bool not_suspended, TRAPS);
306 void wait(jlong millis, bool interruptable, TRAPS);
307 void notify(TRAPS);
308 void notifyAll(TRAPS);
309
310 void print() const;
311 void print_on(outputStream* st) const;
312
313 // Use the following at your own risk
314 intptr_t complete_exit(TRAPS);
315 void reenter(intptr_t recursions, TRAPS);
316
317 private:
318 void AddWaiter(ObjectWaiter* waiter);
319 void INotify(Thread* self);
320 ObjectWaiter* DequeueWaiter();
321 void DequeueSpecificWaiter(ObjectWaiter* waiter);
322 void EnterI(TRAPS);
323 void ReenterI(Thread* self, ObjectWaiter* self_node);
324 void UnlinkAfterAcquire(Thread* self, ObjectWaiter* self_node);
325 int TryLock(Thread* self);
326 int NotRunnable(Thread* self, Thread * Owner);
327 int TrySpin(Thread* self);
328 void ExitEpilog(Thread* self, ObjectWaiter* Wakee);
329 bool ExitSuspendEquivalent(JavaThread* self);
330 };
331
332 #endif // SHARE_RUNTIME_OBJECTMONITOR_HPP
|
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;
253 // ObjectMonitor references can be ORed with markWord::monitor_value
254 // as part of the ObjectMonitor tagging mechanism. When we combine an
255 // ObjectMonitor reference with an offset, we need to remove the tag
256 // value in order to generate the proper address.
257 //
258 // We can either adjust the ObjectMonitor reference and then add the
259 // offset or we can adjust the offset that is added to the ObjectMonitor
260 // reference. The latter avoids an AGI (Address Generation Interlock)
261 // stall so the helper macro adjusts the offset value that is returned
262 // to the ObjectMonitor reference manipulation code:
263 //
264 #define OM_OFFSET_NO_MONITOR_VALUE_TAG(f) \
265 ((ObjectMonitor::f ## _offset_in_bytes()) - markWord::monitor_value)
266
267 markWord header() const;
268 volatile markWord* header_addr();
269 void set_header(markWord hdr);
270
271 intptr_t is_busy() const {
272 // TODO-FIXME: assert _owner == null implies _recursions = 0
273 // We do not include _ref_count in the is_busy() check because
274 // _ref_count is for indicating that the ObjectMonitor* is in
275 // use which is orthogonal to whether the ObjectMonitor itself
276 // is in use for a locking operation.
277 intptr_t ret_code = _contentions | _waiters | intptr_t(_cxq) | intptr_t(_EntryList);
278 if (!AsyncDeflateIdleMonitors) {
279 ret_code |= intptr_t(_owner);
280 } else {
281 if (_owner != DEFLATER_MARKER) {
282 ret_code |= intptr_t(_owner);
283 }
284 }
285 return ret_code;
286 }
287 const char* is_busy_to_string(stringStream* ss);
288
289 intptr_t is_entered(Thread* current) const;
290
291 void* owner() const; // Returns NULL if DEFLATER_MARKER is observed.
292 // Returns true if owner field == DEFLATER_MARKER and false otherwise.
293 bool owner_is_DEFLATER_MARKER();
294 void set_owner(void* owner);
295
296 jint waiters() const;
297
298 jint contentions() const;
299 intptr_t recursions() const { return _recursions; }
300
301 // JVM/TI GetObjectMonitorUsage() needs this:
302 ObjectWaiter* first_waiter() { return _WaitSet; }
303 ObjectWaiter* next_waiter(ObjectWaiter* o) { return o->_next; }
304 Thread* thread_of_waiter(ObjectWaiter* o) { return o->_thread; }
305
306 protected:
307 // We don't typically expect or want the ctors or dtors to run.
308 // normal ObjectMonitors are type-stable and immortal.
309 ObjectMonitor() { ::memset((void*)this, 0, sizeof(*this)); }
310
311 ~ObjectMonitor() {
312 // TODO: Add asserts ...
313 // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
318 void Recycle() {
319 // TODO: add stronger asserts ...
320 // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
321 // _contentions == 0 EntryList == NULL
322 // _recursions == 0 _WaitSet == NULL
323 DEBUG_ONLY(stringStream ss;)
324 assert((is_busy() | _recursions) == 0, "freeing in-use monitor: %s, "
325 "recursions=" INTPTR_FORMAT, is_busy_to_string(&ss), _recursions);
326 _succ = NULL;
327 _EntryList = NULL;
328 _cxq = NULL;
329 _WaitSet = NULL;
330 _recursions = 0;
331 }
332
333 public:
334
335 void* object() const;
336 void* object_addr();
337 void set_object(void* obj);
338 void set_allocation_state(AllocationState s);
339 AllocationState allocation_state() const;
340 bool is_free() const;
341 bool is_active() const;
342 bool is_old() const;
343 bool is_new() const;
344 void dec_ref_count();
345 void inc_ref_count();
346 jint ref_count() const;
347
348 // Returns true if the specified thread owns the ObjectMonitor. Otherwise
349 // returns false and throws IllegalMonitorStateException (IMSE).
350 bool check_owner(Thread* THREAD);
351 void clear();
352 void clear_using_JT();
353
354 void enter(TRAPS);
355 void exit(bool not_suspended, TRAPS);
356 void wait(jlong millis, bool interruptable, TRAPS);
357 void notify(TRAPS);
358 void notifyAll(TRAPS);
359
360 void print() const;
361 void print_on(outputStream* st) const;
362
363 // Use the following at your own risk
364 intptr_t complete_exit(TRAPS);
365 void reenter(intptr_t recursions, TRAPS);
366
367 private:
368 void AddWaiter(ObjectWaiter* waiter);
369 void INotify(Thread* self);
370 ObjectWaiter* DequeueWaiter();
371 void DequeueSpecificWaiter(ObjectWaiter* waiter);
372 void EnterI(TRAPS);
373 void ReenterI(Thread* self, ObjectWaiter* self_node);
374 void UnlinkAfterAcquire(Thread* self, ObjectWaiter* self_node);
375 int TryLock(Thread* self);
376 int NotRunnable(Thread* self, Thread* Owner);
377 int TrySpin(Thread* self);
378 void ExitEpilog(Thread* self, ObjectWaiter* Wakee);
379 bool ExitSuspendEquivalent(JavaThread* self);
380 void install_displaced_markword_in_object(const oop obj);
381 };
382
383 // A helper object for managing an ObjectMonitor*'s ref_count. There
384 // are special safety considerations when async deflation is used.
385 class ObjectMonitorHandle : public StackObj {
386 private:
387 ObjectMonitor* _om_ptr;
388 public:
389 ObjectMonitorHandle() { _om_ptr = NULL; }
390 ~ObjectMonitorHandle();
391
392 ObjectMonitor* om_ptr() const { return _om_ptr; }
393 // Save the ObjectMonitor* associated with the specified markWord and
394 // increment the ref_count.
395 bool save_om_ptr(oop object, markWord mark);
396
397 // For internal used by ObjectSynchronizer::monitors_iterate().
398 ObjectMonitorHandle(ObjectMonitor* _om_ptr);
399 // For internal use by ObjectSynchronizer::inflate().
400 void set_om_ptr(ObjectMonitor* om_ptr);
401 };
402
403 // Macro to use guarantee() for more strict AsyncDeflateIdleMonitors
404 // checks and assert() otherwise.
405 #define ADIM_guarantee(p, ...) \
406 do { \
407 if (AsyncDeflateIdleMonitors) { \
408 guarantee(p, __VA_ARGS__); \
409 } else { \
410 assert(p, __VA_ARGS__); \
411 } \
412 } while (0)
413
414 #endif // SHARE_RUNTIME_OBJECTMONITOR_HPP
|