| Index: chrome/browser/chromeos/file_system_provider/queue.cc
|
| diff --git a/chrome/browser/chromeos/file_system_provider/queue.cc b/chrome/browser/chromeos/file_system_provider/queue.cc
|
| index 883917f519b561a4b7e989d93e2ddef191ec8d2f..10f225182136698ae37af5e2b0dd43cd6091f481 100644
|
| --- a/chrome/browser/chromeos/file_system_provider/queue.cc
|
| +++ b/chrome/browser/chromeos/file_system_provider/queue.cc
|
| @@ -12,11 +12,11 @@
|
| namespace chromeos {
|
| namespace file_system_provider {
|
|
|
| -Queue::Task::Task() : token(0), completed(false) {
|
| +Queue::Task::Task() : token(0) {
|
| }
|
|
|
| Queue::Task::Task(size_t token, const AbortableCallback& callback)
|
| - : token(token), completed(false), callback(callback) {
|
| + : token(token), callback(callback) {
|
| }
|
|
|
| Queue::Task::~Task() {
|
| @@ -36,10 +36,9 @@ size_t Queue::NewToken() {
|
| return next_token_++;
|
| }
|
|
|
| -AbortCallback Queue::Enqueue(size_t token, const AbortableCallback& callback) {
|
| +void Queue::Enqueue(size_t token, const AbortableCallback& callback) {
|
| #if !NDEBUG
|
| - const auto it = executed_.find(token);
|
| - DCHECK(it == executed_.end());
|
| + DCHECK(executed_.find(token) == executed_.end());
|
| for (auto& task : pending_) {
|
| DCHECK(token != task.token);
|
| }
|
| @@ -47,20 +46,30 @@ AbortCallback Queue::Enqueue(size_t token, const AbortableCallback& callback) {
|
| pending_.push_back(Task(token, callback));
|
| base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| FROM_HERE, base::Bind(&Queue::MaybeRun, weak_ptr_factory_.GetWeakPtr()));
|
| - return base::Bind(&Queue::Abort, weak_ptr_factory_.GetWeakPtr(), token);
|
| }
|
|
|
| void Queue::Complete(size_t token) {
|
| const auto it = executed_.find(token);
|
| - DCHECK(it != executed_.end() && !it->second.completed);
|
| - it->second.completed = true;
|
| + DCHECK(it != executed_.end());
|
| + completed_[token] = it->second;
|
| + executed_.erase(it);
|
| }
|
|
|
| void Queue::Remove(size_t token) {
|
| - const auto it = executed_.find(token);
|
| - DCHECK(it != executed_.end() && it->second.completed);
|
| + const auto it = completed_.find(token);
|
| + if (it != completed_.end()) {
|
| + completed_.erase(it);
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&Queue::MaybeRun, weak_ptr_factory_.GetWeakPtr()));
|
| + return;
|
| + }
|
| +
|
| + // If not completed, then it must have been aborted.
|
| + const auto aborted_it = aborted_.find(token);
|
| + DCHECK(aborted_it != aborted_.end());
|
| + aborted_.erase(aborted_it);
|
|
|
| - executed_.erase(it);
|
| base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| FROM_HERE, base::Bind(&Queue::MaybeRun, weak_ptr_factory_.GetWeakPtr()));
|
| }
|
| @@ -78,20 +87,15 @@ void Queue::MaybeRun() {
|
| executed_[task.token].abort_callback = task.callback.Run();
|
| }
|
|
|
| -void Queue::Abort(size_t token,
|
| - const storage::AsyncFileUtil::StatusCallback& callback) {
|
| +void Queue::Abort(size_t token) {
|
| // Check if it's running.
|
| const auto it = executed_.find(token);
|
| if (it != executed_.end()) {
|
| - const Task& task = it->second;
|
| - // If the task is marked as completed, then it's impossible to abort it.
|
| - if (task.completed) {
|
| - callback.Run(base::File::FILE_ERROR_INVALID_OPERATION);
|
| - return;
|
| - }
|
| - DCHECK(!task.abort_callback.is_null());
|
| - it->second.abort_callback.Run(callback);
|
| + Task task = it->second;
|
| + aborted_[token] = task;
|
| executed_.erase(it);
|
| + DCHECK(!task.abort_callback.is_null());
|
| + task.abort_callback.Run();
|
| base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| FROM_HERE,
|
| base::Bind(&Queue::MaybeRun, weak_ptr_factory_.GetWeakPtr()));
|
| @@ -101,8 +105,8 @@ void Queue::Abort(size_t token,
|
| // Aborting not running tasks is linear. TODO(mtomasz): Optimize if feasible.
|
| for (auto it = pending_.begin(); it != pending_.end(); ++it) {
|
| if (token == it->token) {
|
| + aborted_[token] = *it;
|
| pending_.erase(it);
|
| - callback.Run(base::File::FILE_OK);
|
| base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| FROM_HERE,
|
| base::Bind(&Queue::MaybeRun, weak_ptr_factory_.GetWeakPtr()));
|
| @@ -110,8 +114,8 @@ void Queue::Abort(size_t token,
|
| }
|
| }
|
|
|
| - // The task is already removed.
|
| - callback.Run(base::File::FILE_ERROR_INVALID_OPERATION);
|
| + // The task is already removed, marked as completed or aborted.
|
| + NOTREACHED();
|
| }
|
|
|
| } // namespace file_system_provider
|
|
|