1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_TASK_DEPENDENCY_MANAGER_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_TASK_DEPENDENCY_MANAGER_H_ 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <map> 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <set> 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string> 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector> 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file_path.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/sync_file_system/subtree_set.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace sync_file_system { 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace drive_backend { 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)struct BlockingFactor { 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool exclusive; 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string app_id; 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<base::FilePath> paths; 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<std::string> file_ids; 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<int64> tracker_ids; 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BlockingFactor(); 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~BlockingFactor(); 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This class manages dependency of the background tasks. 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class TaskDependencyManager { 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TaskDependencyManager(); 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~TaskDependencyManager(); 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Inserts |blocking_factor| to the collection and returns true if it 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // completes successfully. Returns false and doesn't modify the collection 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // if |blocking_factor| conflicts other |blocking_factor| that is inserted 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // before. 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Two |blocking_factor| are handled as conflict if: 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // - They have common |file_id| or |tracker_id|. 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // - Or, they have the same |app_id| and have a |path| that one of its parent 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // belongs to the |blocking_factor|. 45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool Insert(const BlockingFactor* blocking_factor); 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void Erase(const BlockingFactor* blocking_factor); 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) friend class TaskDependencyManagerTest; 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int running_task_count_; 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool running_exclusive_task_; 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::map<std::string, SubtreeSet> paths_by_app_id_; 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::set<std::string> file_ids_; 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::set<int64> tracker_ids_; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TaskDependencyManager); 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace drive_backend 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace sync_file_system 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_TASK_DEPENDENCY_MANAGER_H_ 65