< prev index next >

src/hotspot/share/runtime/objectMonitor.hpp

Print this page
rev 59077 : 8153224.v2.09b.patch combined with 8153224.v2.10.patch; merge with jdk-15+21.
rev 59078 : eosterlund v2.10 CR: reorganize deflate_monitor_using_JT() to use "early exit" style; dcubed - clarify/fix/rearrange a few comments in deflate_monitor_using_JT(); eosterlund v2.10 CR: simplify install_displaced_markword_in_object() and save_om_ptr(); save_om_ptr()'s call to install_displaced_markword_in_object() can race with the deflater thread's clearing of the object field so handle that; fold 8153224.OMHandle_experiment into 8153224.v2.11.patch; merge with jdk-15+21.


 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 ObjectSynchronizer;
 131   friend class ObjectWaiter;
 132   friend class VMStructs;
 133   JVMCI_ONLY(friend class JVMCIVMStructs;)
 134 
 135   // The sync code expects the header field to be at offset zero (0).
 136   // Enforced by the assert() in header_addr().
 137   volatile markWord _header;        // displaced object header word - mark
 138   void* volatile _object;           // backward object pointer - strong root
 139  private:





 140   // Separate _header and _owner on different cache lines since both can
 141   // have busy multi-threaded access. _header and _object are set at
 142   // initial inflation and _object doesn't change until deflation so
 143   // _object is a good choice to share the cache line with _header.
 144   DEFINE_PAD_MINUS_SIZE(0, OM_CACHE_LINE_SIZE,
 145                         sizeof(volatile markWord) + sizeof(void* volatile));



 146   void* volatile _owner;            // pointer to owning thread OR BasicLock
 147   volatile jlong _previous_owner_tid;  // thread id of the previous owner of the monitor
 148   // Separate _owner and _next_om on different cache lines since
 149   // both can have busy multi-threaded access. _previous_owner_tid is only
 150   // changed by ObjectMonitor::exit() so it is a good choice to share the
 151   // cache line with _owner.
 152   DEFINE_PAD_MINUS_SIZE(1, OM_CACHE_LINE_SIZE, sizeof(void* volatile) +
 153                         sizeof(volatile jlong));
 154   ObjectMonitor* _next_om;          // Next ObjectMonitor* linkage
 155   volatile intx _recursions;        // recursion count, 0 for first entry
 156   ObjectWaiter* volatile _EntryList;  // Threads blocked on entry or reentry.
 157                                       // The list is actually composed of WaitNodes,
 158                                       // acting as proxies for Threads.
 159 
 160   ObjectWaiter* volatile _cxq;      // LL of recently-arrived threads blocked on entry.
 161   Thread* volatile _succ;           // Heir presumptive thread - used for futile wakeup throttling
 162   Thread* volatile _Responsible;
 163 
 164   volatile int _Spinner;            // for exit->spinner handoff optimization
 165   volatile int _SpinDuration;
 166 
 167   volatile jint  _contentions;      // Number of active contentions in enter(). It is used by is_busy()
 168                                     // along with other fields to determine if an ObjectMonitor can be
 169                                     // deflated. See ObjectSynchronizer::deflate_monitor().

 170  protected:
 171   ObjectWaiter* volatile _WaitSet;  // LL of threads wait()ing on the monitor
 172   volatile jint  _waiters;          // number of waiting threads
 173  private:
 174   volatile int _WaitSetLock;        // protects Wait Queue - simple spinlock
 175 
 176  public:
 177   static void Initialize();
 178 
 179   // Only perform a PerfData operation if the PerfData object has been
 180   // allocated and if the PerfDataManager has not freed the PerfData
 181   // objects which can happen at normal VM shutdown.
 182   //
 183   #define OM_PERFDATA_OP(f, op_str)              \
 184     do {                                         \
 185       if (ObjectMonitor::_sync_ ## f != NULL &&  \
 186           PerfDataManager::has_PerfData()) {     \
 187         ObjectMonitor::_sync_ ## f->op_str;      \
 188       }                                          \
 189     } while (0)


 216   // ObjectMonitor references can be ORed with markWord::monitor_value
 217   // as part of the ObjectMonitor tagging mechanism. When we combine an
 218   // ObjectMonitor reference with an offset, we need to remove the tag
 219   // value in order to generate the proper address.
 220   //
 221   // We can either adjust the ObjectMonitor reference and then add the
 222   // offset or we can adjust the offset that is added to the ObjectMonitor
 223   // reference. The latter avoids an AGI (Address Generation Interlock)
 224   // stall so the helper macro adjusts the offset value that is returned
 225   // to the ObjectMonitor reference manipulation code:
 226   //
 227   #define OM_OFFSET_NO_MONITOR_VALUE_TAG(f) \
 228     ((ObjectMonitor::f ## _offset_in_bytes()) - markWord::monitor_value)
 229 
 230   markWord           header() const;
 231   volatile markWord* header_addr();
 232   void               set_header(markWord hdr);
 233 
 234   intptr_t is_busy() const {
 235     // TODO-FIXME: assert _owner == null implies _recursions = 0
 236     return _contentions|_waiters|intptr_t(_owner)|intptr_t(_cxq)|intptr_t(_EntryList);











 237   }
 238   const char* is_busy_to_string(stringStream* ss);
 239 
 240   intptr_t  is_entered(Thread* current) const;
 241 
 242   void*     owner() const;




 243   // Clear _owner field; current value must match old_value.
 244   void      release_clear_owner(void* old_value);
 245   // Simply set _owner field to new_value; current value must match old_value.
 246   void      set_owner_from(void* old_value, void* new_value);


 247   // Simply set _owner field to self; current value must match basic_lock_p.
 248   void      set_owner_from_BasicLock(void* basic_lock_p, Thread* self);
 249   // Try to set _owner field to new_value if the current value matches
 250   // old_value, using Atomic::cmpxchg(). Otherwise, does not change the
 251   // _owner field. Returns the prior value of the _owner field.
 252   void*     try_set_owner_from(void* old_value, void* new_value);
 253 
 254   ObjectMonitor* next_om() const;
 255   // Simply set _next_om field to new_value.
 256   void set_next_om(ObjectMonitor* new_value);
 257   // Try to set _next_om field to new_value if the current value matches
 258   // old_value, using Atomic::cmpxchg(). Otherwise, does not change the
 259   // _next_om field. Returns the prior value of the _next_om field.
 260   ObjectMonitor* try_set_next_om(ObjectMonitor* old_value, ObjectMonitor* new_value);
 261 
 262   jint      waiters() const;
 263 
 264   jint      contentions() const;
 265   intx      recursions() const                                         { return _recursions; }
 266 


 269   ObjectWaiter* next_waiter(ObjectWaiter* o)                           { return o->_next; }
 270   Thread* thread_of_waiter(ObjectWaiter* o)                            { return o->_thread; }
 271 
 272  protected:
 273   // We don't typically expect or want the ctors or dtors to run.
 274   // normal ObjectMonitors are type-stable and immortal.
 275   ObjectMonitor() { ::memset((void*)this, 0, sizeof(*this)); }
 276 
 277   ~ObjectMonitor() {
 278     // TODO: Add asserts ...
 279     // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
 280     // _contentions == 0 _EntryList  == NULL etc
 281   }
 282 
 283  private:
 284   void Recycle() {
 285     // TODO: add stronger asserts ...
 286     // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
 287     // _contentions == 0 EntryList  == NULL
 288     // _recursions == 0 _WaitSet == NULL
 289     DEBUG_ONLY(stringStream ss;)


 290     assert((is_busy() | _recursions) == 0, "freeing in-use monitor: %s, "
 291            "recursions=" INTX_FORMAT, is_busy_to_string(&ss), _recursions);
 292     _succ          = NULL;
 293     _EntryList     = NULL;
 294     _cxq           = NULL;
 295     _WaitSet       = NULL;
 296     _recursions    = 0;
 297   }
 298 
 299  public:
 300 
 301   void*     object() const;
 302   void*     object_addr();
 303   void      set_object(void* obj);





 304 
 305   // Returns true if the specified thread owns the ObjectMonitor. Otherwise
 306   // returns false and throws IllegalMonitorStateException (IMSE).
 307   bool      check_owner(Thread* THREAD);
 308   void      clear();

 309 
 310   void      enter(TRAPS);
 311   void      exit(bool not_suspended, TRAPS);
 312   void      wait(jlong millis, bool interruptable, TRAPS);
 313   void      notify(TRAPS);
 314   void      notifyAll(TRAPS);
 315 
 316   void      print() const;
 317 #ifdef ASSERT
 318   void      print_debug_style_on(outputStream* st) const;
 319 #endif
 320   void      print_on(outputStream* st) const;
 321 
 322 // Use the following at your own risk
 323   intx      complete_exit(TRAPS);
 324   void      reenter(intx recursions, TRAPS);
 325 
 326  private:
 327   void      AddWaiter(ObjectWaiter* waiter);
 328   void      INotify(Thread* self);
 329   ObjectWaiter* DequeueWaiter();
 330   void      DequeueSpecificWaiter(ObjectWaiter* waiter);
 331   void      EnterI(TRAPS);
 332   void      ReenterI(Thread* self, ObjectWaiter* self_node);
 333   void      UnlinkAfterAcquire(Thread* self, ObjectWaiter* self_node);
 334   int       TryLock(Thread* self);
 335   int       NotRunnable(Thread* self, Thread * Owner);
 336   int       TrySpin(Thread* self);
 337   void      ExitEpilog(Thread* self, ObjectWaiter* Wakee);
 338   bool      ExitSuspendEquivalent(JavaThread* self);

 339 };
 340 











 341 #endif // SHARE_RUNTIME_OBJECTMONITOR_HPP


 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 ObjectSynchronizer;
 131   friend class ObjectWaiter;
 132   friend class VMStructs;
 133   JVMCI_ONLY(friend class JVMCIVMStructs;)
 134 
 135   // The sync code expects the header field to be at offset zero (0).
 136   // Enforced by the assert() in header_addr().
 137   volatile markWord _header;        // displaced object header word - mark
 138   void* volatile _object;           // backward object pointer - strong root
 139   typedef enum {
 140     Free = 0,  // Free must be 0 for monitor to be free after memset(..,0,..).
 141     New,
 142     Old
 143   } AllocationState;
 144   AllocationState _allocation_state;
 145   // Separate _header and _owner on different cache lines since both can
 146   // have busy multi-threaded access. _header, _object and _allocation_state
 147   // are set at initial inflation. _object and _allocation_state don't
 148   // change until deflation so _object and _allocation_state are good
 149   // choices to share the cache line with _header.
 150   DEFINE_PAD_MINUS_SIZE(0, OM_CACHE_LINE_SIZE, sizeof(volatile markWord) +
 151                         sizeof(void* volatile) + sizeof(AllocationState));
 152   // Used by async deflation as a marker in the _owner field:
 153   #define DEFLATER_MARKER reinterpret_cast<void*>(-1)
 154   void* volatile _owner;            // pointer to owning thread OR BasicLock
 155   volatile jlong _previous_owner_tid;  // thread id of the previous owner of the monitor
 156   // Separate _owner and _next_om on different cache lines since
 157   // both can have busy multi-threaded access. _previous_owner_tid is only
 158   // changed by ObjectMonitor::exit() so it is a good choice to share the
 159   // cache line with _owner.
 160   DEFINE_PAD_MINUS_SIZE(1, OM_CACHE_LINE_SIZE, sizeof(void* volatile) +
 161                         sizeof(volatile jlong));
 162   ObjectMonitor* _next_om;          // Next ObjectMonitor* linkage
 163   volatile intx _recursions;        // recursion count, 0 for first entry
 164   ObjectWaiter* volatile _EntryList;  // Threads blocked on entry or reentry.
 165                                       // The list is actually composed of WaitNodes,
 166                                       // acting as proxies for Threads.
 167 
 168   ObjectWaiter* volatile _cxq;      // LL of recently-arrived threads blocked on entry.
 169   Thread* volatile _succ;           // Heir presumptive thread - used for futile wakeup throttling
 170   Thread* volatile _Responsible;
 171 
 172   volatile int _Spinner;            // for exit->spinner handoff optimization
 173   volatile int _SpinDuration;
 174 
 175   jint  _contentions;               // Number of active contentions in enter(). It is used by is_busy()
 176                                     // along with other fields to determine if an ObjectMonitor can be
 177                                     // deflated. It is also used by the async deflation protocol. See
 178                                     // ObjectSynchronizer::deflate_monitor() and deflate_monitor_using_JT().
 179  protected:
 180   ObjectWaiter* volatile _WaitSet;  // LL of threads wait()ing on the monitor
 181   volatile jint  _waiters;          // number of waiting threads
 182  private:
 183   volatile int _WaitSetLock;        // protects Wait Queue - simple spinlock
 184 
 185  public:
 186   static void Initialize();
 187 
 188   // Only perform a PerfData operation if the PerfData object has been
 189   // allocated and if the PerfDataManager has not freed the PerfData
 190   // objects which can happen at normal VM shutdown.
 191   //
 192   #define OM_PERFDATA_OP(f, op_str)              \
 193     do {                                         \
 194       if (ObjectMonitor::_sync_ ## f != NULL &&  \
 195           PerfDataManager::has_PerfData()) {     \
 196         ObjectMonitor::_sync_ ## f->op_str;      \
 197       }                                          \
 198     } while (0)


 225   // ObjectMonitor references can be ORed with markWord::monitor_value
 226   // as part of the ObjectMonitor tagging mechanism. When we combine an
 227   // ObjectMonitor reference with an offset, we need to remove the tag
 228   // value in order to generate the proper address.
 229   //
 230   // We can either adjust the ObjectMonitor reference and then add the
 231   // offset or we can adjust the offset that is added to the ObjectMonitor
 232   // reference. The latter avoids an AGI (Address Generation Interlock)
 233   // stall so the helper macro adjusts the offset value that is returned
 234   // to the ObjectMonitor reference manipulation code:
 235   //
 236   #define OM_OFFSET_NO_MONITOR_VALUE_TAG(f) \
 237     ((ObjectMonitor::f ## _offset_in_bytes()) - markWord::monitor_value)
 238 
 239   markWord           header() const;
 240   volatile markWord* header_addr();
 241   void               set_header(markWord hdr);
 242 
 243   intptr_t is_busy() const {
 244     // TODO-FIXME: assert _owner == null implies _recursions = 0
 245     intptr_t ret_code = _waiters | intptr_t(_cxq) | intptr_t(_EntryList);
 246     if (!AsyncDeflateIdleMonitors) {
 247       ret_code |= contentions() | intptr_t(_owner);
 248     } else {
 249       if (contentions() > 0) {
 250         ret_code |= contentions();
 251       }
 252       if (_owner != DEFLATER_MARKER) {
 253         ret_code |= intptr_t(_owner);
 254       }
 255     }
 256     return ret_code;
 257   }
 258   const char* is_busy_to_string(stringStream* ss);
 259 
 260   intptr_t  is_entered(Thread* current) const;
 261 
 262   void*     owner() const;  // Returns NULL if DEFLATER_MARKER is observed.
 263   // Returns true if owner field == DEFLATER_MARKER and false otherwise.
 264   bool      owner_is_DEFLATER_MARKER();
 265   // Returns true if 'this' is being async deflated and false otherwise.
 266   bool      is_being_async_deflated();
 267   // Clear _owner field; current value must match old_value.
 268   void      release_clear_owner(void* old_value);
 269   // Simply set _owner field to new_value; current value must match old_value.
 270   void      set_owner_from(void* old_value, void* new_value);
 271   // Simply set _owner field to new_value; current value must match old_value1 or old_value2.
 272   void      set_owner_from(void* old_value1, void* old_value2, void* new_value);
 273   // Simply set _owner field to self; current value must match basic_lock_p.
 274   void      set_owner_from_BasicLock(void* basic_lock_p, Thread* self);
 275   // Try to set _owner field to new_value if the current value matches
 276   // old_value, using Atomic::cmpxchg(). Otherwise, does not change the
 277   // _owner field. Returns the prior value of the _owner field.
 278   void*     try_set_owner_from(void* old_value, void* new_value);
 279 
 280   ObjectMonitor* next_om() const;
 281   // Simply set _next_om field to new_value.
 282   void set_next_om(ObjectMonitor* new_value);
 283   // Try to set _next_om field to new_value if the current value matches
 284   // old_value, using Atomic::cmpxchg(). Otherwise, does not change the
 285   // _next_om field. Returns the prior value of the _next_om field.
 286   ObjectMonitor* try_set_next_om(ObjectMonitor* old_value, ObjectMonitor* new_value);
 287 
 288   jint      waiters() const;
 289 
 290   jint      contentions() const;
 291   intx      recursions() const                                         { return _recursions; }
 292 


 295   ObjectWaiter* next_waiter(ObjectWaiter* o)                           { return o->_next; }
 296   Thread* thread_of_waiter(ObjectWaiter* o)                            { return o->_thread; }
 297 
 298  protected:
 299   // We don't typically expect or want the ctors or dtors to run.
 300   // normal ObjectMonitors are type-stable and immortal.
 301   ObjectMonitor() { ::memset((void*)this, 0, sizeof(*this)); }
 302 
 303   ~ObjectMonitor() {
 304     // TODO: Add asserts ...
 305     // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
 306     // _contentions == 0 _EntryList  == NULL etc
 307   }
 308 
 309  private:
 310   void Recycle() {
 311     // TODO: add stronger asserts ...
 312     // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
 313     // _contentions == 0 EntryList  == NULL
 314     // _recursions == 0 _WaitSet == NULL
 315 #ifdef ASSERT
 316     stringStream ss;
 317 #endif
 318     assert((is_busy() | _recursions) == 0, "freeing in-use monitor: %s, "
 319            "recursions=" INTX_FORMAT, is_busy_to_string(&ss), _recursions);
 320     _succ          = NULL;
 321     _EntryList     = NULL;
 322     _cxq           = NULL;
 323     _WaitSet       = NULL;
 324     _recursions    = 0;
 325   }
 326 
 327  public:
 328 
 329   void*     object() const;
 330   void*     object_addr();
 331   void      set_object(void* obj);
 332   void      set_allocation_state(AllocationState s);
 333   AllocationState allocation_state() const;
 334   bool      is_free() const;
 335   bool      is_old() const;
 336   bool      is_new() const;
 337 
 338   // Returns true if the specified thread owns the ObjectMonitor. Otherwise
 339   // returns false and throws IllegalMonitorStateException (IMSE).
 340   bool      check_owner(Thread* THREAD);
 341   void      clear();
 342   void      clear_using_JT();
 343 
 344   bool      enter(TRAPS);
 345   void      exit(bool not_suspended, TRAPS);
 346   void      wait(jlong millis, bool interruptable, TRAPS);
 347   void      notify(TRAPS);
 348   void      notifyAll(TRAPS);
 349 
 350   void      print() const;
 351 #ifdef ASSERT
 352   void      print_debug_style_on(outputStream* st) const;
 353 #endif
 354   void      print_on(outputStream* st) const;
 355 
 356 // Use the following at your own risk
 357   intx      complete_exit(TRAPS);
 358   bool      reenter(intx recursions, TRAPS);
 359 
 360  private:
 361   void      AddWaiter(ObjectWaiter* waiter);
 362   void      INotify(Thread* self);
 363   ObjectWaiter* DequeueWaiter();
 364   void      DequeueSpecificWaiter(ObjectWaiter* waiter);
 365   void      EnterI(TRAPS);
 366   void      ReenterI(Thread* self, ObjectWaiter* self_node);
 367   void      UnlinkAfterAcquire(Thread* self, ObjectWaiter* self_node);
 368   int       TryLock(Thread* self);
 369   int       NotRunnable(Thread* self, Thread* Owner);
 370   int       TrySpin(Thread* self);
 371   void      ExitEpilog(Thread* self, ObjectWaiter* Wakee);
 372   bool      ExitSuspendEquivalent(JavaThread* self);
 373   void      install_displaced_markword_in_object(const oop obj);
 374 };
 375 
 376 // Macro to use guarantee() for more strict AsyncDeflateIdleMonitors
 377 // checks and assert() otherwise.
 378 #define ADIM_guarantee(p, ...)       \
 379   do {                               \
 380     if (AsyncDeflateIdleMonitors) {  \
 381       guarantee(p, __VA_ARGS__);     \
 382     } else {                         \
 383       assert(p, __VA_ARGS__);        \
 384     }                                \
 385   } while (0)
 386 
 387 #endif // SHARE_RUNTIME_OBJECTMONITOR_HPP
< prev index next >