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

Side by Side Diff: chrome/browser/sync_file_system/local/syncable_file_operation_runner.cc

Issue 2129083002: Explicitly check various sync_file_system classes live on the IO thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix tests, remove unneeded check Created 4 years, 5 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 #include "chrome/browser/sync_file_system/local/syncable_file_operation_runner.h " 5 #include "chrome/browser/sync_file_system/local/syncable_file_operation_runner.h "
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <functional>
11 10
12 #include "base/callback.h" 11 #include "base/callback.h"
13 #include "base/stl_util.h" 12 #include "base/stl_util.h"
13 #include "content/public/browser/browser_thread.h"
14 14
15 using storage::FileSystemURL; 15 using storage::FileSystemURL;
16 16
17 namespace sync_file_system { 17 namespace sync_file_system {
18 18
19 // SyncableFileOperationRunner::Task ------------------------------------------- 19 // SyncableFileOperationRunner::Task -------------------------------------------
20 20
21 // static
22 void SyncableFileOperationRunner::Task::CancelAndDelete(
23 SyncableFileOperationRunner::Task* task) {
24 task->Cancel();
25 delete task;
26 }
27
28 bool SyncableFileOperationRunner::Task::IsRunnable( 21 bool SyncableFileOperationRunner::Task::IsRunnable(
29 LocalFileSyncStatus* status) const { 22 LocalFileSyncStatus* status) const {
30 for (size_t i = 0; i < target_paths().size(); ++i) { 23 for (size_t i = 0; i < target_paths().size(); ++i) {
31 if (!status->IsWritable(target_paths()[i])) 24 if (!status->IsWritable(target_paths()[i]))
32 return false; 25 return false;
33 } 26 }
34 return true; 27 return true;
35 } 28 }
36 29
37 void SyncableFileOperationRunner::Task::Start(LocalFileSyncStatus* status) { 30 void SyncableFileOperationRunner::Task::Start(LocalFileSyncStatus* status) {
38 for (size_t i = 0; i < target_paths().size(); ++i) { 31 for (size_t i = 0; i < target_paths().size(); ++i) {
39 DCHECK(status->IsWritable(target_paths()[i])); 32 DCHECK(status->IsWritable(target_paths()[i]));
40 status->StartWriting(target_paths()[i]); 33 status->StartWriting(target_paths()[i]);
41 } 34 }
42 Run(); 35 Run();
43 } 36 }
44 37
45 // SyncableFileOperationRunner ------------------------------------------------- 38 // SyncableFileOperationRunner -------------------------------------------------
46 39
47 SyncableFileOperationRunner::SyncableFileOperationRunner( 40 SyncableFileOperationRunner::SyncableFileOperationRunner(
48 int64_t max_inflight_tasks, 41 int64_t max_inflight_tasks,
49 LocalFileSyncStatus* sync_status) 42 LocalFileSyncStatus* sync_status)
50 : sync_status_(sync_status), 43 : sync_status_(sync_status),
51 max_inflight_tasks_(max_inflight_tasks), 44 max_inflight_tasks_(max_inflight_tasks),
52 num_inflight_tasks_(0) { 45 num_inflight_tasks_(0) {
53 DCHECK(CalledOnValidThread()); 46 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
54 sync_status_->AddObserver(this); 47 sync_status_->AddObserver(this);
55 } 48 }
56 49
57 SyncableFileOperationRunner::~SyncableFileOperationRunner() { 50 SyncableFileOperationRunner::~SyncableFileOperationRunner() {
58 DCHECK(CalledOnValidThread()); 51 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
59 for_each(pending_tasks_.begin(), pending_tasks_.end(), 52
60 SyncableFileOperationRunner::Task::CancelAndDelete); 53 for (auto& task : pending_tasks_)
54 task->Cancel();
55 pending_tasks_.clear();
61 } 56 }
62 57
63 void SyncableFileOperationRunner::OnSyncEnabled(const FileSystemURL& url) { 58 void SyncableFileOperationRunner::OnSyncEnabled(const FileSystemURL& url) {
64 } 59 }
65 60
66 void SyncableFileOperationRunner::OnWriteEnabled(const FileSystemURL& url) { 61 void SyncableFileOperationRunner::OnWriteEnabled(const FileSystemURL& url) {
67 DCHECK(CalledOnValidThread()); 62 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
68 RunNextRunnableTask(); 63 RunNextRunnableTask();
69 } 64 }
70 65
71 void SyncableFileOperationRunner::PostOperationTask( 66 void SyncableFileOperationRunner::PostOperationTask(
72 std::unique_ptr<Task> task) { 67 std::unique_ptr<Task> task) {
73 DCHECK(CalledOnValidThread()); 68 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
74 pending_tasks_.push_back(task.release()); 69 pending_tasks_.push_back(std::move(task));
75 RunNextRunnableTask(); 70 RunNextRunnableTask();
76 } 71 }
77 72
78 void SyncableFileOperationRunner::RunNextRunnableTask() { 73 void SyncableFileOperationRunner::RunNextRunnableTask() {
79 DCHECK(CalledOnValidThread()); 74 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
80 for (std::list<Task*>::iterator iter = pending_tasks_.begin(); 75 for (auto iter = pending_tasks_.begin();
81 iter != pending_tasks_.end() && ShouldStartMoreTasks();) { 76 iter != pending_tasks_.end() && ShouldStartMoreTasks();) {
82 if ((*iter)->IsRunnable(sync_status())) { 77 if ((*iter)->IsRunnable(sync_status())) {
83 ++num_inflight_tasks_; 78 ++num_inflight_tasks_;
84 DCHECK_GE(num_inflight_tasks_, 1); 79 DCHECK_GE(num_inflight_tasks_, 1);
85 std::unique_ptr<Task> task(*iter); 80 std::unique_ptr<Task> task = std::move(*iter);
86 pending_tasks_.erase(iter++); 81 pending_tasks_.erase(iter++);
87 task->Start(sync_status()); 82 task->Start(sync_status());
88 continue; 83 continue;
89 } 84 }
90 ++iter; 85 ++iter;
91 } 86 }
92 } 87 }
93 88
94 void SyncableFileOperationRunner::OnOperationCompleted( 89 void SyncableFileOperationRunner::OnOperationCompleted(
95 const std::vector<FileSystemURL>& target_paths) { 90 const std::vector<FileSystemURL>& target_paths) {
96 --num_inflight_tasks_; 91 --num_inflight_tasks_;
97 DCHECK_GE(num_inflight_tasks_, 0); 92 DCHECK_GE(num_inflight_tasks_, 0);
98 for (size_t i = 0; i < target_paths.size(); ++i) { 93 for (size_t i = 0; i < target_paths.size(); ++i) {
99 DCHECK(sync_status()->IsWriting(target_paths[i])); 94 DCHECK(sync_status()->IsWriting(target_paths[i]));
100 sync_status()->EndWriting(target_paths[i]); 95 sync_status()->EndWriting(target_paths[i]);
101 } 96 }
102 RunNextRunnableTask(); 97 RunNextRunnableTask();
103 } 98 }
104 99
105 bool SyncableFileOperationRunner::ShouldStartMoreTasks() const { 100 bool SyncableFileOperationRunner::ShouldStartMoreTasks() const {
106 return num_inflight_tasks_ < max_inflight_tasks_; 101 return num_inflight_tasks_ < max_inflight_tasks_;
107 } 102 }
108 103
109 } // namespace sync_file_system 104 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698