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

Unified Diff: chrome/browser/chromeos/drive/change_list_loader.cc

Issue 132903008: drive: Implement lock mechanism to 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 d317b948c0a8ed13335f98fcf7125d5ac63ba4e1..fe24054280721e7b23dfa3da0f28973974f66849 100644
--- a/chrome/browser/chromeos/drive/change_list_loader.cc
+++ b/chrome/browser/chromeos/drive/change_list_loader.cc
@@ -308,6 +308,7 @@ ChangeListLoader::ChangeListLoader(
resource_metadata_(resource_metadata),
scheduler_(scheduler),
drive_service_(drive_service),
+ lock_count_(0),
loaded_(false),
weak_ptr_factory_(this) {
}
@@ -406,6 +407,14 @@ 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,
@@ -754,7 +763,9 @@ void ChangeListLoader::LoadChangeListFromServerAfterLoadChangeList(
util::Log(logging::LOG_INFO,
"Apply change lists (is delta: %d)",
is_delta_update);
- base::PostTaskAndReplyWithResult(
+ ApplyChange(base::Bind(
+ base::IgnoreResult(
+ &base::PostTaskAndReplyWithResult<FileError, FileError>),
blocking_task_runner_,
FROM_HERE,
base::Bind(&ChangeListProcessor::Apply,
@@ -766,7 +777,7 @@ void ChangeListLoader::LoadChangeListFromServerAfterLoadChangeList(
weak_ptr_factory_.GetWeakPtr(),
base::Owned(change_list_processor),
should_notify_changed_directories,
- base::Time::Now()));
+ base::Time::Now())));
}
void ChangeListLoader::LoadChangeListFromServerAfterUpdate(
@@ -862,7 +873,9 @@ void ChangeListLoader::LoadDirectoryFromServerAfterLoad(
}
base::FilePath* directory_path = new base::FilePath;
- base::PostTaskAndReplyWithResult(
+ ApplyChange(base::Bind(
+ base::IgnoreResult(
+ &base::PostTaskAndReplyWithResult<FileError, FileError>),
blocking_task_runner_,
FROM_HERE,
base::Bind(&ChangeListProcessor::RefreshDirectory,
@@ -874,7 +887,7 @@ void ChangeListLoader::LoadDirectoryFromServerAfterLoad(
weak_ptr_factory_.GetWeakPtr(),
directory_fetch_info,
callback,
- base::Owned(directory_path)));
+ base::Owned(directory_path))));
}
void ChangeListLoader::LoadDirectoryFromServerAfterRefresh(
@@ -894,6 +907,29 @@ 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