Backed out changesets 5f5e1ff2d8a4 and 4e1782f281d5 (bug 1161405) for Linux32 mochitest-bc crashes.
authorRyan VanderMeulen <ryanvm@gmail.com>
Tue, 19 May 2015 23:52:15 -0400
changeset 267500 94832733e36b9c82f2f34ef34fc5b0b9ab744765
parent 267499 13183431a6fefd9ce08045759ccf7004e311dff7
child 267501 3b796baa6b5ee1bec4997763b005b4ae43751981
push id830
push userraliiev@mozilla.com
push dateFri, 19 Jun 2015 19:24:37 +0000
treeherdermozilla-release@932614382a68 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1161405
milestone39.0
backs out5f5e1ff2d8a473a2876e523eaf69f84ed370e19d
4e1782f281d55e3fe399be05e48936c6cb0c40ab
Backed out changesets 5f5e1ff2d8a4 and 4e1782f281d5 (bug 1161405) for Linux32 mochitest-bc crashes.
xpcom/tests/gtest/TestThreadPool.cpp
xpcom/threads/nsEventQueue.cpp
xpcom/threads/nsEventQueue.h
xpcom/threads/nsThreadPool.cpp
--- a/xpcom/tests/gtest/TestThreadPool.cpp
+++ b/xpcom/tests/gtest/TestThreadPool.cpp
@@ -8,17 +8,16 @@
 #include <stdlib.h>
 #include "nsXPCOM.h"
 #include "nsXPCOMCIDInternal.h"
 #include "nsIThreadPool.h"
 #include "nsComponentManagerUtils.h"
 #include "nsCOMPtr.h"
 #include "nsIRunnable.h"
 #include "mozilla/Atomics.h"
-#include "mozilla/Monitor.h"
 #include "gtest/gtest.h"
 
 class Task final : public nsIRunnable
 {
 public:
   NS_DECL_THREADSAFE_ISUPPORTS
 
   explicit Task(int i) : mIndex(i) {}
@@ -54,68 +53,8 @@ TEST(ThreadPool, Main)
     EXPECT_TRUE(task);
 
     pool->Dispatch(task, NS_DISPATCH_NORMAL);
   }
 
   pool->Shutdown();
   EXPECT_EQ(Task::sCount, 100);
 }
-
-TEST(ThreadPool, Parallelism)
-{
-  nsCOMPtr<nsIThreadPool> pool = do_CreateInstance(NS_THREADPOOL_CONTRACTID);
-  EXPECT_TRUE(pool);
-
-  // Dispatch and sleep to ensure we have an idle thread
-  nsCOMPtr<nsIRunnable> r0 = new nsRunnable();
-  pool->Dispatch(r0, NS_DISPATCH_SYNC);
-  PR_Sleep(PR_SecondsToInterval(2));
-
-  class Runnable1 : public nsRunnable {
-  public:
-    Runnable1(Monitor& aMonitor, bool& aDone)
-      : mMonitor(aMonitor), mDone(aDone) {}
-
-    NS_IMETHOD Run() override {
-      MonitorAutoLock mon(mMonitor);
-      if (!mDone) {
-        // Wait for a reasonable timeout since we don't want to block gtests
-        // forever should any regression happen.
-        mon.Wait(PR_SecondsToInterval(300));
-      }
-      EXPECT_TRUE(mDone);
-      return NS_OK;
-    }
-  private:
-    Monitor& mMonitor;
-    bool& mDone;
-  };
-
-  class Runnable2 : public nsRunnable {
-  public:
-    Runnable2(Monitor& aMonitor, bool& aDone)
-      : mMonitor(aMonitor), mDone(aDone) {}
-
-    NS_IMETHOD Run() override {
-      MonitorAutoLock mon(mMonitor);
-      mDone = true;
-      mon.NotifyAll();
-      return NS_OK;
-    }
-  private:
-    Monitor& mMonitor;
-    bool& mDone;
-  };
-
-  // Dispatch 2 events in a row. Since we are still within the thread limit,
-  // We should wake up the idle thread and spawn a new thread so these 2 events
-  // can run in parallel. We will time out if r1 and r2 run in sequence for r1
-  // won't finish until r2 finishes.
-  Monitor mon("ThreadPool::Parallelism");
-  bool done = false;
-  nsCOMPtr<nsIRunnable> r1 = new Runnable1(mon, done);
-  nsCOMPtr<nsIRunnable> r2 = new Runnable2(mon, done);
-  pool->Dispatch(r1, NS_DISPATCH_NORMAL);
-  pool->Dispatch(r2, NS_DISPATCH_NORMAL);
-
-  pool->Shutdown();
-}
--- a/xpcom/threads/nsEventQueue.cpp
+++ b/xpcom/threads/nsEventQueue.cpp
@@ -116,44 +116,8 @@ nsEventQueue::PutEvent(nsIRunnable* aRun
     mOffsetTail = 0;
   }
 
   event.swap(mTail->mEvents[mOffsetTail]);
   ++mOffsetTail;
   LOG(("EVENTQ(%p): notify\n", this));
   mon.NotifyAll();
 }
-
-size_t
-nsEventQueue::Count()
-{
-  ReentrantMonitorAutoEnter mon(mReentrantMonitor);
-
-  // It is obvious count is 0 when the queue is empty.
-  if (!mHead) {
-    return 0;
-  }
-
-  /* How we count the number of events in the queue:
-   * 1. Let pageCount(x, y) denote the number of pages excluding the tail page
-   *    where x is the index of head page and y is the index of the tail page.
-   * 2. Then we have pageCount(x, y) = y - x.
-   *
-   * Ex: pageCount(0, 0) = 0 where both head and tail pages point to page 0.
-   *     pageCount(0, 1) = 1 where head points to page 0 and tail points page 1.
-   *
-   * 3. number of events = (EVENTS_PER_PAGE * pageCount(x, y))
-   *      - (empty slots in head page) + (non-empty slots in tail page)
-   *      = (EVENTS_PER_PAGE * pageCount(x, y)) - mOffsetHead + mOffsetTail
-   */
-
-  int count = -mOffsetHead;
-
-  // Compute (EVENTS_PER_PAGE * pageCount(x, y))
-  for (Page* page = mHead; page != mTail; page = page->mNext) {
-    count += EVENTS_PER_PAGE;
-  }
-
-  count += mOffsetTail;
-  MOZ_ASSERT(count >= 0);
-
-  return count;
-}
--- a/xpcom/threads/nsEventQueue.h
+++ b/xpcom/threads/nsEventQueue.h
@@ -46,18 +46,16 @@ public:
   }
 
   // Expose the event queue's monitor for "power users"
   ReentrantMonitor& GetReentrantMonitor()
   {
     return mReentrantMonitor;
   }
 
-  size_t Count();
-
 private:
 
   bool IsEmpty()
   {
     return !mHead || (mHead == mTail && mOffsetHead == mOffsetTail);
   }
 
   enum
--- a/xpcom/threads/nsThreadPool.cpp
+++ b/xpcom/threads/nsThreadPool.cpp
@@ -79,20 +79,17 @@ nsThreadPool::PutEvent(nsIRunnable* aEve
     if (NS_WARN_IF(mShutdown)) {
       return NS_ERROR_NOT_AVAILABLE;
     }
     LOG(("THRD-P(%p) put [%d %d %d]\n", this, mIdleCount, mThreads.Count(),
          mThreadLimit));
     MOZ_ASSERT(mIdleCount <= (uint32_t)mThreads.Count(), "oops");
 
     // Make sure we have a thread to service this event.
-    if (mThreads.Count() < (int32_t)mThreadLimit &&
-        // Spawn a new thread if we don't have enough idle threads to serve
-        // pending events immediately.
-        mEvents.Count() >= mIdleCount) {
+    if (mIdleCount == 0 && mThreads.Count() < (int32_t)mThreadLimit) {
       spawnThread = true;
     }
 
     mEvents.PutEvent(aEvent);
     stackSize = mStackSize;
   }
 
   LOG(("THRD-P(%p) put [spawn=%d]\n", this, spawnThread));