< prev index next >

src/hotspot/share/runtime/objectMonitor.hpp

Print this page
rev 60098 : 8246476: remove AsyncDeflateIdleMonitors option and the safepoint based deflation mechanism
Reviewed-by: dholmes, pchilanomate, coleenp
rev 60099 : coleenp CR


 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)


 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


 298 
 299  protected:
 300   // We don't typically expect or want the ctors or dtors to run.
 301   // normal ObjectMonitors are type-stable and immortal.
 302   ObjectMonitor() { ::memset((void*)this, 0, sizeof(*this)); }
 303 
 304   ~ObjectMonitor() {
 305     // TODO: Add asserts ...
 306     // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
 307     // _contentions == 0 _EntryList  == NULL etc
 308   }
 309 
 310  private:
 311   void Recycle() {
 312     // TODO: add stronger asserts ...
 313     // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
 314     // _contentions == 0 EntryList  == NULL
 315     // _recursions == 0 _WaitSet == NULL
 316 #ifdef ASSERT
 317     stringStream ss;
 318 #endif
 319     assert((is_busy() | _recursions) == 0, "freeing in-use monitor: %s, "
 320            "recursions=" INTX_FORMAT, is_busy_to_string(&ss), _recursions);

 321     _succ          = NULL;
 322     _EntryList     = NULL;
 323     _cxq           = NULL;
 324     _WaitSet       = NULL;
 325     _recursions    = 0;
 326   }
 327 
 328  public:
 329 
 330   void*     object() const;
 331   void*     object_addr();
 332   void      set_object(void* obj);
 333   void      set_allocation_state(AllocationState s);
 334   AllocationState allocation_state() const;
 335   bool      is_free() const;
 336   bool      is_old() const;
 337   bool      is_new() const;
 338 
 339   // Returns true if the specified thread owns the ObjectMonitor. Otherwise
 340   // returns false and throws IllegalMonitorStateException (IMSE).


 357 // Use the following at your own risk
 358   intx      complete_exit(TRAPS);
 359   bool      reenter(intx recursions, TRAPS);
 360 
 361  private:
 362   void      AddWaiter(ObjectWaiter* waiter);
 363   void      INotify(Thread* self);
 364   ObjectWaiter* DequeueWaiter();
 365   void      DequeueSpecificWaiter(ObjectWaiter* waiter);
 366   void      EnterI(TRAPS);
 367   void      ReenterI(Thread* self, ObjectWaiter* self_node);
 368   void      UnlinkAfterAcquire(Thread* self, ObjectWaiter* self_node);
 369   int       TryLock(Thread* self);
 370   int       NotRunnable(Thread* self, Thread* Owner);
 371   int       TrySpin(Thread* self);
 372   void      ExitEpilog(Thread* self, ObjectWaiter* Wakee);
 373   bool      ExitSuspendEquivalent(JavaThread* self);
 374   void      install_displaced_markword_in_object(const oop obj);
 375 };
 376 
 377 // Macro to use guarantee() for more strict AsyncDeflateIdleMonitors
 378 // checks and assert() otherwise.
 379 #define ADIM_guarantee(p, ...)       \
 380   do {                               \
 381     if (AsyncDeflateIdleMonitors) {  \
 382       guarantee(p, __VA_ARGS__);     \
 383     } else {                         \
 384       assert(p, __VA_ARGS__);        \
 385     }                                \
 386   } while (0)
 387 
 388 #endif // SHARE_RUNTIME_OBJECTMONITOR_HPP


 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_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)


 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 (contentions() > 0) {
 247       ret_code |= contentions();
 248     }
 249     if (_owner != DEFLATER_MARKER) {
 250       ret_code |= intptr_t(_owner);
 251     }

 252     return ret_code;
 253   }
 254   const char* is_busy_to_string(stringStream* ss);
 255 
 256   intptr_t  is_entered(Thread* current) const;
 257 
 258   void*     owner() const;  // Returns NULL if DEFLATER_MARKER is observed.
 259   // Returns true if owner field == DEFLATER_MARKER and false otherwise.
 260   bool      owner_is_DEFLATER_MARKER();
 261   // Returns true if 'this' is being async deflated and false otherwise.
 262   bool      is_being_async_deflated();
 263   // Clear _owner field; current value must match old_value.
 264   void      release_clear_owner(void* old_value);
 265   // Simply set _owner field to new_value; current value must match old_value.
 266   void      set_owner_from(void* old_value, void* new_value);
 267   // Simply set _owner field to new_value; current value must match old_value1 or old_value2.
 268   void      set_owner_from(void* old_value1, void* old_value2, void* new_value);
 269   // Simply set _owner field to self; current value must match basic_lock_p.
 270   void      set_owner_from_BasicLock(void* basic_lock_p, Thread* self);
 271   // Try to set _owner field to new_value if the current value matches


 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 #ifdef ASSERT
 313     stringStream ss;

 314     assert((is_busy() | _recursions) == 0, "freeing in-use monitor: %s, "
 315            "recursions=" INTX_FORMAT, is_busy_to_string(&ss), _recursions);
 316 #endif
 317     _succ          = NULL;
 318     _EntryList     = NULL;
 319     _cxq           = NULL;
 320     _WaitSet       = NULL;
 321     _recursions    = 0;
 322   }
 323 
 324  public:
 325 
 326   void*     object() const;
 327   void*     object_addr();
 328   void      set_object(void* obj);
 329   void      set_allocation_state(AllocationState s);
 330   AllocationState allocation_state() const;
 331   bool      is_free() const;
 332   bool      is_old() const;
 333   bool      is_new() const;
 334 
 335   // Returns true if the specified thread owns the ObjectMonitor. Otherwise
 336   // returns false and throws IllegalMonitorStateException (IMSE).


 353 // Use the following at your own risk
 354   intx      complete_exit(TRAPS);
 355   bool      reenter(intx 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 #endif // SHARE_RUNTIME_OBJECTMONITOR_HPP
< prev index next >