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;
231 static PerfCounter * _sync_Inflations;
232 static PerfCounter * _sync_Deflations;
|
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;
|