Chromium Code Reviews| Index: src/cancelable-task.cc |
| diff --git a/src/cancelable-task.cc b/src/cancelable-task.cc |
| index b712d98877ce930946bd8ceb4754bf4fe403ef8f..2b941e4fee9864ed5c2eb4ba2c67318629151aa7 100644 |
| --- a/src/cancelable-task.cc |
| +++ b/src/cancelable-task.cc |
| @@ -34,8 +34,11 @@ uint32_t CancelableTaskManager::Register(Cancelable* task) { |
| uint32_t id = ++task_id_counter_; |
| // The loop below is just used when task_id_counter_ overflows. |
| while (cancelable_tasks_.count(id) > 0) ++id; |
| - CHECK(!canceled_); |
| - cancelable_tasks_[id] = task; |
| + if (canceled_) { |
|
marja
2017/01/04 12:54:43
Why is this needed now?
Is it because we might no
|
| + CHECK(task->Cancel()); |
|
vogelheim
2017/01/04 12:58:08
Why are we sure that Cancel() will always return t
|
| + } else { |
| + cancelable_tasks_[id] = task; |
| + } |
| return id; |
| } |
| @@ -93,6 +96,33 @@ void CancelableTaskManager::CancelAndWait() { |
| } |
| } |
| +CancelableTaskManager::TryAbortResult CancelableTaskManager::Cancel() { |
| + // Clean up all cancelable fore- and background tasks. Tasks are canceled on |
| + // the way if possible, i.e., if they have not started yet. |
| + base::LockGuard<base::Mutex> guard(&mutex_); |
| + |
| + if (cancelable_tasks_.empty()) return kTaskRemoved; |
| + |
| + canceled_ = true; |
| + |
| + bool tasks_running = false; |
| + |
| + for (auto it = cancelable_tasks_.begin(); it != cancelable_tasks_.end();) { |
| + auto current = it; |
| + // We need to get to the next element before erasing the current. |
| + ++it; |
| + if (current->second->Cancel()) { |
| + cancelable_tasks_.erase(current); |
| + } else { |
| + tasks_running = true; |
| + } |
| + } |
| + |
| + canceled_ = false; |
|
vogelheim
2017/01/04 12:58:08
I'm not sure I understang this code...
Most Canc
jochen (gone - plz use gerrit)
2017/01/04 13:18:31
ah, fair enough. I forgot about the lock..
remove
|
| + |
| + return tasks_running ? kTaskRunning : kTaskAborted; |
|
vogelheim
2017/01/04 12:58:08
tasks_running == !cancelable_tasks_.empty() ?
If s
|
| +} |
| + |
| CancelableTask::CancelableTask(Isolate* isolate) |
| : CancelableTask(isolate, isolate->cancelable_task_manager()) {} |