src/share/vm/runtime/mutex.hpp

Sat, 01 Dec 2007 00:00:00 +0000

author
duke
date
Sat, 01 Dec 2007 00:00:00 +0000
changeset 435
a61af66fc99e
child 490
2a8eb116ebbe
permissions
-rw-r--r--

Initial load

     1 /*
     2  * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 // The SplitWord construct allows us to colocate the contention queue
    26 // (cxq) with the lock-byte.  The queue elements are ParkEvents, which are
    27 // always aligned on 256-byte addresses - the least significant byte of
    28 // a ParkEvent is always 0.  Colocating the lock-byte with the queue
    29 // allows us to easily avoid what would otherwise be a race in lock()
    30 // if we were to use two completely separate fields for the contention queue
    31 // and the lock indicator.  Specifically, colocation renders us immune
    32 // from the race where a thread might enqueue itself in the lock() slow-path
    33 // immediately after the lock holder drops the outer lock in the unlock()
    34 // fast-path.
    35 //
    36 // Colocation allows us to use a fast-path unlock() form that uses
    37 // A MEMBAR instead of a CAS.  MEMBAR has lower local latency than CAS
    38 // on many platforms.
    39 //
    40 // See:
    41 // +  http://blogs.sun.com/dave/entry/biased_locking_in_hotspot
    42 // +  http://blogs.sun.com/dave/resource/synchronization-public2.pdf
    43 //
    44 // Note that we're *not* using word-tearing the classic sense.
    45 // The lock() fast-path will CAS the lockword and the unlock()
    46 // fast-path will store into the lock-byte colocated within the lockword.
    47 // We depend on the fact that all our reference platforms have
    48 // coherent and atomic byte accesses.  More precisely, byte stores
    49 // interoperate in a safe, sane, and expected manner with respect to
    50 // CAS, ST and LDs to the full-word containing the byte.
    51 // If you're porting HotSpot to a platform where that isn't the case
    52 // then you'll want change the unlock() fast path from:
    53 //    STB;MEMBAR #storeload; LDN
    54 // to a full-word CAS of the lockword.
    57 union SplitWord {   // full-word with separately addressable LSB
    58   volatile intptr_t FullWord ;
    59   volatile void * Address ;
    60   volatile jbyte Bytes [sizeof(intptr_t)] ;
    61 } ;
    63 // Endian-ness ... index of least-significant byte in SplitWord.Bytes[]
    64 #ifdef AMD64        // little
    65  #define _LSBINDEX 0
    66 #else
    67 #if IA32            // little
    68  #define _LSBINDEX 0
    69 #else
    70 #ifdef SPARC        // big
    71  #define _LSBINDEX (sizeof(intptr_t)-1)
    72 #else
    73  #error "unknown architecture"
    74 #endif
    75 #endif
    76 #endif
    78 class ParkEvent ;
    80 // See orderAccess.hpp.  We assume throughout the VM that mutex lock and
    81 // try_lock do fence-lock-acquire, and that unlock does a release-unlock,
    82 // *in that order*.  If their implementations change such that these
    83 // assumptions are violated, a whole lot of code will break.
    85 class Monitor : public CHeapObj {
    87  public:
    88   // A special lock: Is a lock where you are guaranteed not to block while you are
    89   // holding it, i.e., no vm operation can happen, taking other locks, etc.
    90   // NOTE: It is critical that the rank 'special' be the lowest (earliest)
    91   // (except for "event"?) for the deadlock dection to work correctly.
    92   // The rank native is only for use in Mutex's created by JVM_RawMonitorCreate,
    93   // which being external to the VM are not subject to deadlock detection.
    94   // The rank safepoint is used only for synchronization in reaching a
    95   // safepoint and leaving a safepoint.  It is only used for the Safepoint_lock
    96   // currently.  While at a safepoint no mutexes of rank safepoint are held
    97   // by any thread.
    98   // The rank named "leaf" is probably historical (and should
    99   // be changed) -- mutexes of this rank aren't really leaf mutexes
   100   // at all.
   101   enum lock_types {
   102        event,
   103        special,
   104        suspend_resume,
   105        leaf        = suspend_resume +   2,
   106        safepoint   = leaf           +  10,
   107        barrier     = safepoint      +   1,
   108        nonleaf     = barrier        +   1,
   109        max_nonleaf = nonleaf        + 900,
   110        native      = max_nonleaf    +   1
   111   };
   113   // The WaitSet and EntryList linked lists are composed of ParkEvents.
   114   // I use ParkEvent instead of threads as ParkEvents are immortal and
   115   // type-stable, meaning we can safely unpark() a possibly stale
   116   // list element in the unlock()-path.
   118  protected:                              // Monitor-Mutex metadata
   119   SplitWord _LockWord ;                  // Contention queue (cxq) colocated with Lock-byte
   120   enum LockWordBits { _LBIT=1 } ;
   121   Thread * volatile _owner;              // The owner of the lock
   122                                          // Consider sequestering _owner on its own $line
   123                                          // to aid future synchronization mechanisms.
   124   ParkEvent * volatile _EntryList ;      // List of threads waiting for entry
   125   ParkEvent * volatile _OnDeck ;         // heir-presumptive
   126   volatile intptr_t _WaitLock [1] ;      // Protects _WaitSet
   127   ParkEvent * volatile  _WaitSet ;       // LL of ParkEvents
   128   volatile bool     _snuck;              // Used for sneaky locking (evil).
   129   const char * _name;                    // Name of mutex
   130   int NotifyCount ;                      // diagnostic assist
   131   double pad [8] ;                       // avoid false sharing
   133   // Debugging fields for naming, deadlock detection, etc. (some only used in debug mode)
   134 #ifndef PRODUCT
   135   bool      _allow_vm_block;
   136   debug_only(int _rank;)                 // rank (to avoid/detect potential deadlocks)
   137   debug_only(Monitor * _next;)           // Used by a Thread to link up owned locks
   138   debug_only(Thread* _last_owner;)       // the last thread to own the lock
   139   debug_only(static bool contains(Monitor * locks, Monitor * lock);)
   140   debug_only(static Monitor * get_least_ranked_lock(Monitor * locks);)
   141   debug_only(Monitor * get_least_ranked_lock_besides_this(Monitor * locks);)
   142 #endif
   144   void set_owner_implementation(Thread* owner)                        PRODUCT_RETURN;
   145   void check_prelock_state     (Thread* thread)                       PRODUCT_RETURN;
   146   void check_block_state       (Thread* thread)                       PRODUCT_RETURN;
   148   // platform-dependent support code can go here (in os_<os_family>.cpp)
   149  public:
   150   enum {
   151     _no_safepoint_check_flag    = true,
   152     _allow_vm_block_flag        = true,
   153     _as_suspend_equivalent_flag = true
   154   };
   156   enum WaitResults {
   157     CONDVAR_EVENT,         // Wait returned because of condition variable notification
   158     INTERRUPT_EVENT,       // Wait returned because waiting thread was interrupted
   159     NUMBER_WAIT_RESULTS
   160   };
   162  private:
   163    int  TrySpin (Thread * Self) ;
   164    int  TryLock () ;
   165    int  TryFast () ;
   166    int  AcquireOrPush (ParkEvent * ev) ;
   167    void IUnlock (bool RelaxAssert) ;
   168    void ILock (Thread * Self) ;
   169    int  IWait (Thread * Self, jlong timo);
   170    int  ILocked () ;
   172  protected:
   173    static void ClearMonitor (Monitor * m) ;
   174    Monitor() ;
   176  public:
   177   Monitor(int rank, const char *name, bool allow_vm_block=false);
   178   ~Monitor();
   180   // Wait until monitor is notified (or times out).
   181   // Defaults are to make safepoint checks, wait time is forever (i.e.,
   182   // zero), and not a suspend-equivalent condition. Returns true if wait
   183   // times out; otherwise returns false.
   184   bool wait(bool no_safepoint_check = !_no_safepoint_check_flag,
   185             long timeout = 0,
   186             bool as_suspend_equivalent = !_as_suspend_equivalent_flag);
   187   bool notify();
   188   bool notify_all();
   191   void lock(); // prints out warning if VM thread blocks
   192   void lock(Thread *thread); // overloaded with current thread
   193   void unlock();
   194   bool is_locked() const                     { return _owner != NULL; }
   196   bool try_lock(); // Like lock(), but unblocking. It returns false instead
   198   // Lock without safepoint check. Should ONLY be used by safepoint code and other code
   199   // that is guaranteed not to block while running inside the VM.
   200   void lock_without_safepoint_check();
   201   void lock_without_safepoint_check (Thread * Self) ;
   203   // Current owner - not not MT-safe. Can only be used to guarantee that
   204   // the current running thread owns the lock
   205   Thread* owner() const         { return _owner; }
   206   bool owned_by_self() const;
   208   // Support for JVM_RawMonitorEnter & JVM_RawMonitorExit. These can be called by
   209   // non-Java thread. (We should really have a RawMonitor abstraction)
   210   void jvm_raw_lock();
   211   void jvm_raw_unlock();
   212   const char *name() const                  { return _name; }
   214   void print_on_error(outputStream* st) const;
   216   #ifndef PRODUCT
   217     void print_on(outputStream* st) const;
   218     void print() const                      { print_on(tty); }
   219     debug_only(int    rank() const          { return _rank; })
   220     bool   allow_vm_block()                 { return _allow_vm_block; }
   222     debug_only(Monitor *next()  const         { return _next; })
   223     debug_only(void   set_next(Monitor *next) { _next = next; })
   224   #endif
   226   void set_owner(Thread* owner) {
   227   #ifndef PRODUCT
   228     set_owner_implementation(owner);
   229     debug_only(void verify_Monitor(Thread* thr));
   230   #else
   231     _owner = owner;
   232   #endif
   233   }
   235 };
   237 // Normally we'd expect Monitor to extend Mutex in the sense that a monitor
   238 // constructed from pthreads primitives might extend a mutex by adding
   239 // a condvar and some extra metadata.  In fact this was the case until J2SE7.
   240 //
   241 // Currently, however, the base object is a monitor.  Monitor contains all the
   242 // logic for wait(), notify(), etc.   Mutex extends monitor and restricts the
   243 // visiblity of wait(), notify(), and notify_all().
   244 //
   245 // Another viable alternative would have been to have Monitor extend Mutex and
   246 // implement all the normal mutex and wait()-notify() logic in Mutex base class.
   247 // The wait()-notify() facility would be exposed via special protected member functions
   248 // (e.g., _Wait() and _Notify()) in Mutex.  Monitor would extend Mutex and expose wait()
   249 // as a call to _Wait().  That is, the public wait() would be a wrapper for the protected
   250 // _Wait().
   251 //
   252 // An even better alternative is to simply eliminate Mutex:: and use Monitor:: instead.
   253 // After all, monitors are sufficient for Java-level synchronization.   At one point in time
   254 // there may have been some benefit to having distinct mutexes and monitors, but that time
   255 // has past.
   256 //
   257 // The Mutex/Monitor design parallels that of Java-monitors, being based on
   258 // thread-specific park-unpark platform-specific primitives.
   261 class Mutex : public Monitor {      // degenerate Monitor
   262  public:
   263    Mutex (int rank, const char *name, bool allow_vm_block=false);
   264    ~Mutex () ;
   265  private:
   266    bool notify ()    { ShouldNotReachHere(); return false; }
   267    bool notify_all() { ShouldNotReachHere(); return false; }
   268    bool wait (bool no_safepoint_check, long timeout, bool as_suspend_equivalent) {
   269      ShouldNotReachHere() ;
   270      return false ;
   271    }
   272 };
   274 /*
   275  * Per-thread blocking support for JSR166. See the Java-level
   276  * Documentation for rationale. Basically, park acts like wait, unpark
   277  * like notify.
   278  *
   279  * 6271289 --
   280  * To avoid errors where an os thread expires but the JavaThread still
   281  * exists, Parkers are immortal (type-stable) and are recycled across
   282  * new threads.  This parallels the ParkEvent implementation.
   283  * Because park-unpark allow spurious wakeups it is harmless if an
   284  * unpark call unparks a new thread using the old Parker reference.
   285  *
   286  * In the future we'll want to think about eliminating Parker and using
   287  * ParkEvent instead.  There's considerable duplication between the two
   288  * services.
   289  *
   290  */
   292 class Parker : public os::PlatformParker {
   293 private:
   294   volatile int _counter ;
   295   Parker * FreeNext ;
   296   JavaThread * AssociatedWith ; // Current association
   298 public:
   299   Parker() : PlatformParker() {
   300     _counter       = 0 ;
   301     FreeNext       = NULL ;
   302     AssociatedWith = NULL ;
   303   }
   304 protected:
   305   ~Parker() { ShouldNotReachHere(); }
   306 public:
   307   // For simplicity of interface with Java, all forms of park (indefinite,
   308   // relative, and absolute) are multiplexed into one call.
   309   void park(bool isAbsolute, jlong time);
   310   void unpark();
   312   // Lifecycle operators
   313   static Parker * Allocate (JavaThread * t) ;
   314   static void Release (Parker * e) ;
   315 private:
   316   static Parker * volatile FreeList ;
   317   static volatile int ListLock ;
   318 };

mercurial