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

Side by Side 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, 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
« no previous file with comments | « no previous file | chrome/browser/chromeos/drive/change_list_loader.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_CHANGE_LIST_LOADER_H_ 5 #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_CHANGE_LIST_LOADER_H_
6 #define CHROME_BROWSER_CHROMEOS_DRIVE_CHANGE_LIST_LOADER_H_ 6 #define CHROME_BROWSER_CHROMEOS_DRIVE_CHANGE_LIST_LOADER_H_
7 7
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 28 matching lines...) Expand all
39 class ResourceEntry; 39 class ResourceEntry;
40 40
41 namespace internal { 41 namespace internal {
42 42
43 class ChangeList; 43 class ChangeList;
44 class ChangeListLoaderObserver; 44 class ChangeListLoaderObserver;
45 class ChangeListProcessor; 45 class ChangeListProcessor;
46 class DirectoryFetchInfo; 46 class DirectoryFetchInfo;
47 class ResourceMetadata; 47 class ResourceMetadata;
48 48
49 // Delays execution of tasks as long as more than one lock is alive.
50 // Used to ensure that ChangeListLoader does not cause race condition by adding
51 // new entries created by sync tasks before they do.
52 // All code which may add entries found on the server to the local metadata
53 // should use this class.
54 class LoaderController {
55 public:
56 LoaderController();
57 ~LoaderController();
58
59 // Increments the lock count and returns an object which decrements the count
60 // on its destruction.
61 // While the lock count is positive, tasks will be pending.
62 scoped_ptr<base::ScopedClosureRunner> GetLock();
63
64 // Runs the task if the lock count is 0, otherwise it will be pending.
65 void ScheduleRun(const base::Closure& task);
66
67 private:
68 // Decrements the lock count.
69 void Unlock();
70
71 int lock_count_;
72 std::vector<base::Closure> pending_tasks_;
73
74 base::WeakPtrFactory<LoaderController> weak_ptr_factory_;
75 DISALLOW_COPY_AND_ASSIGN(LoaderController);
76 };
77
49 // ChangeListLoader is used to load the change list, the full resource list, 78 // ChangeListLoader is used to load the change list, the full resource list,
50 // and directory contents, from WAPI (codename for Documents List API) 79 // and directory contents, from WAPI (codename for Documents List API)
51 // or Google Drive API. The class also updates the resource metadata with 80 // or Google Drive API. The class also updates the resource metadata with
52 // the change list loaded from the server. 81 // the change list loaded from the server.
53 // 82 //
54 // Note that the difference between "resource list" and "change list" is 83 // Note that the difference between "resource list" and "change list" is
55 // subtle hence the two words are often used interchangeably. To be precise, 84 // subtle hence the two words are often used interchangeably. To be precise,
56 // "resource list" refers to metadata from the server when fetching the full 85 // "resource list" refers to metadata from the server when fetching the full
57 // resource metadata, or fetching directory contents, whereas "change list" 86 // resource metadata, or fetching directory contents, whereas "change list"
58 // refers to metadata from the server when fetching changes (delta). 87 // refers to metadata from the server when fetching changes (delta).
59 class ChangeListLoader { 88 class ChangeListLoader {
60 public: 89 public:
61 // Resource feed fetcher from the server. 90 // Resource feed fetcher from the server.
62 class FeedFetcher; 91 class FeedFetcher;
63 92
64 ChangeListLoader(base::SequencedTaskRunner* blocking_task_runner, 93 ChangeListLoader(base::SequencedTaskRunner* blocking_task_runner,
65 ResourceMetadata* resource_metadata, 94 ResourceMetadata* resource_metadata,
66 JobScheduler* scheduler, 95 JobScheduler* scheduler,
67 DriveServiceInterface* drive_service); 96 DriveServiceInterface* drive_service,
97 LoaderController* apply_task_controller);
68 ~ChangeListLoader(); 98 ~ChangeListLoader();
69 99
70 // Indicates whether there is a request for full resource list or change 100 // Indicates whether there is a request for full resource list or change
71 // list fetching is in flight (i.e. directory contents fetching does not 101 // list fetching is in flight (i.e. directory contents fetching does not
72 // count). 102 // count).
73 bool IsRefreshing() const; 103 bool IsRefreshing() const;
74 104
75 // Adds and removes the observer. 105 // Adds and removes the observer.
76 void AddObserver(ChangeListLoaderObserver* observer); 106 void AddObserver(ChangeListLoaderObserver* observer);
77 void RemoveObserver(ChangeListLoaderObserver* observer); 107 void RemoveObserver(ChangeListLoaderObserver* observer);
(...skipping 19 matching lines...) Expand all
97 const FileOperationCallback& callback); 127 const FileOperationCallback& callback);
98 128
99 // Calls Load() with an empty DirectoryFetchInfo(). Only for testing purposes. 129 // Calls Load() with an empty DirectoryFetchInfo(). Only for testing purposes.
100 void LoadForTesting(const FileOperationCallback& callback); 130 void LoadForTesting(const FileOperationCallback& callback);
101 131
102 // Gets the about resource from the cache or the server. If the cache is 132 // Gets the about resource from the cache or the server. If the cache is
103 // availlavle, just runs |callback| with the cached about resource. If not, 133 // availlavle, just runs |callback| with the cached about resource. If not,
104 // calls |UpdateAboutResource| passing |callback|. 134 // calls |UpdateAboutResource| passing |callback|.
105 void GetAboutResource(const google_apis::AboutResourceCallback& callback); 135 void GetAboutResource(const google_apis::AboutResourceCallback& callback);
106 136
107 // Increments the lock count and returns an object which decrements the count
108 // on its destruction.
109 // While the lock count is positive, ChangeListLoader does not add any entries
110 // to the local metadata.
111 scoped_ptr<base::ScopedClosureRunner> GetLock();
112
113 private: 137 private:
114 // Part of LoadDirectoryIfNeeded(). 138 // Part of LoadDirectoryIfNeeded().
115 void LoadDirectoryIfNeededAfterGetEntry(const base::FilePath& directory_path, 139 void LoadDirectoryIfNeededAfterGetEntry(const base::FilePath& directory_path,
116 const FileOperationCallback& callback, 140 const FileOperationCallback& callback,
117 bool should_try_loading_parent, 141 bool should_try_loading_parent,
118 const ResourceEntry* entry, 142 const ResourceEntry* entry,
119 FileError error); 143 FileError error);
120 void LoadDirectoryIfNeededAfterLoadParent( 144 void LoadDirectoryIfNeededAfterLoadParent(
121 const base::FilePath& directory_path, 145 const base::FilePath& directory_path,
122 const FileOperationCallback& callback, 146 const FileOperationCallback& callback,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 FileError error, 215 FileError error,
192 ScopedVector<ChangeList> change_lists); 216 ScopedVector<ChangeList> change_lists);
193 217
194 // Part of LoadDirectoryFromServer(). 218 // Part of LoadDirectoryFromServer().
195 void LoadDirectoryFromServerAfterRefresh( 219 void LoadDirectoryFromServerAfterRefresh(
196 const DirectoryFetchInfo& directory_fetch_info, 220 const DirectoryFetchInfo& directory_fetch_info,
197 const FileOperationCallback& callback, 221 const FileOperationCallback& callback,
198 const base::FilePath* directory_path, 222 const base::FilePath* directory_path,
199 FileError error); 223 FileError error);
200 224
201 // ================= Implementation for lock mechanism ====================
202 // Runs the closure if the lock count is 0, otherwise it will be pending.
203 // All tasks which may add entries should be run via this method.
204 void ApplyChange(const base::Closure& closure);
205
206 // Decrements the lock count.
207 void Unlock();
208
209 // ================= Implementation for other stuff ================= 225 // ================= Implementation for other stuff =================
210 226
211 // Gets the about resource from the server, and caches it if successful. This 227 // Gets the about resource from the server, and caches it if successful. This
212 // function calls JobScheduler::GetAboutResource internally. The cache will be 228 // function calls JobScheduler::GetAboutResource internally. The cache will be
213 // used in |GetAboutResource|. 229 // used in |GetAboutResource|.
214 void UpdateAboutResource( 230 void UpdateAboutResource(
215 const google_apis::AboutResourceCallback& callback); 231 const google_apis::AboutResourceCallback& callback);
216 // Part of UpdateAboutResource(). 232 // Part of UpdateAboutResource().
217 // This function should be called when the latest about resource is being 233 // This function should be called when the latest about resource is being
218 // fetched from the server. The retrieved about resoure is cloned, and one is 234 // fetched from the server. The retrieved about resoure is cloned, and one is
219 // cached and the other is passed to |callback|. 235 // cached and the other is passed to |callback|.
220 void UpdateAboutResourceAfterGetAbout( 236 void UpdateAboutResourceAfterGetAbout(
221 const google_apis::AboutResourceCallback& callback, 237 const google_apis::AboutResourceCallback& callback,
222 google_apis::GDataErrorCode status, 238 google_apis::GDataErrorCode status,
223 scoped_ptr<google_apis::AboutResource> about_resource); 239 scoped_ptr<google_apis::AboutResource> about_resource);
224 240
225 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; 241 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
226 ResourceMetadata* resource_metadata_; // Not owned. 242 ResourceMetadata* resource_metadata_; // Not owned.
227 JobScheduler* scheduler_; // Not owned. 243 JobScheduler* scheduler_; // Not owned.
228 DriveServiceInterface* drive_service_; // Not owned. 244 DriveServiceInterface* drive_service_; // Not owned.
245 LoaderController* loader_controller_; // Not owned.
229 ObserverList<ChangeListLoaderObserver> observers_; 246 ObserverList<ChangeListLoaderObserver> observers_;
230 typedef std::map<std::string, std::vector<FileOperationCallback> > 247 typedef std::map<std::string, std::vector<FileOperationCallback> >
231 LoadCallbackMap; 248 LoadCallbackMap;
232 LoadCallbackMap pending_load_callback_; 249 LoadCallbackMap pending_load_callback_;
233 FileOperationCallback pending_update_check_callback_; 250 FileOperationCallback pending_update_check_callback_;
234 251
235 int lock_count_;
236 std::vector<base::Closure> pending_apply_closures_;
237
238 // Running feed fetcher. 252 // Running feed fetcher.
239 scoped_ptr<FeedFetcher> change_feed_fetcher_; 253 scoped_ptr<FeedFetcher> change_feed_fetcher_;
240 254
241 // Set of the running feed fetcher for the fast fetch. 255 // Set of the running feed fetcher for the fast fetch.
242 std::set<FeedFetcher*> fast_fetch_feed_fetcher_set_; 256 std::set<FeedFetcher*> fast_fetch_feed_fetcher_set_;
243 257
244 // The cache of the about resource. 258 // The cache of the about resource.
245 scoped_ptr<google_apis::AboutResource> cached_about_resource_; 259 scoped_ptr<google_apis::AboutResource> cached_about_resource_;
246 260
247 // True if the full resource list is loaded (i.e. the resource metadata is 261 // True if the full resource list is loaded (i.e. the resource metadata is
248 // stored locally). 262 // stored locally).
249 bool loaded_; 263 bool loaded_;
250 264
251 // Note: This should remain the last member so it'll be destroyed and 265 // Note: This should remain the last member so it'll be destroyed and
252 // invalidate its weak pointers before any other members are destroyed. 266 // invalidate its weak pointers before any other members are destroyed.
253 base::WeakPtrFactory<ChangeListLoader> weak_ptr_factory_; 267 base::WeakPtrFactory<ChangeListLoader> weak_ptr_factory_;
254 DISALLOW_COPY_AND_ASSIGN(ChangeListLoader); 268 DISALLOW_COPY_AND_ASSIGN(ChangeListLoader);
255 }; 269 };
256 270
257 } // namespace internal 271 } // namespace internal
258 } // namespace drive 272 } // namespace drive
259 273
260 #endif // CHROME_BROWSER_CHROMEOS_DRIVE_CHANGE_LIST_LOADER_H_ 274 #endif // CHROME_BROWSER_CHROMEOS_DRIVE_CHANGE_LIST_LOADER_H_
OLDNEW
« 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