Index: chrome/browser/sync_file_system/drive_backend/task_dependency_manager.cc |
diff --git a/chrome/browser/sync_file_system/drive_backend/task_dependency_manager.cc b/chrome/browser/sync_file_system/drive_backend/task_dependency_manager.cc |
index cf2e51c0b24f46ebfcb161bfeb22d2c0c6abc02d..429d2179cf92ea1d611ba13ff6a99c41716f0634 100644 |
--- a/chrome/browser/sync_file_system/drive_backend/task_dependency_manager.cc |
+++ b/chrome/browser/sync_file_system/drive_backend/task_dependency_manager.cc |
@@ -59,10 +59,11 @@ bool InsertPaths(std::vector<base::FilePath> paths_to_insert, |
} // namespace |
-BlockingFactor::BlockingFactor() {} |
+BlockingFactor::BlockingFactor() : exclusive(false) {} |
BlockingFactor::~BlockingFactor() {} |
-TaskDependencyManager::TaskDependencyManager() {} |
+TaskDependencyManager::TaskDependencyManager() |
+ : running_exclusive_task_(false) {} |
TaskDependencyManager::~TaskDependencyManager() { |
DCHECK(paths_by_app_id_.empty()); |
@@ -71,6 +72,18 @@ TaskDependencyManager::~TaskDependencyManager() { |
} |
bool TaskDependencyManager::Insert(const BlockingFactor& blocking_factor) { |
+ if (running_exclusive_task_) |
+ return false; |
+ |
+ if (blocking_factor.exclusive) { |
+ if (!tracker_ids_.empty() || |
+ !file_ids_.empty() || |
+ !paths_by_app_id_.empty()) |
+ return false; |
+ running_exclusive_task_ = true; |
+ return true; |
+ } |
+ |
if (!InsertAllOrNone(blocking_factor.tracker_ids, &tracker_ids_)) |
goto fail_on_tracker_id_insertion; |
@@ -97,6 +110,16 @@ bool TaskDependencyManager::Insert(const BlockingFactor& blocking_factor) { |
} |
void TaskDependencyManager::Erase(const BlockingFactor& blocking_factor) { |
+ if (blocking_factor.exclusive) { |
+ DCHECK(running_exclusive_task_); |
+ DCHECK(paths_by_app_id_.empty()); |
+ DCHECK(file_ids_.empty()); |
+ DCHECK(tracker_ids_.empty()); |
+ |
+ running_exclusive_task_ = false; |
+ return; |
+ } |
+ |
if (!blocking_factor.app_id.empty()) { |
EraseContainer(blocking_factor.paths, |
&paths_by_app_id_[blocking_factor.app_id]); |