hotspot/src/share/vm/runtime/objectMonitor.cpp
changeset 26684 d1221849ea3d
parent 26683 a02753d5a0b2
child 27165 785a8d56024c
--- a/hotspot/src/share/vm/runtime/objectMonitor.cpp	Wed Sep 10 11:48:20 2014 -0600
+++ b/hotspot/src/share/vm/runtime/objectMonitor.cpp	Wed Sep 10 11:52:16 2014 -0600
@@ -70,10 +70,10 @@
 
 #define DTRACE_MONITOR_WAIT_PROBE(monitor, obj, thread, millis)            \
   {                                                                        \
-    if (DTraceMonitorProbes) {                                            \
+    if (DTraceMonitorProbes) {                                             \
       DTRACE_MONITOR_PROBE_COMMON(obj, thread);                            \
       HOTSPOT_MONITOR_WAIT(jtid,                                           \
-                       (monitor), bytes, len, (millis));                   \
+                           (monitor), bytes, len, (millis));               \
     }                                                                      \
   }
 
@@ -85,10 +85,10 @@
 
 #define DTRACE_MONITOR_PROBE(probe, monitor, obj, thread)                  \
   {                                                                        \
-    if (DTraceMonitorProbes) {                                            \
+    if (DTraceMonitorProbes) {                                             \
       DTRACE_MONITOR_PROBE_COMMON(obj, thread);                            \
-      HOTSPOT_MONITOR_##probe(jtid,                                               \
-                       (uintptr_t)(monitor), bytes, len);                  \
+      HOTSPOT_MONITOR_##probe(jtid,                                        \
+                              (uintptr_t)(monitor), bytes, len);           \
     }                                                                      \
   }
 
@@ -278,8 +278,8 @@
   void * cur = Atomic::cmpxchg_ptr (Self, &_owner, NULL);
   if (cur == NULL) {
     // Either ASSERT _recursions == 0 or explicitly set _recursions = 0.
-    assert(_recursions == 0   , "invariant");
-    assert(_owner      == Self, "invariant");
+    assert(_recursions == 0, "invariant");
+    assert(_owner == Self, "invariant");
     // CONSIDER: set or assert OwnerIsThread == 1
     return;
   }
@@ -310,20 +310,20 @@
   // Note that if we acquire the monitor from an initial spin
   // we forgo posting JVMTI events and firing DTRACE probes.
   if (Knob_SpinEarly && TrySpin (Self) > 0) {
-    assert(_owner == Self      , "invariant");
-    assert(_recursions == 0    , "invariant");
+    assert(_owner == Self, "invariant");
+    assert(_recursions == 0, "invariant");
     assert(((oop)(object()))->mark() == markOopDesc::encode(this), "invariant");
     Self->_Stalled = 0;
     return;
   }
 
-  assert(_owner != Self          , "invariant");
-  assert(_succ  != Self          , "invariant");
-  assert(Self->is_Java_thread()  , "invariant");
+  assert(_owner != Self, "invariant");
+  assert(_succ != Self, "invariant");
+  assert(Self->is_Java_thread(), "invariant");
   JavaThread * jt = (JavaThread *) Self;
   assert(!SafepointSynchronize::is_at_safepoint(), "invariant");
-  assert(jt->thread_state() != _thread_blocked   , "invariant");
-  assert(this->object() != NULL  , "invariant");
+  assert(jt->thread_state() != _thread_blocked, "invariant");
+  assert(this->object() != NULL, "invariant");
   assert(_count >= 0, "invariant");
 
   // Prevent deflation at STW-time.  See deflate_idle_monitors() and is_busy().
@@ -361,7 +361,6 @@
 
       if (!ExitSuspendEquivalent(jt)) break;
 
-      //
       // We have acquired the contended monitor, but while we were
       // waiting another thread suspended us. We don't want to enter
       // the monitor while suspended because that would surprise the
@@ -390,9 +389,9 @@
   Self->_Stalled = 0;
 
   // Must either set _recursions = 0 or ASSERT _recursions == 0.
-  assert(_recursions == 0     , "invariant");
-  assert(_owner == Self       , "invariant");
-  assert(_succ  != Self       , "invariant");
+  assert(_recursions == 0, "invariant");
+  assert(_owner == Self, "invariant");
+  assert(_succ != Self, "invariant");
   assert(((oop)(object()))->mark() == markOopDesc::encode(this), "invariant");
 
   // The thread -- now the owner -- is back in vm mode.
@@ -434,7 +433,7 @@
 // Caveat: TryLock() is not necessarily serializing if it returns failure.
 // Callers must compensate as needed.
 
-int ObjectMonitor::TryLock (Thread * Self) {
+int ObjectMonitor::TryLock(Thread * Self) {
   void * own = _owner;
   if (own != NULL) return 0;
   if (Atomic::cmpxchg_ptr (Self, &_owner, NULL) == NULL) {
@@ -451,16 +450,16 @@
   return -1;
 }
 
-void NOINLINE ObjectMonitor::EnterI (TRAPS) {
+void NOINLINE ObjectMonitor::EnterI(TRAPS) {
   Thread * const Self = THREAD;
   assert(Self->is_Java_thread(), "invariant");
-  assert(((JavaThread *) Self)->thread_state() == _thread_blocked   , "invariant");
+  assert(((JavaThread *) Self)->thread_state() == _thread_blocked, "invariant");
 
   // Try the lock - TATAS
   if (TryLock (Self) > 0) {
-    assert(_succ != Self              , "invariant");
-    assert(_owner == Self             , "invariant");
-    assert(_Responsible != Self       , "invariant");
+    assert(_succ != Self, "invariant");
+    assert(_owner == Self, "invariant");
+    assert(_Responsible != Self, "invariant");
     return;
   }
 
@@ -474,16 +473,16 @@
   // effects.
 
   if (TrySpin (Self) > 0) {
-    assert(_owner == Self        , "invariant");
-    assert(_succ != Self         , "invariant");
-    assert(_Responsible != Self  , "invariant");
+    assert(_owner == Self, "invariant");
+    assert(_succ != Self, "invariant");
+    assert(_Responsible != Self, "invariant");
     return;
   }
 
   // The Spin failed -- Enqueue and park the thread ...
-  assert(_succ  != Self            , "invariant");
-  assert(_owner != Self            , "invariant");
-  assert(_Responsible != Self      , "invariant");
+  assert(_succ != Self, "invariant");
+  assert(_owner != Self, "invariant");
+  assert(_Responsible != Self, "invariant");
 
   // Enqueue "Self" on ObjectMonitor's _cxq.
   //
@@ -493,7 +492,6 @@
   // Java objects.  This would avoid awkward lifecycle and liveness issues,
   // as well as eliminate a subset of ABA issues.
   // TODO: eliminate ObjectWaiter and enqueue either Threads or Events.
-  //
 
   ObjectWaiter node(Self);
   Self->_ParkEvent->reset();
@@ -512,9 +510,9 @@
     // Interference - the CAS failed because _cxq changed.  Just retry.
     // As an optional optimization we retry the lock.
     if (TryLock (Self) > 0) {
-      assert(_succ != Self         , "invariant");
-      assert(_owner == Self        , "invariant");
-      assert(_Responsible != Self  , "invariant");
+      assert(_succ != Self, "invariant");
+      assert(_owner == Self, "invariant");
+      assert(_Responsible != Self, "invariant");
       return;
     }
   }
@@ -629,8 +627,8 @@
   // The head of cxq is volatile but the interior is stable.
   // In addition, Self.TState is stable.
 
-  assert(_owner == Self      , "invariant");
-  assert(object() != NULL    , "invariant");
+  assert(_owner == Self, "invariant");
+  assert(object() != NULL, "invariant");
   // I'd like to write:
   //   guarantee (((oop)(object()))->mark() == markOopDesc::encode(this), "invariant") ;
   // but as we're at a safepoint that's not safe.
@@ -700,12 +698,12 @@
 // Knob_Reset and Knob_SpinAfterFutile support and restructuring the
 // loop accordingly.
 
-void NOINLINE ObjectMonitor::ReenterI (Thread * Self, ObjectWaiter * SelfNode) {
-  assert(Self != NULL                , "invariant");
-  assert(SelfNode != NULL            , "invariant");
-  assert(SelfNode->_thread == Self   , "invariant");
-  assert(_waiters > 0                , "invariant");
-  assert(((oop)(object()))->mark() == markOopDesc::encode(this) , "invariant");
+void NOINLINE ObjectMonitor::ReenterI(Thread * Self, ObjectWaiter * SelfNode) {
+  assert(Self != NULL, "invariant");
+  assert(SelfNode != NULL, "invariant");
+  assert(SelfNode->_thread == Self, "invariant");
+  assert(_waiters > 0, "invariant");
+  assert(((oop)(object()))->mark() == markOopDesc::encode(this), "invariant");
   assert(((JavaThread *)Self)->thread_state() != _thread_blocked, "invariant");
   JavaThread * jt = (JavaThread *) Self;
 
@@ -792,8 +790,7 @@
 // after the thread acquires the lock in ::enter().  Equally, we could defer
 // unlinking the thread until ::exit()-time.
 
-void ObjectMonitor::UnlinkAfterAcquire (Thread * Self, ObjectWaiter * SelfNode)
-{
+void ObjectMonitor::UnlinkAfterAcquire(Thread *Self, ObjectWaiter *SelfNode) {
   assert(_owner == Self, "invariant");
   assert(SelfNode->_thread == Self, "invariant");
 
@@ -980,7 +977,7 @@
       // Instead, I use release_store(), which is implemented as just a simple
       // ST on x64, x86 and SPARC.
       OrderAccess::release_store_ptr(&_owner, NULL);   // drop the lock
-      OrderAccess::storeload();                         // See if we need to wake a successor
+      OrderAccess::storeload();                        // See if we need to wake a successor
       if ((intptr_t(_EntryList)|intptr_t(_cxq)) == 0 || _succ != NULL) {
         TEVENT(Inflated exit - simple egress);
         return;
@@ -1017,7 +1014,6 @@
       // The dropped lock needs to become visible to the spinner, and then
       // the acquisition of the lock by the spinner must become visible to
       // the exiting thread).
-      //
 
       // It appears that an heir-presumptive (successor) must be made ready.
       // Only the current lock owner can manipulate the EntryList or
@@ -1081,7 +1077,7 @@
       // This policy ensure that recently-run threads live at the head of EntryList.
       // Drain _cxq into EntryList - bulk transfer.
       // First, detach _cxq.
-      // The following loop is tantamount to: w = swap (&cxq, NULL)
+      // The following loop is tantamount to: w = swap(&cxq, NULL)
       w = _cxq;
       for (;;) {
         assert(w != NULL, "Invariant");
@@ -1089,7 +1085,7 @@
         if (u == w) break;
         w = u;
       }
-      assert(w != NULL              , "invariant");
+      assert(w != NULL, "invariant");
 
       ObjectWaiter * q = NULL;
       ObjectWaiter * p;
@@ -1103,7 +1099,9 @@
       // Append the RATs to the EntryList
       // TODO: organize EntryList as a CDLL so we can locate the tail in constant-time.
       ObjectWaiter * Tail;
-      for (Tail = _EntryList; Tail != NULL && Tail->_next != NULL; Tail = Tail->_next);
+      for (Tail = _EntryList; Tail != NULL && Tail->_next != NULL;
+           Tail = Tail->_next)
+        /* empty */;
       if (Tail == NULL) {
         _EntryList = w;
       } else {
@@ -1120,7 +1118,7 @@
 
       // Drain _cxq into EntryList - bulk transfer.
       // First, detach _cxq.
-      // The following loop is tantamount to: w = swap (&cxq, NULL)
+      // The following loop is tantamount to: w = swap(&cxq, NULL)
       w = _cxq;
       for (;;) {
         assert(w != NULL, "Invariant");
@@ -1128,7 +1126,7 @@
         if (u == w) break;
         w = u;
       }
-      assert(w != NULL              , "invariant");
+      assert(w != NULL, "invariant");
 
       ObjectWaiter * q = NULL;
       ObjectWaiter * p;
@@ -1174,7 +1172,7 @@
 
     // Drain _cxq into EntryList - bulk transfer.
     // First, detach _cxq.
-    // The following loop is tantamount to: w = swap (&cxq, NULL)
+    // The following loop is tantamount to: w = swap(&cxq, NULL)
     for (;;) {
       assert(w != NULL, "Invariant");
       ObjectWaiter * u = (ObjectWaiter *) Atomic::cmpxchg_ptr(NULL, &_cxq, w);
@@ -1183,8 +1181,8 @@
     }
     TEVENT(Inflated exit - drain cxq into EntryList);
 
-    assert(w != NULL              , "invariant");
-    assert(_EntryList  == NULL    , "invariant");
+    assert(w != NULL, "invariant");
+    assert(_EntryList == NULL, "invariant");
 
     // Convert the LIFO SLL anchored by _cxq into a DLL.
     // The list reorganization step operates in O(LENGTH(w)) time.
@@ -1277,7 +1275,7 @@
 // decreased. - Dave
 
 
-bool ObjectMonitor::ExitSuspendEquivalent (JavaThread * jSelf) {
+bool ObjectMonitor::ExitSuspendEquivalent(JavaThread * jSelf) {
   const int Mode = Knob_FastHSSEC;
   if (Mode && !jSelf->is_external_suspend()) {
     assert(jSelf->is_suspend_equivalent(), "invariant");
@@ -1292,7 +1290,7 @@
 }
 
 
-void ObjectMonitor::ExitEpilog (Thread * Self, ObjectWaiter * Wakee) {
+void ObjectMonitor::ExitEpilog(Thread * Self, ObjectWaiter * Wakee) {
   assert(_owner == Self, "invariant");
 
   // Exit protocol:
@@ -1346,7 +1344,7 @@
   if (THREAD != _owner) {
     if (THREAD->is_lock_owned ((address)_owner)) {
       assert(_recursions == 0, "internal state error");
-      _owner = THREAD;   /* Convert from basiclock addr to Thread addr */
+      _owner = THREAD;   // Convert from basiclock addr to Thread addr
       _recursions = 0;
       OwnerIsThread = 1;
     }
@@ -1381,18 +1379,18 @@
 // which use this (which is why we don't put this into check_slow and
 // call it with a CHECK argument).
 
-#define CHECK_OWNER()                                                             \
-  do {                                                                            \
-    if (THREAD != _owner) {                                                       \
-      if (THREAD->is_lock_owned((address) _owner)) {                              \
-        _owner = THREAD;  /* Convert from basiclock addr to Thread addr */       \
-        _recursions = 0;                                                          \
-        OwnerIsThread = 1;                                                       \
-      } else {                                                                    \
-        TEVENT(Throw IMSX);                                                     \
-        THROW(vmSymbols::java_lang_IllegalMonitorStateException());               \
-      }                                                                           \
-    }                                                                             \
+#define CHECK_OWNER()                                                       \
+  do {                                                                      \
+    if (THREAD != _owner) {                                                 \
+      if (THREAD->is_lock_owned((address) _owner)) {                        \
+        _owner = THREAD;  /* Convert from basiclock addr to Thread addr */  \
+        _recursions = 0;                                                    \
+        OwnerIsThread = 1;                                                  \
+      } else {                                                              \
+        TEVENT(Throw IMSX);                                                 \
+        THROW(vmSymbols::java_lang_IllegalMonitorStateException());         \
+      }                                                                     \
+    }                                                                       \
   } while (false)
 
 // check_slow() is a misnomer.  It's called to simply to throw an IMSX exception.
@@ -1404,9 +1402,9 @@
   THROW_MSG(vmSymbols::java_lang_IllegalMonitorStateException(), "current thread not owner");
 }
 
-static int Adjust (volatile int * adr, int dx) {
+static int Adjust(volatile int * adr, int dx) {
   int v;
-  for (v = *adr; Atomic::cmpxchg(v + dx, adr, v) != v; v = *adr);
+  for (v = *adr; Atomic::cmpxchg(v + dx, adr, v) != v; v = *adr) /* empty */;
   return v;
 }
 
@@ -1517,8 +1515,7 @@
 
       if (interruptible && (Thread::is_interrupted(THREAD, false) || HAS_PENDING_EXCEPTION)) {
         // Intentionally empty
-      } else
-      if (node._notified == 0) {
+      } else if (node._notified == 0) {
         if (millis <= 0) {
           Self->_ParkEvent->park();
         } else {
@@ -1534,7 +1531,6 @@
 
     } // Exit thread safepoint: transition _thread_blocked -> _thread_in_vm
 
-
     // Node may be on the WaitSet, the EntryList (or cxq), or in transition
     // from the WaitSet to the EntryList.
     // See if we need to remove Node from the WaitSet.
@@ -1625,7 +1621,7 @@
     // want residual elements associated with this thread left on any lists.
     guarantee(node.TState == ObjectWaiter::TS_RUN, "invariant");
     assert(_owner == Self, "invariant");
-    assert(_succ != Self , "invariant");
+    assert(_succ != Self, "invariant");
   } // OSThreadWaitState()
 
   jt->set_current_waiting_monitor(NULL);
@@ -1635,8 +1631,8 @@
   _waiters--;             // decrement the number of waiters
 
   // Verify a few postconditions
-  assert(_owner == Self       , "invariant");
-  assert(_succ  != Self       , "invariant");
+  assert(_owner == Self, "invariant");
+  assert(_succ != Self, "invariant");
   assert(((oop)(object()))->mark() == markOopDesc::encode(this), "invariant");
 
   if (SyncFlags & 32) {
@@ -1703,8 +1699,7 @@
         iterator->_prev = NULL;
         _EntryList = iterator;
       }
-    } else
-    if (Policy == 1) {      // append to EntryList
+    } else if (Policy == 1) {      // append to EntryList
       if (List == NULL) {
         iterator->_next = iterator->_prev = NULL;
         _EntryList = iterator;
@@ -1713,14 +1708,13 @@
         // the EntryList.  We can make tail access constant-time by converting to
         // a CDLL instead of using our current DLL.
         ObjectWaiter * Tail;
-        for (Tail = List; Tail->_next != NULL; Tail = Tail->_next);
+        for (Tail = List; Tail->_next != NULL; Tail = Tail->_next) /* empty */;
         assert(Tail != NULL && Tail->_next == NULL, "invariant");
         Tail->_next = iterator;
         iterator->_prev = Tail;
         iterator->_next = NULL;
       }
-    } else
-    if (Policy == 2) {      // prepend to cxq
+    } else if (Policy == 2) {      // prepend to cxq
       // prepend to cxq
       if (List == NULL) {
         iterator->_next = iterator->_prev = NULL;
@@ -1735,8 +1729,7 @@
           }
         }
       }
-    } else
-    if (Policy == 3) {      // append to cxq
+    } else if (Policy == 3) {      // append to cxq
       iterator->TState = ObjectWaiter::TS_CXQ;
       for (;;) {
         ObjectWaiter * Tail;
@@ -1832,8 +1825,7 @@
         iterator->_prev = NULL;
         _EntryList = iterator;
       }
-    } else
-    if (Policy == 1) {      // append to EntryList
+    } else if (Policy == 1) {      // append to EntryList
       if (List == NULL) {
         iterator->_next = iterator->_prev = NULL;
         _EntryList = iterator;
@@ -1842,14 +1834,13 @@
         // the EntryList.  We can make tail access constant-time by converting to
         // a CDLL instead of using our current DLL.
         ObjectWaiter * Tail;
-        for (Tail = List; Tail->_next != NULL; Tail = Tail->_next);
+        for (Tail = List; Tail->_next != NULL; Tail = Tail->_next) /* empty */;
         assert(Tail != NULL && Tail->_next == NULL, "invariant");
         Tail->_next = iterator;
         iterator->_prev = Tail;
         iterator->_next = NULL;
       }
-    } else
-    if (Policy == 2) {      // prepend to cxq
+    } else if (Policy == 2) {      // prepend to cxq
       // prepend to cxq
       iterator->TState = ObjectWaiter::TS_CXQ;
       for (;;) {
@@ -1859,8 +1850,7 @@
           break;
         }
       }
-    } else
-    if (Policy == 3) {      // append to cxq
+    } else if (Policy == 3) {      // append to cxq
       iterator->TState = ObjectWaiter::TS_CXQ;
       for (;;) {
         ObjectWaiter * Tail;
@@ -1969,7 +1959,6 @@
 // situation is not dire.  The state is benign -- there's no need to add
 // hysteresis control to damp the transition rate between spinning and
 // not spinning.
-//
 
 intptr_t ObjectMonitor::SpinCallbackArgument = 0;
 int (*ObjectMonitor::SpinCallbackFunction)(intptr_t, int) = NULL;
@@ -1977,8 +1966,7 @@
 // Spinning: Fixed frequency (100%), vary duration
 
 
-int ObjectMonitor::TrySpin_VaryDuration (Thread * Self) {
-
+int ObjectMonitor::TrySpin_VaryDuration(Thread * Self) {
   // Dumb, brutal spin.  Good for comparative measurements against adaptive spinning.
   int ctr = Knob_FixedSpin;
   if (ctr != 0) {
@@ -2241,7 +2229,7 @@
 // Spinning, in general, is probabilistic anyway.
 
 
-int ObjectMonitor::NotRunnable (Thread * Self, Thread * ox) {
+int ObjectMonitor::NotRunnable(Thread * Self, Thread * ox) {
   // Check either OwnerIsThread or ox->TypeTag == 2BAD.
   if (!OwnerIsThread) return 0;
 
@@ -2378,8 +2366,16 @@
   InitializationCompleted = 1;
   if (UsePerfData) {
     EXCEPTION_MARK;
-      #define NEWPERFCOUNTER(n)   {n = PerfDataManager::create_counter(SUN_RT, #n, PerfData::U_Events,CHECK); }
-      #define NEWPERFVARIABLE(n)  {n = PerfDataManager::create_variable(SUN_RT, #n, PerfData::U_Events,CHECK); }
+#define NEWPERFCOUNTER(n)                                                \
+  {                                                                      \
+    n = PerfDataManager::create_counter(SUN_RT, #n, PerfData::U_Events,  \
+                                        CHECK);                          \
+  }
+#define NEWPERFVARIABLE(n)                                                \
+  {                                                                       \
+    n = PerfDataManager::create_variable(SUN_RT, #n, PerfData::U_Events,  \
+                                         CHECK);                          \
+  }
     NEWPERFCOUNTER(_sync_Inflations);
     NEWPERFCOUNTER(_sync_Deflations);
     NEWPERFCOUNTER(_sync_ContendedLockAttempts);
@@ -2398,7 +2394,8 @@
     NEWPERFCOUNTER(_sync_MonInCirculation);
     NEWPERFCOUNTER(_sync_MonScavenged);
     NEWPERFVARIABLE(_sync_MonExtant);
-      #undef NEWPERFCOUNTER
+#undef NEWPERFCOUNTER
+#undef NEWPERFVARIABLE
   }
 }
 
@@ -2416,7 +2413,7 @@
 }
 
 
-static char * kvGet (char * kvList, const char * Key) {
+static char * kvGet(char * kvList, const char * Key) {
   if (kvList == NULL) return NULL;
   size_t n = strlen(Key);
   char * Search;
@@ -2429,7 +2426,7 @@
   return NULL;
 }
 
-static int kvGetInt (char * kvList, const char * Key, int Default) {
+static int kvGetInt(char * kvList, const char * Key, int Default) {
   char * v = kvGet(kvList, Key);
   int rslt = v ? ::strtol(v, NULL, 0) : Default;
   if (Knob_ReportSettings && v != NULL) {
@@ -2442,7 +2439,7 @@
 void ObjectMonitor::DeferredInitialize() {
   if (InitDone > 0) return;
   if (Atomic::cmpxchg (-1, &InitDone, 0) != 0) {
-    while (InitDone != 1);
+    while (InitDone != 1) /* empty */;
     return;
   }
 
@@ -2466,7 +2463,7 @@
     if (*p == ':') *p = 0;
   }
 
-  #define SETKNOB(x) { Knob_##x = kvGetInt (knobs, #x, Knob_##x); }
+  #define SETKNOB(x) { Knob_##x = kvGetInt(knobs, #x, Knob_##x); }
   SETKNOB(ReportSettings);
   SETKNOB(Verbose);
   SETKNOB(VerifyInUse);