1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/download/public/common/download_task_runner.h"
#include "base/lazy_instance.h"
#include "base/no_destructor.h"
#include "base/synchronization/lock.h"
#include "base/task/lazy_thread_pool_task_runner.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "build/build_config.h"
namespace download {
namespace {
#if BUILDFLAG(IS_WIN)
// On Windows, the download code dips into COM and the shell here and there,
// necessitating the use of a COM single-threaded apartment sequence.
base::LazyThreadPoolCOMSTATaskRunner g_download_task_runner =
LAZY_COM_STA_TASK_RUNNER_INITIALIZER(
base::TaskTraits(base::MayBlock(), base::TaskPriority::USER_VISIBLE),
base::SingleThreadTaskRunnerThreadMode::SHARED);
#else
base::LazyThreadPoolSequencedTaskRunner g_download_task_runner =
LAZY_THREAD_POOL_SEQUENCED_TASK_RUNNER_INITIALIZER(
base::TaskTraits(base::MayBlock(), base::TaskPriority::USER_VISIBLE));
#endif
base::LazyInstance<scoped_refptr<base::SingleThreadTaskRunner>>::
DestructorAtExit g_io_task_runner = LAZY_INSTANCE_INITIALIZER;
base::LazyInstance<scoped_refptr<base::SequencedTaskRunner>>::DestructorAtExit
g_db_task_runner = LAZY_INSTANCE_INITIALIZER;
// Lock to protect |g_io_task_runner|
base::Lock& GetIOTaskRunnerLock() {
static base::NoDestructor<base::Lock> instance;
return *instance;
}
} // namespace
scoped_refptr<base::SequencedTaskRunner> GetDownloadTaskRunner() {
return g_download_task_runner.Get();
}
void SetIOTaskRunner(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
DCHECK(task_runner);
base::AutoLock auto_lock(GetIOTaskRunnerLock());
if (g_io_task_runner.Get())
return;
g_io_task_runner.Get() = task_runner;
}
scoped_refptr<base::SingleThreadTaskRunner> GetIOTaskRunner() {
base::AutoLock auto_lock(GetIOTaskRunnerLock());
return g_io_task_runner.Get();
}
void SetDownloadDBTaskRunnerForTesting(
const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
DCHECK(task_runner);
g_db_task_runner.Get() = task_runner;
}
scoped_refptr<base::SequencedTaskRunner> GetDownloadDBTaskRunnerForTesting() {
return g_db_task_runner.Get();
}
} // namespace download
|