Lazily initialize thread pool to avoid allocating all the threads during startup
authorjochen@chromium.org <jochen@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 20 Dec 2013 08:34:42 +0000 (08:34 +0000)
committerjochen@chromium.org <jochen@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 20 Dec 2013 08:34:42 +0000 (08:34 +0000)
R=hpayer@chromium.org
BUG=none
LOG=n

Review URL: https://codereview.chromium.org/98123004

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18381 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/libplatform/default-platform.cc
src/libplatform/default-platform.h

index f05dc11..72e6002 100644 (file)
@@ -40,7 +40,7 @@ namespace internal {
 
 
 DefaultPlatform::DefaultPlatform()
-    : initialized_(false) {}
+    : initialized_(false), thread_pool_size_(0) {}
 
 
 DefaultPlatform::~DefaultPlatform() {
@@ -58,24 +58,24 @@ DefaultPlatform::~DefaultPlatform() {
 void DefaultPlatform::SetThreadPoolSize(int thread_pool_size) {
   LockGuard<Mutex> guard(&lock_);
   ASSERT(thread_pool_size >= 0);
-  if (initialized_) return;
-  initialized_ = true;
   if (thread_pool_size < 1)
     thread_pool_size = CPU::NumberOfProcessorsOnline();
-  thread_pool_size = Max(Min(thread_pool_size, kMaxThreadPoolSize), 1);
+  thread_pool_size_ = Max(Min(thread_pool_size, kMaxThreadPoolSize), 1);
+}
 
-  for (int i = 0; i < thread_pool_size; ++i)
+
+void DefaultPlatform::EnsureInitialized() {
+  LockGuard<Mutex> guard(&lock_);
+  if (initialized_) return;
+  initialized_ = true;
+
+  for (int i = 0; i < thread_pool_size_; ++i)
     thread_pool_.push_back(new WorkerThread(&queue_));
 }
 
 void DefaultPlatform::CallOnBackgroundThread(Task *task,
                                              ExpectedRuntime expected_runtime) {
-#ifdef DEBUG
-  {
-    LockGuard<Mutex> guard(&lock_);
-    ASSERT(initialized_);
-  }
-#endif
+  EnsureInitialized();
   queue_.Append(task);
 }
 
index 72e8869..877b3a6 100644 (file)
@@ -59,8 +59,11 @@ class DefaultPlatform : public Platform {
  private:
   static const int kMaxThreadPoolSize = 4;
 
+  void EnsureInitialized();
+
   Mutex lock_;
   bool initialized_;
+  int thread_pool_size_;
   std::vector<WorkerThread*> thread_pool_;
   TaskQueue queue_;