Index: services/catalog/reader.cc |
diff --git a/services/catalog/reader.cc b/services/catalog/reader.cc |
index 954809fef7ed358807f222f29504cc63532c690e..fcce66e584c269766ef1ca33c8e1ba24dba5dabd 100644 |
--- a/services/catalog/reader.cc |
+++ b/services/catalog/reader.cc |
@@ -140,13 +140,23 @@ void DoNothing(shell::mojom::ResolveResultPtr) {} |
} // namespace |
-Reader::Reader(base::TaskRunner* file_task_runner, |
+// A sequenced task runner is used to guarantee requests are serviced in the |
+// order requested. To do otherwise means we may run callbacks in an |
+// unpredictable order, leading to flake. |
+Reader::Reader(base::SequencedWorkerPool* worker_pool, |
ManifestProvider* manifest_provider) |
- : file_task_runner_(file_task_runner), |
- manifest_provider_(manifest_provider), |
- weak_factory_(this) { |
- PathService::Get(base::DIR_MODULE, &system_package_dir_); |
+ : Reader(manifest_provider) { |
+ file_task_runner_ = worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( |
+ base::SequencedWorkerPool::GetSequenceToken(), |
+ base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); |
+} |
+ |
+Reader::Reader(base::SingleThreadTaskRunner* task_runner, |
+ ManifestProvider* manifest_provider) |
+ : Reader(manifest_provider) { |
+ file_task_runner_ = task_runner; |
} |
+ |
Reader::~Reader() {} |
void Reader::Read(const base::FilePath& package_dir, |
@@ -172,20 +182,25 @@ void Reader::CreateEntryForName( |
std::unique_ptr<base::Value> manifest_root = |
base::JSONReader::Read(manifest_contents); |
base::PostTaskAndReplyWithResult( |
- file_task_runner_, FROM_HERE, |
+ file_task_runner_.get(), FROM_HERE, |
base::Bind(&ProcessManifest, base::Passed(&manifest_root), |
system_package_dir_), |
- base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), |
- cache, entry_created_callback)); |
+ base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), cache, |
+ entry_created_callback)); |
} else { |
base::PostTaskAndReplyWithResult( |
- file_task_runner_, FROM_HERE, |
+ file_task_runner_.get(), FROM_HERE, |
base::Bind(&ReadManifest, system_package_dir_, mojo_name), |
- base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), |
- cache, entry_created_callback)); |
+ base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), cache, |
+ entry_created_callback)); |
} |
} |
+Reader::Reader(ManifestProvider* manifest_provider) |
+ : manifest_provider_(manifest_provider), weak_factory_(this) { |
+ PathService::Get(base::DIR_MODULE, &system_package_dir_); |
+} |
+ |
void Reader::OnReadManifest( |
EntryCache* cache, |
const CreateEntryForNameCallback& entry_created_callback, |