Commit 8f8cc250 authored by Sami Kyostila's avatar Sami Kyostila Committed by Commit Bot

base/task: Add debug annotation to cancelled task sweeping

We're seeing some crashes during removing cancelled tasks from work
queues. Add some debug annotations to help understand where these
invalid tasks are coming from.

Bug: 1071475
Change-Id: Ic4ba31b8a9585e44e70c7151f461615253291ea1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2153117
Commit-Queue: Sami Kyöstilä <skyostil@chromium.org>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Auto-Submit: Sami Kyöstilä <skyostil@chromium.org>
Cr-Commit-Position: refs/heads/master@{#760240}
parent b898d15a
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
#include "base/task/sequence_manager/work_queue.h" #include "base/task/sequence_manager/work_queue.h"
#include "base/debug/alias.h"
#include "base/task/sequence_manager/sequence_manager_impl.h" #include "base/task/sequence_manager/sequence_manager_impl.h"
#include "base/task/sequence_manager/work_queue_sets.h" #include "base/task/sequence_manager/work_queue_sets.h"
#include "build/build_config.h"
namespace base { namespace base {
namespace sequence_manager { namespace sequence_manager {
...@@ -200,8 +202,31 @@ bool WorkQueue::RemoveAllCanceledTasksFromFront() { ...@@ -200,8 +202,31 @@ bool WorkQueue::RemoveAllCanceledTasksFromFront() {
if (!work_queue_sets_) if (!work_queue_sets_)
return false; return false;
bool task_removed = false; bool task_removed = false;
while (!tasks_.empty() && while (!tasks_.empty()) {
(!tasks_.front().task || tasks_.front().task.IsCancelled())) { const auto& pending_task = tasks_.front();
#if !defined(OS_NACL)
// Record some debugging information about the task.
// TODO(skyostil): Remove once crbug.com/1071475 is resolved.
DEBUG_ALIAS_FOR_CSTR(debug_file_name,
pending_task.posted_from.file_name()
? pending_task.posted_from.file_name()
: "",
16);
DEBUG_ALIAS_FOR_CSTR(debug_function_name,
pending_task.posted_from.function_name()
? pending_task.posted_from.function_name()
: "",
16);
int debug_line_number = pending_task.posted_from.line_number();
const void* debug_pc = pending_task.posted_from.program_counter();
const void* debug_bind_state =
reinterpret_cast<const void*>(&pending_task.task);
base::debug::Alias(&debug_line_number);
base::debug::Alias(&debug_pc);
base::debug::Alias(&debug_bind_state);
#endif // !defined(OS_NACL)
if (pending_task.task && !pending_task.task.IsCancelled())
break;
tasks_.pop_front(); tasks_.pop_front();
task_removed = true; task_removed = true;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment