Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Side by Side Diff: services/catalog/reader.cc

Issue 1921183003: Fixes race in Shell (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: merge 2 trunk Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « services/catalog/reader.h ('k') | services/shell/shell.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "services/catalog/reader.h" 5 #include "services/catalog/reader.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/files/file_enumerator.h" 8 #include "base/files/file_enumerator.h"
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/json/json_file_value_serializer.h" 10 #include "base/json/json_file_value_serializer.h"
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 void AddEntryToCache(EntryCache* cache, std::unique_ptr<Entry> entry) { 133 void AddEntryToCache(EntryCache* cache, std::unique_ptr<Entry> entry) {
134 for (auto child : entry->applications()) 134 for (auto child : entry->applications())
135 AddEntryToCache(cache, base::WrapUnique(child)); 135 AddEntryToCache(cache, base::WrapUnique(child));
136 (*cache)[entry->name()] = std::move(entry); 136 (*cache)[entry->name()] = std::move(entry);
137 } 137 }
138 138
139 void DoNothing(shell::mojom::ResolveResultPtr) {} 139 void DoNothing(shell::mojom::ResolveResultPtr) {}
140 140
141 } // namespace 141 } // namespace
142 142
143 Reader::Reader(base::TaskRunner* file_task_runner, 143 // A sequenced task runner is used to guarantee requests are serviced in the
144 // order requested. To do otherwise means we may run callbacks in an
145 // unpredictable order, leading to flake.
146 Reader::Reader(base::SequencedWorkerPool* worker_pool,
144 ManifestProvider* manifest_provider) 147 ManifestProvider* manifest_provider)
145 : file_task_runner_(file_task_runner), 148 : Reader(manifest_provider) {
146 manifest_provider_(manifest_provider), 149 file_task_runner_ = worker_pool->GetSequencedTaskRunnerWithShutdownBehavior(
147 weak_factory_(this) { 150 base::SequencedWorkerPool::GetSequenceToken(),
148 PathService::Get(base::DIR_MODULE, &system_package_dir_); 151 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
149 } 152 }
153
154 Reader::Reader(base::SingleThreadTaskRunner* task_runner,
155 ManifestProvider* manifest_provider)
156 : Reader(manifest_provider) {
157 file_task_runner_ = task_runner;
158 }
159
150 Reader::~Reader() {} 160 Reader::~Reader() {}
151 161
152 void Reader::Read(const base::FilePath& package_dir, 162 void Reader::Read(const base::FilePath& package_dir,
153 EntryCache* cache, 163 EntryCache* cache,
154 const base::Closure& read_complete_closure) { 164 const base::Closure& read_complete_closure) {
155 file_task_runner_->PostTask( 165 file_task_runner_->PostTask(
156 FROM_HERE, 166 FROM_HERE,
157 base::Bind(&ScanDir, package_dir, 167 base::Bind(&ScanDir, package_dir,
158 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), 168 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(),
159 cache, base::Bind(&DoNothing)), 169 cache, base::Bind(&DoNothing)),
160 base::ThreadTaskRunnerHandle::Get(), 170 base::ThreadTaskRunnerHandle::Get(),
161 read_complete_closure)); 171 read_complete_closure));
162 } 172 }
163 173
164 void Reader::CreateEntryForName( 174 void Reader::CreateEntryForName(
165 const std::string& mojo_name, 175 const std::string& mojo_name,
166 EntryCache* cache, 176 EntryCache* cache,
167 const CreateEntryForNameCallback& entry_created_callback) { 177 const CreateEntryForNameCallback& entry_created_callback) {
168 std::string manifest_contents; 178 std::string manifest_contents;
169 if (manifest_provider_ && 179 if (manifest_provider_ &&
170 manifest_provider_->GetApplicationManifest(mojo_name, 180 manifest_provider_->GetApplicationManifest(mojo_name,
171 &manifest_contents)) { 181 &manifest_contents)) {
172 std::unique_ptr<base::Value> manifest_root = 182 std::unique_ptr<base::Value> manifest_root =
173 base::JSONReader::Read(manifest_contents); 183 base::JSONReader::Read(manifest_contents);
174 base::PostTaskAndReplyWithResult( 184 base::PostTaskAndReplyWithResult(
175 file_task_runner_, FROM_HERE, 185 file_task_runner_.get(), FROM_HERE,
176 base::Bind(&ProcessManifest, base::Passed(&manifest_root), 186 base::Bind(&ProcessManifest, base::Passed(&manifest_root),
177 system_package_dir_), 187 system_package_dir_),
178 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), 188 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), cache,
179 cache, entry_created_callback)); 189 entry_created_callback));
180 } else { 190 } else {
181 base::PostTaskAndReplyWithResult( 191 base::PostTaskAndReplyWithResult(
182 file_task_runner_, FROM_HERE, 192 file_task_runner_.get(), FROM_HERE,
183 base::Bind(&ReadManifest, system_package_dir_, mojo_name), 193 base::Bind(&ReadManifest, system_package_dir_, mojo_name),
184 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), 194 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), cache,
185 cache, entry_created_callback)); 195 entry_created_callback));
186 } 196 }
187 } 197 }
188 198
199 Reader::Reader(ManifestProvider* manifest_provider)
200 : manifest_provider_(manifest_provider), weak_factory_(this) {
201 PathService::Get(base::DIR_MODULE, &system_package_dir_);
202 }
203
189 void Reader::OnReadManifest( 204 void Reader::OnReadManifest(
190 EntryCache* cache, 205 EntryCache* cache,
191 const CreateEntryForNameCallback& entry_created_callback, 206 const CreateEntryForNameCallback& entry_created_callback,
192 std::unique_ptr<Entry> entry) { 207 std::unique_ptr<Entry> entry) {
193 shell::mojom::ResolveResultPtr result = 208 shell::mojom::ResolveResultPtr result =
194 shell::mojom::ResolveResult::From(*entry); 209 shell::mojom::ResolveResult::From(*entry);
195 AddEntryToCache(cache, std::move(entry)); 210 AddEntryToCache(cache, std::move(entry));
196 entry_created_callback.Run(std::move(result)); 211 entry_created_callback.Run(std::move(result));
197 } 212 }
198 213
199 } // namespace catalog 214 } // namespace catalog
OLDNEW
« no previous file with comments | « services/catalog/reader.h ('k') | services/shell/shell.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698