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

Side by Side Diff: webkit/fileapi/syncable/syncable_file_operation_runner.cc

Issue 11238054: Add OnSyncEnabled/OnWriteEnabled notification handling to operation runner (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month 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
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 #include "webkit/fileapi/syncable/syncable_file_operation_runner.h" 5 #include "webkit/fileapi/syncable/syncable_file_operation_runner.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 9
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 23 matching lines...) Expand all
34 void SyncableFileOperationRunner::Task::Start(LocalFileSyncStatus* status) { 34 void SyncableFileOperationRunner::Task::Start(LocalFileSyncStatus* status) {
35 for (size_t i = 0; i < target_paths().size(); ++i) { 35 for (size_t i = 0; i < target_paths().size(); ++i) {
36 DCHECK(status->IsWritable(target_paths()[i])); 36 DCHECK(status->IsWritable(target_paths()[i]));
37 status->StartWriting(target_paths()[i]); 37 status->StartWriting(target_paths()[i]);
38 } 38 }
39 Run(); 39 Run();
40 } 40 }
41 41
42 // SyncableFileOperationRunner ------------------------------------------------- 42 // SyncableFileOperationRunner -------------------------------------------------
43 43
44 SyncableFileOperationRunner::SyncableFileOperationRunner() 44 SyncableFileOperationRunner::SyncableFileOperationRunner(
45 : sync_status_(new LocalFileSyncStatus) { 45 size_t max_inflight_tasks,
46 LocalFileSyncStatus* sync_status)
47 : sync_status_(sync_status),
48 max_inflight_tasks_(max_inflight_tasks),
49 num_inflight_tasks_(0) {
46 DCHECK(CalledOnValidThread()); 50 DCHECK(CalledOnValidThread());
51 sync_status_->AddObserver(this);
47 } 52 }
48 53
49 SyncableFileOperationRunner::~SyncableFileOperationRunner() { 54 SyncableFileOperationRunner::~SyncableFileOperationRunner() {
50 DCHECK(CalledOnValidThread()); 55 DCHECK(CalledOnValidThread());
51 for_each(pending_operations_.begin(), pending_operations_.end(), 56 for_each(pending_tasks_.begin(), pending_tasks_.end(),
52 SyncableFileOperationRunner::Task::CancelAndDelete); 57 SyncableFileOperationRunner::Task::CancelAndDelete);
53 } 58 }
54 59
60 void SyncableFileOperationRunner::OnSyncEnabled(const FileSystemURL& url) {
61 }
62
63 void SyncableFileOperationRunner::OnWriteEnabled(const FileSystemURL& url) {
64 DCHECK(CalledOnValidThread());
65 RunNextRunnableTask();
66 }
67
55 void SyncableFileOperationRunner::PostOperationTask(scoped_ptr<Task> task) { 68 void SyncableFileOperationRunner::PostOperationTask(scoped_ptr<Task> task) {
56 DCHECK(CalledOnValidThread()); 69 DCHECK(CalledOnValidThread());
57 pending_operations_.push_back(task.release()); 70 pending_tasks_.push_back(task.release());
58 RunNextRunnableTask(); 71 RunNextRunnableTask();
59 } 72 }
60 73
61 void SyncableFileOperationRunner::RunNextRunnableTask() { 74 void SyncableFileOperationRunner::RunNextRunnableTask() {
62 DCHECK(CalledOnValidThread()); 75 DCHECK(CalledOnValidThread());
63 for (std::list<Task*>::iterator iter = pending_operations_.begin(); 76 for (std::list<Task*>::iterator iter = pending_tasks_.begin();
64 iter != pending_operations_.end(); ++iter) { 77 iter != pending_tasks_.end() && ShouldStartMoreTasks();) {
65 if ((*iter)->IsRunnable(sync_status())) { 78 if ((*iter)->IsRunnable(sync_status())) {
79 ++num_inflight_tasks_;
80 DCHECK_GE(num_inflight_tasks_, 1U);
66 scoped_ptr<Task> task(*iter); 81 scoped_ptr<Task> task(*iter);
67 pending_operations_.erase(iter); 82 pending_tasks_.erase(iter++);
68 task->Start(sync_status()); 83 task->Start(sync_status());
69 return;
70 } 84 }
85 ++iter;
71 } 86 }
72 } 87 }
73 88
74 void SyncableFileOperationRunner::OnOperationCompleted( 89 void SyncableFileOperationRunner::OnOperationCompleted(
75 const std::vector<FileSystemURL>& target_paths) { 90 const std::vector<FileSystemURL>& target_paths) {
91 --num_inflight_tasks_;
92 DCHECK_GE(num_inflight_tasks_, 0U);
76 for (size_t i = 0; i < target_paths.size(); ++i) { 93 for (size_t i = 0; i < target_paths.size(); ++i) {
77 DCHECK(sync_status()->IsWriting(target_paths[i])); 94 DCHECK(sync_status()->IsWriting(target_paths[i]));
78 sync_status()->EndWriting(target_paths[i]); 95 sync_status()->EndWriting(target_paths[i]);
79 } 96 }
80 RunNextRunnableTask(); 97 RunNextRunnableTask();
81 } 98 }
82 99
100 bool SyncableFileOperationRunner::ShouldStartMoreTasks() const {
101 return num_inflight_tasks_ < max_inflight_tasks_;
102 }
103
83 } // namespace fileapi 104 } // namespace fileapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698