103 // - Adjacent ObjectMonitors should be separated by enough space to avoid
104 // false sharing. This is handled by the ObjectMonitor allocation code
105 // in synchronizer.cpp. Also see TEST_VM(SynchronizerTest, sanity) gtest.
106 //
107 // Futures notes:
108 // - Separating _owner from the <remaining_fields> by enough space to
109 // avoid false sharing might be profitable. Given
110 // http://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate
111 // we know that the CAS in monitorenter will invalidate the line
112 // underlying _owner. We want to avoid an L1 data cache miss on that
113 // same line for monitorexit. Putting these <remaining_fields>:
114 // _recursions, _EntryList, _cxq, and _succ, all of which may be
115 // fetched in the inflated unlock path, on a different cache line
116 // would make them immune to CAS-based invalidation from the _owner
117 // field.
118 //
119 // - The _recursions field should be of type int, or int32_t but not
120 // intptr_t. There's no reason to use a 64-bit type for this field
121 // in a 64-bit JVM.
122
123 class ObjectMonitor {
124 friend class ObjectSynchronizer;
125 friend class ObjectWaiter;
126 friend class VMStructs;
127 JVMCI_ONLY(friend class JVMCIVMStructs;)
128
129 // The sync code expects the header field to be at offset zero (0).
130 // Enforced by the assert() in header_addr().
131 volatile markWord _header; // displaced object header word - mark
132 void* volatile _object; // backward object pointer - strong root
133 public:
134 ObjectMonitor* _next_om; // Next ObjectMonitor* linkage
135 private:
136 // Separate _header and _owner on different cache lines since both can
137 // have busy multi-threaded access. _header and _object are set at
138 // initial inflation and _object doesn't change until deflation so
139 // _object is a good choice to share the cache line with _header.
140 // _next_om shares _header's cache line for pre-monitor list historical
141 // reasons. _next_om only changes if the next ObjectMonitor is deflated.
142 DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE,
143 sizeof(volatile markWord) + sizeof(void* volatile) +
144 sizeof(ObjectMonitor *));
145 void* volatile _owner; // pointer to owning thread OR BasicLock
146 volatile jlong _previous_owner_tid; // thread id of the previous owner of the monitor
147 volatile intx _recursions; // recursion count, 0 for first entry
148 ObjectWaiter* volatile _EntryList; // Threads blocked on entry or reentry.
149 // The list is actually composed of WaitNodes,
150 // acting as proxies for Threads.
151
152 ObjectWaiter* volatile _cxq; // LL of recently-arrived threads blocked on entry.
153 Thread* volatile _succ; // Heir presumptive thread - used for futile wakeup throttling
154 Thread* volatile _Responsible;
155
156 volatile int _Spinner; // for exit->spinner handoff optimization
157 volatile int _SpinDuration;
158
159 volatile jint _contentions; // Number of active contentions in enter(). It is used by is_busy()
160 // along with other fields to determine if an ObjectMonitor can be
161 // deflated. See ObjectSynchronizer::deflate_monitor().
162 protected:
163 ObjectWaiter* volatile _WaitSet; // LL of threads wait()ing on the monitor
164 volatile jint _waiters; // number of waiting threads
165 private:
166 volatile int _WaitSetLock; // protects Wait Queue - simple spinlock
167
168 public:
169 static void Initialize();
170
171 // Only perform a PerfData operation if the PerfData object has been
172 // allocated and if the PerfDataManager has not freed the PerfData
173 // objects which can happen at normal VM shutdown.
174 //
175 #define OM_PERFDATA_OP(f, op_str) \
176 do { \
177 if (ObjectMonitor::_sync_ ## f != NULL && \
178 PerfDataManager::has_PerfData()) { \
179 ObjectMonitor::_sync_ ## f->op_str; \
180 } \
181 } while (0)
183 static PerfCounter * _sync_ContendedLockAttempts;
184 static PerfCounter * _sync_FutileWakeups;
185 static PerfCounter * _sync_Parks;
186 static PerfCounter * _sync_Notifications;
187 static PerfCounter * _sync_Inflations;
188 static PerfCounter * _sync_Deflations;
189 static PerfLongVariable * _sync_MonExtant;
190
191 static int Knob_SpinLimit;
192
193 void* operator new (size_t size) throw();
194 void* operator new[] (size_t size) throw();
195 void operator delete(void* p);
196 void operator delete[] (void* p);
197
198 // TODO-FIXME: the "offset" routines should return a type of off_t instead of int ...
199 // ByteSize would also be an appropriate type.
200 static int header_offset_in_bytes() { return offset_of(ObjectMonitor, _header); }
201 static int object_offset_in_bytes() { return offset_of(ObjectMonitor, _object); }
202 static int owner_offset_in_bytes() { return offset_of(ObjectMonitor, _owner); }
203 static int recursions_offset_in_bytes() { return offset_of(ObjectMonitor, _recursions); }
204 static int cxq_offset_in_bytes() { return offset_of(ObjectMonitor, _cxq); }
205 static int succ_offset_in_bytes() { return offset_of(ObjectMonitor, _succ); }
206 static int EntryList_offset_in_bytes() { return offset_of(ObjectMonitor, _EntryList); }
207
208 // ObjectMonitor references can be ORed with markWord::monitor_value
209 // as part of the ObjectMonitor tagging mechanism. When we combine an
210 // ObjectMonitor reference with an offset, we need to remove the tag
211 // value in order to generate the proper address.
212 //
213 // We can either adjust the ObjectMonitor reference and then add the
214 // offset or we can adjust the offset that is added to the ObjectMonitor
215 // reference. The latter avoids an AGI (Address Generation Interlock)
216 // stall so the helper macro adjusts the offset value that is returned
217 // to the ObjectMonitor reference manipulation code:
218 //
219 #define OM_OFFSET_NO_MONITOR_VALUE_TAG(f) \
220 ((ObjectMonitor::f ## _offset_in_bytes()) - markWord::monitor_value)
221
222 markWord header() const;
223 volatile markWord* header_addr();
224 void set_header(markWord hdr);
225
226 intptr_t is_busy() const {
227 // TODO-FIXME: assert _owner == null implies _recursions = 0
228 return _contentions|_waiters|intptr_t(_owner)|intptr_t(_cxq)|intptr_t(_EntryList);
229 }
230 const char* is_busy_to_string(stringStream* ss);
231
232 intptr_t is_entered(Thread* current) const;
233
234 void* owner() const;
235 void set_owner(void* owner);
236
237 jint waiters() const;
238
239 jint contentions() const;
240 intx recursions() const { return _recursions; }
241
242 // JVM/TI GetObjectMonitorUsage() needs this:
243 ObjectWaiter* first_waiter() { return _WaitSet; }
244 ObjectWaiter* next_waiter(ObjectWaiter* o) { return o->_next; }
245 Thread* thread_of_waiter(ObjectWaiter* o) { return o->_thread; }
246
247 protected:
248 // We don't typically expect or want the ctors or dtors to run.
249 // normal ObjectMonitors are type-stable and immortal.
250 ObjectMonitor() { ::memset((void*)this, 0, sizeof(*this)); }
251
252 ~ObjectMonitor() {
253 // TODO: Add asserts ...
254 // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
255 // _contentions == 0 _EntryList == NULL etc
256 }
257
258 private:
259 void Recycle() {
260 // TODO: add stronger asserts ...
261 // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
262 // _contentions == 0 EntryList == NULL
263 // _recursions == 0 _WaitSet == NULL
264 DEBUG_ONLY(stringStream ss;)
265 assert((is_busy() | _recursions) == 0, "freeing in-use monitor: %s, "
266 "recursions=" INTX_FORMAT, is_busy_to_string(&ss), _recursions);
267 _succ = NULL;
268 _EntryList = NULL;
269 _cxq = NULL;
270 _WaitSet = NULL;
271 _recursions = 0;
272 }
273
274 public:
275
276 void* object() const;
277 void* object_addr();
278 void set_object(void* obj);
279
280 // Returns true if the specified thread owns the ObjectMonitor. Otherwise
281 // returns false and throws IllegalMonitorStateException (IMSE).
282 bool check_owner(Thread* THREAD);
283 void clear();
284
285 void enter(TRAPS);
286 void exit(bool not_suspended, TRAPS);
287 void wait(jlong millis, bool interruptable, TRAPS);
288 void notify(TRAPS);
289 void notifyAll(TRAPS);
290
291 void print() const;
292 #ifdef ASSERT
293 void print_debug_style_on(outputStream* st) const;
294 #endif
295 void print_on(outputStream* st) const;
296
297 // Use the following at your own risk
298 intx complete_exit(TRAPS);
299 void reenter(intx recursions, TRAPS);
300
301 private:
302 void AddWaiter(ObjectWaiter* waiter);
303 void INotify(Thread* self);
304 ObjectWaiter* DequeueWaiter();
305 void DequeueSpecificWaiter(ObjectWaiter* waiter);
306 void EnterI(TRAPS);
307 void ReenterI(Thread* self, ObjectWaiter* self_node);
308 void UnlinkAfterAcquire(Thread* self, ObjectWaiter* self_node);
309 int TryLock(Thread* self);
310 int NotRunnable(Thread* self, Thread * Owner);
311 int TrySpin(Thread* self);
312 void ExitEpilog(Thread* self, ObjectWaiter* Wakee);
313 bool ExitSuspendEquivalent(JavaThread* self);
314 };
315
316 #endif // SHARE_RUNTIME_OBJECTMONITOR_HPP
|
103 // - Adjacent ObjectMonitors should be separated by enough space to avoid
104 // false sharing. This is handled by the ObjectMonitor allocation code
105 // in synchronizer.cpp. Also see TEST_VM(SynchronizerTest, sanity) gtest.
106 //
107 // Futures notes:
108 // - Separating _owner from the <remaining_fields> by enough space to
109 // avoid false sharing might be profitable. Given
110 // http://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate
111 // we know that the CAS in monitorenter will invalidate the line
112 // underlying _owner. We want to avoid an L1 data cache miss on that
113 // same line for monitorexit. Putting these <remaining_fields>:
114 // _recursions, _EntryList, _cxq, and _succ, all of which may be
115 // fetched in the inflated unlock path, on a different cache line
116 // would make them immune to CAS-based invalidation from the _owner
117 // field.
118 //
119 // - The _recursions field should be of type int, or int32_t but not
120 // intptr_t. There's no reason to use a 64-bit type for this field
121 // in a 64-bit JVM.
122
123 #ifndef OM_CACHE_LINE_SIZE
124 // Use DEFAULT_CACHE_LINE_SIZE if not already specified for
125 // the current build platform.
126 #define OM_CACHE_LINE_SIZE DEFAULT_CACHE_LINE_SIZE
127 #endif
128
129 class ObjectMonitor {
130 friend class ObjectMonitorHandle;
131 friend class ObjectSynchronizer;
132 friend class ObjectWaiter;
133 friend class VMStructs;
134 JVMCI_ONLY(friend class JVMCIVMStructs;)
135
136 // The sync code expects the header field to be at offset zero (0).
137 // Enforced by the assert() in header_addr().
138 volatile markWord _header; // displaced object header word - mark
139 void* volatile _object; // backward object pointer - strong root
140 typedef enum {
141 Free = 0, // Free must be 0 for monitor to be free after memset(..,0,..).
142 New,
143 Old
144 } AllocationState;
145 AllocationState _allocation_state;
146 // Separate _header and _owner on different cache lines since both can
147 // have busy multi-threaded access. _header, _object and _allocation_state
148 // are set at initial inflation. _object and _allocation_state don't
149 // change until deflation so _object and _allocation_state are good
150 // choices to share the cache line with _header.
151 DEFINE_PAD_MINUS_SIZE(0, OM_CACHE_LINE_SIZE, sizeof(volatile markWord) +
152 sizeof(void* volatile) + sizeof(AllocationState));
153 // Used by async deflation as a marker in the _owner field:
154 #define DEFLATER_MARKER reinterpret_cast<void*>(-1)
155 void* volatile _owner; // pointer to owning thread OR BasicLock
156 volatile jlong _previous_owner_tid; // thread id of the previous owner of the monitor
157 // Separate _owner and _ref_count on different cache lines since both
158 // can have busy multi-threaded access. _previous_owner_tid is only
159 // changed by ObjectMonitor::exit() so it is a good choice to share the
160 // cache line with _owner.
161 DEFINE_PAD_MINUS_SIZE(1, OM_CACHE_LINE_SIZE, sizeof(void* volatile) +
162 sizeof(volatile jlong));
163 jint _ref_count; // ref count for ObjectMonitor* and used by the async deflation
164 // protocol. See ObjectSynchronizer::deflate_monitor_using_JT().
165 // Separate _ref_count and _next_om on different cache lines since
166 // both can have busy multi-threaded access.
167 DEFINE_PAD_MINUS_SIZE(2, OM_CACHE_LINE_SIZE, sizeof(volatile jint));
168 public: // for static synchronizer.cpp access:
169 ObjectMonitor* _next_om; // Next ObjectMonitor* linkage
170 private:
171 volatile intx _recursions; // recursion count, 0 for first entry
172 ObjectWaiter* volatile _EntryList; // Threads blocked on entry or reentry.
173 // The list is actually composed of WaitNodes,
174 // acting as proxies for Threads.
175
176 ObjectWaiter* volatile _cxq; // LL of recently-arrived threads blocked on entry.
177 Thread* volatile _succ; // Heir presumptive thread - used for futile wakeup throttling
178 Thread* volatile _Responsible;
179
180 volatile int _Spinner; // for exit->spinner handoff optimization
181 volatile int _SpinDuration;
182
183 volatile jint _contentions; // Number of active contentions in enter(). It is used by is_busy()
184 // along with other fields to determine if an ObjectMonitor can be
185 // deflated. See ObjectSynchronizer::deflate_monitor() and
186 // ObjectSynchronizer::deflate_monitor_using_JT().
187 protected:
188 ObjectWaiter* volatile _WaitSet; // LL of threads wait()ing on the monitor
189 volatile jint _waiters; // number of waiting threads
190 private:
191 volatile int _WaitSetLock; // protects Wait Queue - simple spinlock
192
193 public:
194 static void Initialize();
195
196 // Only perform a PerfData operation if the PerfData object has been
197 // allocated and if the PerfDataManager has not freed the PerfData
198 // objects which can happen at normal VM shutdown.
199 //
200 #define OM_PERFDATA_OP(f, op_str) \
201 do { \
202 if (ObjectMonitor::_sync_ ## f != NULL && \
203 PerfDataManager::has_PerfData()) { \
204 ObjectMonitor::_sync_ ## f->op_str; \
205 } \
206 } while (0)
208 static PerfCounter * _sync_ContendedLockAttempts;
209 static PerfCounter * _sync_FutileWakeups;
210 static PerfCounter * _sync_Parks;
211 static PerfCounter * _sync_Notifications;
212 static PerfCounter * _sync_Inflations;
213 static PerfCounter * _sync_Deflations;
214 static PerfLongVariable * _sync_MonExtant;
215
216 static int Knob_SpinLimit;
217
218 void* operator new (size_t size) throw();
219 void* operator new[] (size_t size) throw();
220 void operator delete(void* p);
221 void operator delete[] (void* p);
222
223 // TODO-FIXME: the "offset" routines should return a type of off_t instead of int ...
224 // ByteSize would also be an appropriate type.
225 static int header_offset_in_bytes() { return offset_of(ObjectMonitor, _header); }
226 static int object_offset_in_bytes() { return offset_of(ObjectMonitor, _object); }
227 static int owner_offset_in_bytes() { return offset_of(ObjectMonitor, _owner); }
228 static int ref_count_offset_in_bytes() { return offset_of(ObjectMonitor, _ref_count); }
229 static int recursions_offset_in_bytes() { return offset_of(ObjectMonitor, _recursions); }
230 static int cxq_offset_in_bytes() { return offset_of(ObjectMonitor, _cxq); }
231 static int succ_offset_in_bytes() { return offset_of(ObjectMonitor, _succ); }
232 static int EntryList_offset_in_bytes() { return offset_of(ObjectMonitor, _EntryList); }
233
234 // ObjectMonitor references can be ORed with markWord::monitor_value
235 // as part of the ObjectMonitor tagging mechanism. When we combine an
236 // ObjectMonitor reference with an offset, we need to remove the tag
237 // value in order to generate the proper address.
238 //
239 // We can either adjust the ObjectMonitor reference and then add the
240 // offset or we can adjust the offset that is added to the ObjectMonitor
241 // reference. The latter avoids an AGI (Address Generation Interlock)
242 // stall so the helper macro adjusts the offset value that is returned
243 // to the ObjectMonitor reference manipulation code:
244 //
245 #define OM_OFFSET_NO_MONITOR_VALUE_TAG(f) \
246 ((ObjectMonitor::f ## _offset_in_bytes()) - markWord::monitor_value)
247
248 markWord header() const;
249 volatile markWord* header_addr();
250 void set_header(markWord hdr);
251
252 intptr_t is_busy() const {
253 // TODO-FIXME: assert _owner == null implies _recursions = 0
254 // We do not include _ref_count in the is_busy() check because
255 // _ref_count is for indicating that the ObjectMonitor* is in
256 // use which is orthogonal to whether the ObjectMonitor itself
257 // is in use for a locking operation.
258 intptr_t ret_code = _contentions | _waiters | intptr_t(_cxq) | intptr_t(_EntryList);
259 if (!AsyncDeflateIdleMonitors) {
260 ret_code |= intptr_t(_owner);
261 } else {
262 if (_owner != DEFLATER_MARKER) {
263 ret_code |= intptr_t(_owner);
264 }
265 }
266 return ret_code;
267 }
268 const char* is_busy_to_string(stringStream* ss);
269
270 intptr_t is_entered(Thread* current) const;
271
272 void* owner() const; // Returns NULL if DEFLATER_MARKER is observed.
273 // Returns true if owner field == DEFLATER_MARKER and false otherwise.
274 bool owner_is_DEFLATER_MARKER();
275 // Clear _owner field; current value must match old_value.
276 void release_clear_owner_with_barrier(void* old_value, bool needs_fence);
277 // Simply set _owner field to new_value; current value must match old_value.
278 void simply_set_owner_from(void* new_value, void* old_value);
279 // Simply set _owner field to new_value; current value must match old_value1 or old_value2.
280 void simply_set_owner_from(void* new_value, void* old_value1, void* old_value2);
281 // Simply set _owner field to self; current value must match basic_lock_p.
282 void simply_set_owner_from_BasicLock(Thread* self, void* basic_lock_p);
283 // Try to set _owner field to new_value if the current value matches
284 // old_value. Otherwise, does not change the _owner field.
285 void* try_set_owner_from(void* new_value, void* old_value);
286
287 jint waiters() const;
288
289 jint contentions() const;
290 intx recursions() const { return _recursions; }
291
292 // JVM/TI GetObjectMonitorUsage() needs this:
293 ObjectWaiter* first_waiter() { return _WaitSet; }
294 ObjectWaiter* next_waiter(ObjectWaiter* o) { return o->_next; }
295 Thread* thread_of_waiter(ObjectWaiter* o) { return o->_thread; }
296
297 protected:
298 // We don't typically expect or want the ctors or dtors to run.
299 // normal ObjectMonitors are type-stable and immortal.
300 ObjectMonitor() { ::memset((void*)this, 0, sizeof(*this)); }
301
302 ~ObjectMonitor() {
303 // TODO: Add asserts ...
304 // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
305 // _contentions == 0 _EntryList == NULL etc
306 }
307
308 private:
309 void Recycle() {
310 // TODO: add stronger asserts ...
311 // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
312 // _contentions == 0 EntryList == NULL
313 // _recursions == 0 _WaitSet == NULL
314 #ifdef ASSERT
315 stringStream ss;
316 #endif
317 assert((is_busy() | _recursions) == 0, "freeing in-use monitor: %s, "
318 "recursions=" INTX_FORMAT, is_busy_to_string(&ss), _recursions);
319 _succ = NULL;
320 _EntryList = NULL;
321 _cxq = NULL;
322 _WaitSet = NULL;
323 _recursions = 0;
324 }
325
326 public:
327
328 void* object() const;
329 void* object_addr();
330 void set_object(void* obj);
331 void set_allocation_state(AllocationState s);
332 AllocationState allocation_state() const;
333 bool is_free() const;
334 bool is_old() const;
335 bool is_new() const;
336 void dec_ref_count();
337 void inc_ref_count();
338 jint ref_count() const;
339
340 // Returns true if the specified thread owns the ObjectMonitor. Otherwise
341 // returns false and throws IllegalMonitorStateException (IMSE).
342 bool check_owner(Thread* THREAD);
343 void clear();
344 void clear_using_JT();
345
346 void enter(TRAPS);
347 void exit(bool not_suspended, TRAPS);
348 void wait(jlong millis, bool interruptable, TRAPS);
349 void notify(TRAPS);
350 void notifyAll(TRAPS);
351
352 void print() const;
353 #ifdef ASSERT
354 void print_debug_style_on(outputStream* st) const;
355 #endif
356 void print_on(outputStream* st) const;
357
358 // Use the following at your own risk
359 intx complete_exit(TRAPS);
360 void reenter(intx recursions, TRAPS);
361
362 private:
363 void AddWaiter(ObjectWaiter* waiter);
364 void INotify(Thread* self);
365 ObjectWaiter* DequeueWaiter();
366 void DequeueSpecificWaiter(ObjectWaiter* waiter);
367 void EnterI(TRAPS);
368 void ReenterI(Thread* self, ObjectWaiter* self_node);
369 void UnlinkAfterAcquire(Thread* self, ObjectWaiter* self_node);
370 int TryLock(Thread* self);
371 int NotRunnable(Thread* self, Thread* Owner);
372 int TrySpin(Thread* self);
373 void ExitEpilog(Thread* self, ObjectWaiter* Wakee);
374 bool ExitSuspendEquivalent(JavaThread* self);
375 void install_displaced_markword_in_object(const oop obj);
376 };
377
378 // A helper object for managing an ObjectMonitor*'s ref_count. There
379 // are special safety considerations when async deflation is used.
380 class ObjectMonitorHandle : public StackObj {
381 private:
382 ObjectMonitor* _om_ptr;
383 public:
384 ObjectMonitorHandle() { _om_ptr = NULL; }
385 ~ObjectMonitorHandle();
386
387 ObjectMonitor* om_ptr() const { return _om_ptr; }
388 // Save the ObjectMonitor* associated with the specified markWord and
389 // increment the ref_count.
390 bool save_om_ptr(oop object, markWord mark);
391 // Save the specified ObjectMonitor* if safe and increment the ref_count.
392 bool set_om_ptr_if_safe(ObjectMonitor* om_ptr);
393 // Unset the _om_ptr field and decrement the ref_count.
394 void unset_om_ptr();
395
396 // For internal use by ObjectSynchronizer::inflate().
397 void set_om_ptr(ObjectMonitor* om_ptr);
398 };
399
400 // Macro to use guarantee() for more strict AsyncDeflateIdleMonitors
401 // checks and assert() otherwise.
402 #define ADIM_guarantee(p, ...) \
403 do { \
404 if (AsyncDeflateIdleMonitors) { \
405 guarantee(p, __VA_ARGS__); \
406 } else { \
407 assert(p, __VA_ARGS__); \
408 } \
409 } while (0)
410
411 #endif // SHARE_RUNTIME_OBJECTMONITOR_HPP
|