Index: webkit/fileapi/syncable/syncable_file_operation_runner.cc |
diff --git a/webkit/fileapi/syncable/syncable_file_operation_runner.cc b/webkit/fileapi/syncable/syncable_file_operation_runner.cc |
index ef9c8995761f4460fb9b68073d1c15001d97e407..0f3afe7239f8c0f9c085de93a952314a548f1ffb 100644 |
--- a/webkit/fileapi/syncable/syncable_file_operation_runner.cc |
+++ b/webkit/fileapi/syncable/syncable_file_operation_runner.cc |
@@ -41,38 +41,55 @@ void SyncableFileOperationRunner::Task::Start(LocalFileSyncStatus* status) { |
// SyncableFileOperationRunner ------------------------------------------------- |
-SyncableFileOperationRunner::SyncableFileOperationRunner() |
- : sync_status_(new LocalFileSyncStatus) { |
+SyncableFileOperationRunner::SyncableFileOperationRunner( |
+ int64 max_inflight_tasks, |
+ LocalFileSyncStatus* sync_status) |
+ : sync_status_(sync_status), |
+ max_inflight_tasks_(max_inflight_tasks), |
+ num_inflight_tasks_(0) { |
DCHECK(CalledOnValidThread()); |
+ sync_status_->AddObserver(this); |
} |
SyncableFileOperationRunner::~SyncableFileOperationRunner() { |
DCHECK(CalledOnValidThread()); |
- for_each(pending_operations_.begin(), pending_operations_.end(), |
+ for_each(pending_tasks_.begin(), pending_tasks_.end(), |
SyncableFileOperationRunner::Task::CancelAndDelete); |
} |
+void SyncableFileOperationRunner::OnSyncEnabled(const FileSystemURL& url) { |
+} |
+ |
+void SyncableFileOperationRunner::OnWriteEnabled(const FileSystemURL& url) { |
+ DCHECK(CalledOnValidThread()); |
+ RunNextRunnableTask(); |
+} |
+ |
void SyncableFileOperationRunner::PostOperationTask(scoped_ptr<Task> task) { |
DCHECK(CalledOnValidThread()); |
- pending_operations_.push_back(task.release()); |
+ pending_tasks_.push_back(task.release()); |
RunNextRunnableTask(); |
} |
void SyncableFileOperationRunner::RunNextRunnableTask() { |
DCHECK(CalledOnValidThread()); |
- for (std::list<Task*>::iterator iter = pending_operations_.begin(); |
- iter != pending_operations_.end(); ++iter) { |
+ for (std::list<Task*>::iterator iter = pending_tasks_.begin(); |
+ iter != pending_tasks_.end() && ShouldStartMoreTasks();) { |
if ((*iter)->IsRunnable(sync_status())) { |
+ ++num_inflight_tasks_; |
+ DCHECK_GE(num_inflight_tasks_, 1); |
scoped_ptr<Task> task(*iter); |
- pending_operations_.erase(iter); |
+ pending_tasks_.erase(iter++); |
task->Start(sync_status()); |
- return; |
} |
+ ++iter; |
} |
} |
void SyncableFileOperationRunner::OnOperationCompleted( |
const std::vector<FileSystemURL>& target_paths) { |
+ --num_inflight_tasks_; |
+ DCHECK_GE(num_inflight_tasks_, 0); |
for (size_t i = 0; i < target_paths.size(); ++i) { |
DCHECK(sync_status()->IsWriting(target_paths[i])); |
sync_status()->EndWriting(target_paths[i]); |
@@ -80,4 +97,8 @@ void SyncableFileOperationRunner::OnOperationCompleted( |
RunNextRunnableTask(); |
} |
+bool SyncableFileOperationRunner::ShouldStartMoreTasks() const { |
+ return num_inflight_tasks_ < max_inflight_tasks_; |
+} |
+ |
} // namespace fileapi |