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 intptr_t _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 intptr_t 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=" INTPTR_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 void print_on(outputStream* st) const;
293
294 // Use the following at your own risk
295 intptr_t complete_exit(TRAPS);
296 void reenter(intptr_t recursions, TRAPS);
297
298 private:
299 void AddWaiter(ObjectWaiter* waiter);
300 void INotify(Thread* self);
301 ObjectWaiter* DequeueWaiter();
302 void DequeueSpecificWaiter(ObjectWaiter* waiter);
303 void EnterI(TRAPS);
304 void ReenterI(Thread* self, ObjectWaiter* self_node);
305 void UnlinkAfterAcquire(Thread* self, ObjectWaiter* self_node);
306 int TryLock(Thread* self);
307 int NotRunnable(Thread* self, Thread * Owner);
308 int TrySpin(Thread* self);
309 void ExitEpilog(Thread* self, ObjectWaiter* Wakee);
310 bool ExitSuspendEquivalent(JavaThread* self);
311 };
312
313 #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 volatile 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* volatile _next_om; // Next ObjectMonitor* linkage
170 private:
171 volatile intptr_t _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 // Set _owner field to new_value; current value must match old_value.
276 void set_owner_from(void* new_value, void* old_value);
277 // Set _owner field to new_value; current value must match old_value1 or old_value2.
278 void set_owner_from(void* new_value, void* old_value1, void* old_value2);
279 // Set _owner field to self; current value must match basic_lock_p.
280 void set_owner_from_BasicLock(Thread* self, void* basic_lock_p);
281 // Try to set _owner field to new_value if the current value matches
282 // old_value. Otherwise, does not change the _owner field.
283 void* try_set_owner_from(void* new_value, void* old_value);
284
285 jint waiters() const;
286
287 jint contentions() const;
288 intptr_t recursions() const { return _recursions; }
289
290 // JVM/TI GetObjectMonitorUsage() needs this:
291 ObjectWaiter* first_waiter() { return _WaitSet; }
292 ObjectWaiter* next_waiter(ObjectWaiter* o) { return o->_next; }
293 Thread* thread_of_waiter(ObjectWaiter* o) { return o->_thread; }
294
295 protected:
296 // We don't typically expect or want the ctors or dtors to run.
297 // normal ObjectMonitors are type-stable and immortal.
298 ObjectMonitor() { ::memset((void*)this, 0, sizeof(*this)); }
299
300 ~ObjectMonitor() {
301 // TODO: Add asserts ...
302 // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
303 // _contentions == 0 _EntryList == NULL etc
304 }
305
306 private:
307 void Recycle() {
308 // TODO: add stronger asserts ...
309 // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
310 // _contentions == 0 EntryList == NULL
311 // _recursions == 0 _WaitSet == NULL
312 DEBUG_ONLY(stringStream ss;)
313 assert((is_busy() | _recursions) == 0, "freeing in-use monitor: %s, "
314 "recursions=" INTX_FORMAT, is_busy_to_string(&ss), _recursions);
315 _succ = NULL;
316 _EntryList = NULL;
317 _cxq = NULL;
318 _WaitSet = NULL;
319 _recursions = 0;
320 }
321
322 public:
323
324 void* object() const;
325 void* object_addr();
326 void set_object(void* obj);
327 void set_allocation_state(AllocationState s);
328 AllocationState allocation_state() const;
329 bool is_free() const;
330 bool is_active() const;
331 bool is_old() const;
332 bool is_new() const;
333 void dec_ref_count();
334 void inc_ref_count();
335 jint ref_count() const;
336
337 // Returns true if the specified thread owns the ObjectMonitor. Otherwise
338 // returns false and throws IllegalMonitorStateException (IMSE).
339 bool check_owner(Thread* THREAD);
340 void clear();
341 void clear_using_JT();
342
343 void enter(TRAPS);
344 void exit(bool not_suspended, TRAPS);
345 void wait(jlong millis, bool interruptable, TRAPS);
346 void notify(TRAPS);
347 void notifyAll(TRAPS);
348
349 void print() const;
350 void print_debug_style_on(outputStream* st) const;
351 void print_on(outputStream* st) const;
352
353 // Use the following at your own risk
354 intptr_t complete_exit(TRAPS);
355 void reenter(intptr_t recursions, TRAPS);
356
357 private:
358 void AddWaiter(ObjectWaiter* waiter);
359 void INotify(Thread* self);
360 ObjectWaiter* DequeueWaiter();
361 void DequeueSpecificWaiter(ObjectWaiter* waiter);
362 void EnterI(TRAPS);
363 void ReenterI(Thread* self, ObjectWaiter* self_node);
364 void UnlinkAfterAcquire(Thread* self, ObjectWaiter* self_node);
365 int TryLock(Thread* self);
366 int NotRunnable(Thread* self, Thread* Owner);
367 int TrySpin(Thread* self);
368 void ExitEpilog(Thread* self, ObjectWaiter* Wakee);
369 bool ExitSuspendEquivalent(JavaThread* self);
370 void install_displaced_markword_in_object(const oop obj);
371 };
372
373 // A helper object for managing an ObjectMonitor*'s ref_count. There
374 // are special safety considerations when async deflation is used.
375 class ObjectMonitorHandle : public StackObj {
376 private:
377 ObjectMonitor* _om_ptr;
378 public:
379 ObjectMonitorHandle() { _om_ptr = NULL; }
380 ~ObjectMonitorHandle();
381
382 ObjectMonitor* om_ptr() const { return _om_ptr; }
383 // Save the ObjectMonitor* associated with the specified markWord and
384 // increment the ref_count.
385 bool save_om_ptr(oop object, markWord mark);
386
387 // For internal used by ObjectSynchronizer::monitors_iterate().
388 ObjectMonitorHandle(ObjectMonitor* _om_ptr);
389 // For internal use by ObjectSynchronizer::inflate().
390 void set_om_ptr(ObjectMonitor* om_ptr);
391 };
392
393 // Macro to use guarantee() for more strict AsyncDeflateIdleMonitors
394 // checks and assert() otherwise.
395 #define ADIM_guarantee(p, ...) \
396 do { \
397 if (AsyncDeflateIdleMonitors) { \
398 guarantee(p, __VA_ARGS__); \
399 } else { \
400 assert(p, __VA_ARGS__); \
401 } \
402 } while (0)
403
404 #endif // SHARE_RUNTIME_OBJECTMONITOR_HPP
|