hotspot/src/share/vm/runtime/synchronizer.hpp
changeset 6975 dc9b63952682
parent 5920 8fdbb85e62d3
child 7397 5b173b4ca846
equal deleted inserted replaced
6971:11c11e616b91 6975:dc9b63952682
    20  * or visit www.oracle.com if you need additional information or have any
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    21  * questions.
    22  *
    22  *
    23  */
    23  */
    24 
    24 
    25 class BasicLock VALUE_OBJ_CLASS_SPEC {
       
    26   friend class VMStructs;
       
    27  private:
       
    28   volatile markOop _displaced_header;
       
    29  public:
       
    30   markOop      displaced_header() const               { return _displaced_header; }
       
    31   void         set_displaced_header(markOop header)   { _displaced_header = header; }
       
    32 
       
    33   void print_on(outputStream* st) const;
       
    34 
       
    35   // move a basic lock (used during deoptimization
       
    36   void move_to(oop obj, BasicLock* dest);
       
    37 
       
    38   static int displaced_header_offset_in_bytes()       { return offset_of(BasicLock, _displaced_header); }
       
    39 };
       
    40 
       
    41 // A BasicObjectLock associates a specific Java object with a BasicLock.
       
    42 // It is currently embedded in an interpreter frame.
       
    43 
       
    44 // Because some machines have alignment restrictions on the control stack,
       
    45 // the actual space allocated by the interpreter may include padding words
       
    46 // after the end of the BasicObjectLock.  Also, in order to guarantee
       
    47 // alignment of the embedded BasicLock objects on such machines, we
       
    48 // put the embedded BasicLock at the beginning of the struct.
       
    49 
       
    50 class BasicObjectLock VALUE_OBJ_CLASS_SPEC {
       
    51   friend class VMStructs;
       
    52  private:
       
    53   BasicLock _lock;                                    // the lock, must be double word aligned
       
    54   oop       _obj;                                     // object holds the lock;
       
    55 
       
    56  public:
       
    57   // Manipulation
       
    58   oop      obj() const                                { return _obj;  }
       
    59   void set_obj(oop obj)                               { _obj = obj; }
       
    60   BasicLock* lock()                                   { return &_lock; }
       
    61 
       
    62   // Note: Use frame::interpreter_frame_monitor_size() for the size of BasicObjectLocks
       
    63   //       in interpreter activation frames since it includes machine-specific padding.
       
    64   static int size()                                   { return sizeof(BasicObjectLock)/wordSize; }
       
    65 
       
    66   // GC support
       
    67   void oops_do(OopClosure* f) { f->do_oop(&_obj); }
       
    68 
       
    69   static int obj_offset_in_bytes()                    { return offset_of(BasicObjectLock, _obj);  }
       
    70   static int lock_offset_in_bytes()                   { return offset_of(BasicObjectLock, _lock); }
       
    71 };
       
    72 
    25 
    73 class ObjectMonitor;
    26 class ObjectMonitor;
    74 
    27 
    75 class ObjectSynchronizer : AllStatic {
    28 class ObjectSynchronizer : AllStatic {
    76   friend class VMStructs;
    29   friend class VMStructs;
   161   // debugging
   114   // debugging
   162   static void trace_locking(Handle obj, bool is_compiled, bool is_method, bool is_locking) PRODUCT_RETURN;
   115   static void trace_locking(Handle obj, bool is_compiled, bool is_method, bool is_locking) PRODUCT_RETURN;
   163   static void verify() PRODUCT_RETURN;
   116   static void verify() PRODUCT_RETURN;
   164   static int  verify_objmon_isinpool(ObjectMonitor *addr) PRODUCT_RETURN0;
   117   static int  verify_objmon_isinpool(ObjectMonitor *addr) PRODUCT_RETURN0;
   165 
   118 
       
   119   static void RegisterSpinCallback (int (*)(intptr_t, int), intptr_t) ;
       
   120 
   166  private:
   121  private:
   167   enum { _BLOCKSIZE = 128 };
   122   enum { _BLOCKSIZE = 128 };
   168   static ObjectMonitor* gBlockList;
   123   static ObjectMonitor* gBlockList;
   169   static ObjectMonitor * volatile gFreeList;
   124   static ObjectMonitor * volatile gFreeList;
   170   static ObjectMonitor * volatile gOmInUseList; // for moribund thread, so monitors they inflated still get scanned
   125   static ObjectMonitor * volatile gOmInUseList; // for moribund thread, so monitors they inflated still get scanned
   171   static int gOmInUseCount;
   126   static int gOmInUseCount;
   172 
       
   173  public:
       
   174   static void Initialize () ;
       
   175   static PerfCounter * _sync_ContendedLockAttempts ;
       
   176   static PerfCounter * _sync_FutileWakeups ;
       
   177   static PerfCounter * _sync_Parks ;
       
   178   static PerfCounter * _sync_EmptyNotifications ;
       
   179   static PerfCounter * _sync_Notifications ;
       
   180   static PerfCounter * _sync_SlowEnter ;
       
   181   static PerfCounter * _sync_SlowExit ;
       
   182   static PerfCounter * _sync_SlowNotify ;
       
   183   static PerfCounter * _sync_SlowNotifyAll ;
       
   184   static PerfCounter * _sync_FailedSpins ;
       
   185   static PerfCounter * _sync_SuccessfulSpins ;
       
   186   static PerfCounter * _sync_PrivateA ;
       
   187   static PerfCounter * _sync_PrivateB ;
       
   188   static PerfCounter * _sync_MonInCirculation ;
       
   189   static PerfCounter * _sync_MonScavenged ;
       
   190   static PerfCounter * _sync_Inflations ;
       
   191   static PerfCounter * _sync_Deflations ;
       
   192   static PerfLongVariable * _sync_MonExtant ;
       
   193 
       
   194  public:
       
   195   static void RegisterSpinCallback (int (*)(intptr_t, int), intptr_t) ;
       
   196 
   127 
   197 };
   128 };
   198 
   129 
   199 // ObjectLocker enforced balanced locking and can never thrown an
   130 // ObjectLocker enforced balanced locking and can never thrown an
   200 // IllegalMonitorStateException. However, a pending exception may
   131 // IllegalMonitorStateException. However, a pending exception may