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

Side by Side Diff: chrome/browser/chromeos/drive/change_list_loader.cc

Issue 439643003: Change AboutResourceLoader::GetAboutResource to wait for inflight update task. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/chromeos/drive/change_list_loader.h" 5 #include "chrome/browser/chromeos/drive/change_list_loader.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 return; 202 return;
203 203
204 std::vector<base::Closure> tasks; 204 std::vector<base::Closure> tasks;
205 tasks.swap(pending_tasks_); 205 tasks.swap(pending_tasks_);
206 for (size_t i = 0; i < tasks.size(); ++i) 206 for (size_t i = 0; i < tasks.size(); ++i)
207 tasks[i].Run(); 207 tasks[i].Run();
208 } 208 }
209 209
210 AboutResourceLoader::AboutResourceLoader(JobScheduler* scheduler) 210 AboutResourceLoader::AboutResourceLoader(JobScheduler* scheduler)
211 : scheduler_(scheduler), 211 : scheduler_(scheduler),
212 current_update_task_id_(-1),
212 weak_ptr_factory_(this) { 213 weak_ptr_factory_(this) {
213 } 214 }
214 215
215 AboutResourceLoader::~AboutResourceLoader() {} 216 AboutResourceLoader::~AboutResourceLoader() {}
216 217
217 void AboutResourceLoader::GetAboutResource( 218 void AboutResourceLoader::GetAboutResource(
218 const google_apis::AboutResourceCallback& callback) { 219 const google_apis::AboutResourceCallback& callback) {
219 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 220 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
220 DCHECK(!callback.is_null()); 221 DCHECK(!callback.is_null());
221 222
223 // If the latest UpdateAboutResource task is still running. Wait for it,
224 if (pending_callbacks_.count(current_update_task_id_)) {
225 pending_callbacks_[current_update_task_id_].push_back(callback);
226 return;
227 }
228
222 if (cached_about_resource_) { 229 if (cached_about_resource_) {
223 base::MessageLoopProxy::current()->PostTask( 230 base::MessageLoopProxy::current()->PostTask(
224 FROM_HERE, 231 FROM_HERE,
225 base::Bind( 232 base::Bind(
226 callback, 233 callback,
227 google_apis::HTTP_NO_CONTENT, 234 google_apis::HTTP_NO_CONTENT,
228 base::Passed(scoped_ptr<google_apis::AboutResource>( 235 base::Passed(scoped_ptr<google_apis::AboutResource>(
229 new google_apis::AboutResource(*cached_about_resource_))))); 236 new google_apis::AboutResource(*cached_about_resource_)))));
230 } else { 237 } else {
231 UpdateAboutResource(callback); 238 UpdateAboutResource(callback);
232 } 239 }
233 } 240 }
234 241
235 void AboutResourceLoader::UpdateAboutResource( 242 void AboutResourceLoader::UpdateAboutResource(
236 const google_apis::AboutResourceCallback& callback) { 243 const google_apis::AboutResourceCallback& callback) {
237 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 244 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
238 DCHECK(!callback.is_null()); 245 DCHECK(!callback.is_null());
239 246
247 ++current_update_task_id_;
248 pending_callbacks_[current_update_task_id_].push_back(callback);
249
240 scheduler_->GetAboutResource( 250 scheduler_->GetAboutResource(
241 base::Bind(&AboutResourceLoader::UpdateAboutResourceAfterGetAbout, 251 base::Bind(&AboutResourceLoader::UpdateAboutResourceAfterGetAbout,
242 weak_ptr_factory_.GetWeakPtr(), 252 weak_ptr_factory_.GetWeakPtr(),
243 callback)); 253 current_update_task_id_));
244 } 254 }
245 255
246 void AboutResourceLoader::UpdateAboutResourceAfterGetAbout( 256 void AboutResourceLoader::UpdateAboutResourceAfterGetAbout(
247 const google_apis::AboutResourceCallback& callback, 257 int task_id,
248 google_apis::GDataErrorCode status, 258 google_apis::GDataErrorCode status,
249 scoped_ptr<google_apis::AboutResource> about_resource) { 259 scoped_ptr<google_apis::AboutResource> about_resource) {
250 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 260 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
251 DCHECK(!callback.is_null());
252 FileError error = GDataToFileError(status); 261 FileError error = GDataToFileError(status);
253 262
254 if (error == FILE_ERROR_OK) { 263 const std::vector<google_apis::AboutResourceCallback> callbacks =
255 if (cached_about_resource_ && 264 pending_callbacks_[task_id];
256 cached_about_resource_->largest_change_id() > 265 pending_callbacks_.erase(task_id);
257 about_resource->largest_change_id()) {
258 LOG(WARNING) << "Local cached about resource is fresher than server, "
259 << "local = " << cached_about_resource_->largest_change_id()
260 << ", server = " << about_resource->largest_change_id();
261 }
262 266
263 cached_about_resource_.reset( 267 if (error != FILE_ERROR_OK) {
264 new google_apis::AboutResource(*about_resource)); 268 for (size_t i = 0; i < callbacks.size(); ++i)
269 callbacks[i].Run(status, scoped_ptr<google_apis::AboutResource>());
270 return;
265 } 271 }
266 272
267 callback.Run(status, about_resource.Pass()); 273 // Updates the cache when the resource is successfully obtained.
274 if (cached_about_resource_ &&
275 cached_about_resource_->largest_change_id() >
276 about_resource->largest_change_id()) {
277 LOG(WARNING) << "Local cached about resource is fresher than server, "
278 << "local = " << cached_about_resource_->largest_change_id()
279 << ", server = " << about_resource->largest_change_id();
280 }
281 cached_about_resource_.reset(new google_apis::AboutResource(*about_resource));
282
283 for (size_t i = 0; i < callbacks.size(); ++i) {
284 callbacks[i].Run(
285 status,
286 make_scoped_ptr(new google_apis::AboutResource(*about_resource)));
287 }
268 } 288 }
269 289
270 ChangeListLoader::ChangeListLoader( 290 ChangeListLoader::ChangeListLoader(
271 EventLogger* logger, 291 EventLogger* logger,
272 base::SequencedTaskRunner* blocking_task_runner, 292 base::SequencedTaskRunner* blocking_task_runner,
273 ResourceMetadata* resource_metadata, 293 ResourceMetadata* resource_metadata,
274 JobScheduler* scheduler, 294 JobScheduler* scheduler,
275 AboutResourceLoader* about_resource_loader, 295 AboutResourceLoader* about_resource_loader,
276 LoaderController* loader_controller) 296 LoaderController* loader_controller)
277 : logger_(logger), 297 : logger_(logger),
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 550
531 OnChangeListLoadComplete(error); 551 OnChangeListLoadComplete(error);
532 552
533 FOR_EACH_OBSERVER(ChangeListLoaderObserver, 553 FOR_EACH_OBSERVER(ChangeListLoaderObserver,
534 observers_, 554 observers_,
535 OnLoadFromServerComplete()); 555 OnLoadFromServerComplete());
536 } 556 }
537 557
538 } // namespace internal 558 } // namespace internal
539 } // namespace drive 559 } // namespace drive
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/drive/change_list_loader.h ('k') | chrome/browser/chromeos/drive/change_list_loader_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698