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

Unified 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, 11 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/drive/change_list_loader.cc
diff --git a/chrome/browser/chromeos/drive/change_list_loader.cc b/chrome/browser/chromeos/drive/change_list_loader.cc
index fe24054280721e7b23dfa3da0f28973974f66849..fc22c5442cf72b8cf64a6af9d0c9bc6a4f9eaf04 100644
--- a/chrome/browser/chromeos/drive/change_list_loader.cc
+++ b/chrome/browser/chromeos/drive/change_list_loader.cc
@@ -299,16 +299,60 @@ FileError RefreshMyDriveIfNeeded(
} // namespace
+LoaderController::LoaderController()
+ : lock_count_(0),
+ weak_ptr_factory_(this) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+}
+
+LoaderController::~LoaderController() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+}
+
+scoped_ptr<base::ScopedClosureRunner> LoaderController::GetLock() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ ++lock_count_;
+ return make_scoped_ptr(new base::ScopedClosureRunner(
+ base::Bind(&LoaderController::Unlock,
+ weak_ptr_factory_.GetWeakPtr())));
+}
+
+void LoaderController::ScheduleRun(const base::Closure& task) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!task.is_null());
+
+ if (lock_count_ > 0) {
+ pending_tasks_.push_back(task);
+ } else {
+ task.Run();
+ }
+}
+
+void LoaderController::Unlock() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_LT(0, lock_count_);
+
+ if (--lock_count_ > 0)
+ return;
+
+ std::vector<base::Closure> tasks;
+ tasks.swap(pending_tasks_);
+ for (size_t i = 0; i < tasks.size(); ++i)
+ tasks[i].Run();
+}
+
ChangeListLoader::ChangeListLoader(
base::SequencedTaskRunner* blocking_task_runner,
ResourceMetadata* resource_metadata,
JobScheduler* scheduler,
- DriveServiceInterface* drive_service)
+ DriveServiceInterface* drive_service,
+ LoaderController* loader_controller)
: blocking_task_runner_(blocking_task_runner),
resource_metadata_(resource_metadata),
scheduler_(scheduler),
drive_service_(drive_service),
- lock_count_(0),
+ loader_controller_(loader_controller),
loaded_(false),
weak_ptr_factory_(this) {
}
@@ -407,14 +451,6 @@ void ChangeListLoader::GetAboutResource(
}
}
-scoped_ptr<base::ScopedClosureRunner> ChangeListLoader::GetLock() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- ++lock_count_;
- return make_scoped_ptr(new base::ScopedClosureRunner(
- base::Bind(&ChangeListLoader::Unlock,
- weak_ptr_factory_.GetWeakPtr())));
-}
-
void ChangeListLoader::LoadDirectoryIfNeededAfterGetEntry(
const base::FilePath& directory_path,
const FileOperationCallback& callback,
@@ -763,7 +799,7 @@ void ChangeListLoader::LoadChangeListFromServerAfterLoadChangeList(
util::Log(logging::LOG_INFO,
"Apply change lists (is delta: %d)",
is_delta_update);
- ApplyChange(base::Bind(
+ loader_controller_->ScheduleRun(base::Bind(
base::IgnoreResult(
&base::PostTaskAndReplyWithResult<FileError, FileError>),
blocking_task_runner_,
@@ -873,7 +909,7 @@ void ChangeListLoader::LoadDirectoryFromServerAfterLoad(
}
base::FilePath* directory_path = new base::FilePath;
- ApplyChange(base::Bind(
+ loader_controller_->ScheduleRun(base::Bind(
base::IgnoreResult(
&base::PostTaskAndReplyWithResult<FileError, FileError>),
blocking_task_runner_,
@@ -907,29 +943,6 @@ void ChangeListLoader::LoadDirectoryFromServerAfterRefresh(
}
}
-void ChangeListLoader::ApplyChange(const base::Closure& closure) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK(!closure.is_null());
- if (lock_count_ > 0) {
- pending_apply_closures_.push_back(closure);
- } else {
- closure.Run();
- }
-}
-
-void ChangeListLoader::Unlock() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK_LT(0, lock_count_);
-
- if (--lock_count_ > 0)
- return;
-
- std::vector<base::Closure> callbacks;
- callbacks.swap(pending_apply_closures_);
- for (size_t i = 0; i < callbacks.size(); ++i)
- callbacks[i].Run();
-}
-
void ChangeListLoader::UpdateAboutResource(
const google_apis::AboutResourceCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
« 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