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