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

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

Issue 150113002: drive: Also lock SearchOperation when locking ChangeListLoader (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 util::GetDriveMyDriveRootPath(), &entry); 292 util::GetDriveMyDriveRootPath(), &entry);
293 if (error != FILE_ERROR_OK || !entry.resource_id().empty()) 293 if (error != FILE_ERROR_OK || !entry.resource_id().empty())
294 return error; 294 return error;
295 295
296 entry.set_resource_id(about_resource.root_folder_id()); 296 entry.set_resource_id(about_resource.root_folder_id());
297 return resource_metadata->RefreshEntry(entry); 297 return resource_metadata->RefreshEntry(entry);
298 } 298 }
299 299
300 } // namespace 300 } // namespace
301 301
302 LoaderController::LoaderController()
303 : lock_count_(0),
304 weak_ptr_factory_(this) {
305 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
306 }
307
308 LoaderController::~LoaderController() {
309 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
310 }
311
312 scoped_ptr<base::ScopedClosureRunner> LoaderController::GetLock() {
313 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
314
315 ++lock_count_;
316 return make_scoped_ptr(new base::ScopedClosureRunner(
317 base::Bind(&LoaderController::Unlock,
318 weak_ptr_factory_.GetWeakPtr())));
319 }
320
321 void LoaderController::ScheduleRun(const base::Closure& task) {
322 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
323 DCHECK(!task.is_null());
324
325 if (lock_count_ > 0) {
326 pending_tasks_.push_back(task);
327 } else {
328 task.Run();
329 }
330 }
331
332 void LoaderController::Unlock() {
333 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
334 DCHECK_LT(0, lock_count_);
335
336 if (--lock_count_ > 0)
337 return;
338
339 std::vector<base::Closure> tasks;
340 tasks.swap(pending_tasks_);
341 for (size_t i = 0; i < tasks.size(); ++i)
342 tasks[i].Run();
343 }
344
302 ChangeListLoader::ChangeListLoader( 345 ChangeListLoader::ChangeListLoader(
303 base::SequencedTaskRunner* blocking_task_runner, 346 base::SequencedTaskRunner* blocking_task_runner,
304 ResourceMetadata* resource_metadata, 347 ResourceMetadata* resource_metadata,
305 JobScheduler* scheduler, 348 JobScheduler* scheduler,
306 DriveServiceInterface* drive_service) 349 DriveServiceInterface* drive_service,
350 LoaderController* loader_controller)
307 : blocking_task_runner_(blocking_task_runner), 351 : blocking_task_runner_(blocking_task_runner),
308 resource_metadata_(resource_metadata), 352 resource_metadata_(resource_metadata),
309 scheduler_(scheduler), 353 scheduler_(scheduler),
310 drive_service_(drive_service), 354 drive_service_(drive_service),
311 lock_count_(0), 355 loader_controller_(loader_controller),
312 loaded_(false), 356 loaded_(false),
313 weak_ptr_factory_(this) { 357 weak_ptr_factory_(this) {
314 } 358 }
315 359
316 ChangeListLoader::~ChangeListLoader() { 360 ChangeListLoader::~ChangeListLoader() {
317 STLDeleteElements(&fast_fetch_feed_fetcher_set_); 361 STLDeleteElements(&fast_fetch_feed_fetcher_set_);
318 } 362 }
319 363
320 bool ChangeListLoader::IsRefreshing() const { 364 bool ChangeListLoader::IsRefreshing() const {
321 // Callback for change list loading is stored in pending_load_callback_[""]. 365 // Callback for change list loading is stored in pending_load_callback_[""].
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 base::Bind( 444 base::Bind(
401 callback, 445 callback,
402 google_apis::HTTP_NO_CONTENT, 446 google_apis::HTTP_NO_CONTENT,
403 base::Passed(scoped_ptr<google_apis::AboutResource>( 447 base::Passed(scoped_ptr<google_apis::AboutResource>(
404 new google_apis::AboutResource(*cached_about_resource_))))); 448 new google_apis::AboutResource(*cached_about_resource_)))));
405 } else { 449 } else {
406 UpdateAboutResource(callback); 450 UpdateAboutResource(callback);
407 } 451 }
408 } 452 }
409 453
410 scoped_ptr<base::ScopedClosureRunner> ChangeListLoader::GetLock() {
411 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
412 ++lock_count_;
413 return make_scoped_ptr(new base::ScopedClosureRunner(
414 base::Bind(&ChangeListLoader::Unlock,
415 weak_ptr_factory_.GetWeakPtr())));
416 }
417
418 void ChangeListLoader::LoadDirectoryIfNeededAfterGetEntry( 454 void ChangeListLoader::LoadDirectoryIfNeededAfterGetEntry(
419 const base::FilePath& directory_path, 455 const base::FilePath& directory_path,
420 const FileOperationCallback& callback, 456 const FileOperationCallback& callback,
421 bool should_try_loading_parent, 457 bool should_try_loading_parent,
422 const ResourceEntry* entry, 458 const ResourceEntry* entry,
423 FileError error) { 459 FileError error) {
424 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 460 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
425 DCHECK(!callback.is_null()); 461 DCHECK(!callback.is_null());
426 462
427 // Should load grand root first if My Drive's resource ID is not set. 463 // Should load grand root first if My Drive's resource ID is not set.
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 792
757 ChangeListProcessor* change_list_processor = 793 ChangeListProcessor* change_list_processor =
758 new ChangeListProcessor(resource_metadata_); 794 new ChangeListProcessor(resource_metadata_);
759 // Don't send directory content change notification while performing 795 // Don't send directory content change notification while performing
760 // the initial content retrieval. 796 // the initial content retrieval.
761 const bool should_notify_changed_directories = is_delta_update; 797 const bool should_notify_changed_directories = is_delta_update;
762 798
763 util::Log(logging::LOG_INFO, 799 util::Log(logging::LOG_INFO,
764 "Apply change lists (is delta: %d)", 800 "Apply change lists (is delta: %d)",
765 is_delta_update); 801 is_delta_update);
766 ApplyChange(base::Bind( 802 loader_controller_->ScheduleRun(base::Bind(
767 base::IgnoreResult( 803 base::IgnoreResult(
768 &base::PostTaskAndReplyWithResult<FileError, FileError>), 804 &base::PostTaskAndReplyWithResult<FileError, FileError>),
769 blocking_task_runner_, 805 blocking_task_runner_,
770 FROM_HERE, 806 FROM_HERE,
771 base::Bind(&ChangeListProcessor::Apply, 807 base::Bind(&ChangeListProcessor::Apply,
772 base::Unretained(change_list_processor), 808 base::Unretained(change_list_processor),
773 base::Passed(&about_resource), 809 base::Passed(&about_resource),
774 base::Passed(&change_lists), 810 base::Passed(&change_lists),
775 is_delta_update), 811 is_delta_update),
776 base::Bind(&ChangeListLoader::LoadChangeListFromServerAfterUpdate, 812 base::Bind(&ChangeListLoader::LoadChangeListFromServerAfterUpdate,
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 902
867 if (error != FILE_ERROR_OK) { 903 if (error != FILE_ERROR_OK) {
868 LOG(ERROR) << "Failed to load directory: " 904 LOG(ERROR) << "Failed to load directory: "
869 << directory_fetch_info.local_id() 905 << directory_fetch_info.local_id()
870 << ": " << FileErrorToString(error); 906 << ": " << FileErrorToString(error);
871 callback.Run(error); 907 callback.Run(error);
872 return; 908 return;
873 } 909 }
874 910
875 base::FilePath* directory_path = new base::FilePath; 911 base::FilePath* directory_path = new base::FilePath;
876 ApplyChange(base::Bind( 912 loader_controller_->ScheduleRun(base::Bind(
877 base::IgnoreResult( 913 base::IgnoreResult(
878 &base::PostTaskAndReplyWithResult<FileError, FileError>), 914 &base::PostTaskAndReplyWithResult<FileError, FileError>),
879 blocking_task_runner_, 915 blocking_task_runner_,
880 FROM_HERE, 916 FROM_HERE,
881 base::Bind(&ChangeListProcessor::RefreshDirectory, 917 base::Bind(&ChangeListProcessor::RefreshDirectory,
882 resource_metadata_, 918 resource_metadata_,
883 directory_fetch_info, 919 directory_fetch_info,
884 base::Passed(&change_lists), 920 base::Passed(&change_lists),
885 directory_path), 921 directory_path),
886 base::Bind(&ChangeListLoader::LoadDirectoryFromServerAfterRefresh, 922 base::Bind(&ChangeListLoader::LoadDirectoryFromServerAfterRefresh,
(...skipping 13 matching lines...) Expand all
900 936
901 DVLOG(1) << "Directory loaded: " << directory_fetch_info.ToString(); 937 DVLOG(1) << "Directory loaded: " << directory_fetch_info.ToString();
902 callback.Run(error); 938 callback.Run(error);
903 // Also notify the observers. 939 // Also notify the observers.
904 if (error == FILE_ERROR_OK && !directory_path->empty()) { 940 if (error == FILE_ERROR_OK && !directory_path->empty()) {
905 FOR_EACH_OBSERVER(ChangeListLoaderObserver, observers_, 941 FOR_EACH_OBSERVER(ChangeListLoaderObserver, observers_,
906 OnDirectoryChanged(*directory_path)); 942 OnDirectoryChanged(*directory_path));
907 } 943 }
908 } 944 }
909 945
910 void ChangeListLoader::ApplyChange(const base::Closure& closure) {
911 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
912 DCHECK(!closure.is_null());
913 if (lock_count_ > 0) {
914 pending_apply_closures_.push_back(closure);
915 } else {
916 closure.Run();
917 }
918 }
919
920 void ChangeListLoader::Unlock() {
921 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
922 DCHECK_LT(0, lock_count_);
923
924 if (--lock_count_ > 0)
925 return;
926
927 std::vector<base::Closure> callbacks;
928 callbacks.swap(pending_apply_closures_);
929 for (size_t i = 0; i < callbacks.size(); ++i)
930 callbacks[i].Run();
931 }
932
933 void ChangeListLoader::UpdateAboutResource( 946 void ChangeListLoader::UpdateAboutResource(
934 const google_apis::AboutResourceCallback& callback) { 947 const google_apis::AboutResourceCallback& callback) {
935 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 948 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
936 DCHECK(!callback.is_null()); 949 DCHECK(!callback.is_null());
937 950
938 scheduler_->GetAboutResource( 951 scheduler_->GetAboutResource(
939 base::Bind(&ChangeListLoader::UpdateAboutResourceAfterGetAbout, 952 base::Bind(&ChangeListLoader::UpdateAboutResourceAfterGetAbout,
940 weak_ptr_factory_.GetWeakPtr(), 953 weak_ptr_factory_.GetWeakPtr(),
941 callback)); 954 callback));
942 } 955 }
(...skipping 17 matching lines...) Expand all
960 973
961 cached_about_resource_.reset( 974 cached_about_resource_.reset(
962 new google_apis::AboutResource(*about_resource)); 975 new google_apis::AboutResource(*about_resource));
963 } 976 }
964 977
965 callback.Run(status, about_resource.Pass()); 978 callback.Run(status, about_resource.Pass());
966 } 979 }
967 980
968 } // namespace internal 981 } // namespace internal
969 } // namespace drive 982 } // 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