Index: net/disk_cache/simple/simple_backend_impl.cc |
diff --git a/net/disk_cache/simple/simple_backend_impl.cc b/net/disk_cache/simple/simple_backend_impl.cc |
index 6c43eeb9d6e0b439d577d1d0aff79b0dd39d5654..38086441ebda528f93034956d4e85eb94945cbd3 100644 |
--- a/net/disk_cache/simple/simple_backend_impl.cc |
+++ b/net/disk_cache/simple/simple_backend_impl.cc |
@@ -15,6 +15,7 @@ |
#include "base/bind.h" |
#include "base/callback.h" |
#include "base/files/file_util.h" |
+#include "base/lazy_instance.h" |
#include "base/location.h" |
#include "base/metrics/field_trial.h" |
#include "base/metrics/histogram.h" |
@@ -57,16 +58,27 @@ const char kThreadNamePrefix[] = "SimpleCache"; |
// Maximum fraction of the cache that one entry can consume. |
const int kMaxFileRatio = 8; |
-// A global sequenced worker pool to use for launching all tasks. |
-SequencedWorkerPool* g_sequenced_worker_pool = NULL; |
+class LeakySequencedWorkerPool { |
+ public: |
+ LeakySequencedWorkerPool() |
+ : sequenced_worker_pool_( |
+ new SequencedWorkerPool(kMaxWorkerThreads, kThreadNamePrefix)) {} |
+ |
+ void FlushForTesting() { sequenced_worker_pool_->FlushForTesting(); } |
-void MaybeCreateSequencedWorkerPool() { |
- if (!g_sequenced_worker_pool) { |
- g_sequenced_worker_pool = |
- new SequencedWorkerPool(kMaxWorkerThreads, kThreadNamePrefix); |
- g_sequenced_worker_pool->AddRef(); // Leak it. |
+ scoped_refptr<base::TaskRunner> GetTaskRunner() { |
+ return sequenced_worker_pool_->GetTaskRunnerWithShutdownBehavior( |
+ SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); |
} |
-} |
+ |
+ private: |
+ scoped_refptr<SequencedWorkerPool> sequenced_worker_pool_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(LeakySequencedWorkerPool); |
+}; |
+ |
+base::LazyInstance<LeakySequencedWorkerPool>::Leaky g_sequenced_worker_pool = |
+ LAZY_INSTANCE_INITIALIZER; |
bool g_fd_limit_histogram_has_been_populated = false; |
@@ -236,10 +248,7 @@ SimpleBackendImpl::~SimpleBackendImpl() { |
} |
int SimpleBackendImpl::Init(const CompletionCallback& completion_callback) { |
- MaybeCreateSequencedWorkerPool(); |
- |
- worker_pool_ = g_sequenced_worker_pool->GetTaskRunnerWithShutdownBehavior( |
- SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); |
+ worker_pool_ = g_sequenced_worker_pool.Get().GetTaskRunner(); |
index_.reset(new SimpleIndex( |
base::ThreadTaskRunnerHandle::Get(), |
@@ -724,9 +733,9 @@ void SimpleBackendImpl::DoomEntriesComplete( |
callback.Run(result); |
} |
+// static |
void SimpleBackendImpl::FlushWorkerPoolForTesting() { |
- if (g_sequenced_worker_pool) |
- g_sequenced_worker_pool->FlushForTesting(); |
+ g_sequenced_worker_pool.Get().FlushForTesting(); |
} |
} // namespace disk_cache |