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

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

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
« no previous file with comments | « no previous file | chrome/browser/chromeos/drive/change_list_loader.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/chromeos/drive/change_list_loader.h
diff --git a/chrome/browser/chromeos/drive/change_list_loader.h b/chrome/browser/chromeos/drive/change_list_loader.h
index df8ac2561e1e9ca8ff711bda9e21e45a9f94b29a..8a15d33e917b5b25d5bfb76353c7844cb8d4b741 100644
--- a/chrome/browser/chromeos/drive/change_list_loader.h
+++ b/chrome/browser/chromeos/drive/change_list_loader.h
@@ -46,6 +46,35 @@ class ChangeListProcessor;
class DirectoryFetchInfo;
class ResourceMetadata;
+// Delays execution of tasks as long as more than one lock is alive.
+// Used to ensure that ChangeListLoader does not cause race condition by adding
+// new entries created by sync tasks before they do.
+// All code which may add entries found on the server to the local metadata
+// should use this class.
+class LoaderController {
+ public:
+ LoaderController();
+ ~LoaderController();
+
+ // Increments the lock count and returns an object which decrements the count
+ // on its destruction.
+ // While the lock count is positive, tasks will be pending.
+ scoped_ptr<base::ScopedClosureRunner> GetLock();
+
+ // Runs the task if the lock count is 0, otherwise it will be pending.
+ void ScheduleRun(const base::Closure& task);
+
+ private:
+ // Decrements the lock count.
+ void Unlock();
+
+ int lock_count_;
+ std::vector<base::Closure> pending_tasks_;
+
+ base::WeakPtrFactory<LoaderController> weak_ptr_factory_;
+ DISALLOW_COPY_AND_ASSIGN(LoaderController);
+};
+
// ChangeListLoader is used to load the change list, the full resource list,
// and directory contents, from WAPI (codename for Documents List API)
// or Google Drive API. The class also updates the resource metadata with
@@ -64,7 +93,8 @@ class ChangeListLoader {
ChangeListLoader(base::SequencedTaskRunner* blocking_task_runner,
ResourceMetadata* resource_metadata,
JobScheduler* scheduler,
- DriveServiceInterface* drive_service);
+ DriveServiceInterface* drive_service,
+ LoaderController* apply_task_controller);
~ChangeListLoader();
// Indicates whether there is a request for full resource list or change
@@ -104,12 +134,6 @@ class ChangeListLoader {
// calls |UpdateAboutResource| passing |callback|.
void GetAboutResource(const google_apis::AboutResourceCallback& callback);
- // Increments the lock count and returns an object which decrements the count
- // on its destruction.
- // While the lock count is positive, ChangeListLoader does not add any entries
- // to the local metadata.
- scoped_ptr<base::ScopedClosureRunner> GetLock();
-
private:
// Part of LoadDirectoryIfNeeded().
void LoadDirectoryIfNeededAfterGetEntry(const base::FilePath& directory_path,
@@ -198,14 +222,6 @@ class ChangeListLoader {
const base::FilePath* directory_path,
FileError error);
- // ================= Implementation for lock mechanism ====================
- // Runs the closure if the lock count is 0, otherwise it will be pending.
- // All tasks which may add entries should be run via this method.
- void ApplyChange(const base::Closure& closure);
-
- // Decrements the lock count.
- void Unlock();
-
// ================= Implementation for other stuff =================
// Gets the about resource from the server, and caches it if successful. This
@@ -226,15 +242,13 @@ class ChangeListLoader {
ResourceMetadata* resource_metadata_; // Not owned.
JobScheduler* scheduler_; // Not owned.
DriveServiceInterface* drive_service_; // Not owned.
+ LoaderController* loader_controller_; // Not owned.
ObserverList<ChangeListLoaderObserver> observers_;
typedef std::map<std::string, std::vector<FileOperationCallback> >
LoadCallbackMap;
LoadCallbackMap pending_load_callback_;
FileOperationCallback pending_update_check_callback_;
- int lock_count_;
- std::vector<base::Closure> pending_apply_closures_;
-
// Running feed fetcher.
scoped_ptr<FeedFetcher> change_feed_fetcher_;
« no previous file with comments | « no previous file | chrome/browser/chromeos/drive/change_list_loader.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698