| Index: base/threading/post_task_and_reply_impl.cc
|
| diff --git a/base/threading/post_task_and_reply_impl.cc b/base/threading/post_task_and_reply_impl.cc
|
| index d928dc882ac62fa890e29af9849741af78360e0b..7899f65f94bd792e3f9bd2f277a9e11595e590b7 100644
|
| --- a/base/threading/post_task_and_reply_impl.cc
|
| +++ b/base/threading/post_task_and_reply_impl.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/callback.h"
|
| +#include "base/debug/leak_annotations.h"
|
| #include "base/logging.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/sequence_checker.h"
|
| @@ -82,6 +83,12 @@ bool PostTaskAndReplyImpl::PostTaskAndReply(
|
| DCHECK(!reply.is_null()) << from_here.ToString();
|
| PostTaskAndReplyRelay* relay =
|
| new PostTaskAndReplyRelay(from_here, task, reply);
|
| + // PostTaskAndReplyRelay self-destructs after executing |reply|. On the flip
|
| + // side though, it is intentionally leaked if the |task| doesn't complete
|
| + // before the origin sequence stops executing tasks. Annotate |relay| as leaky
|
| + // to avoid having to suppress every callsite which happens to flakily trigger
|
| + // this race.
|
| + ANNOTATE_LEAKING_OBJECT_PTR(relay);
|
| if (!PostTask(from_here, Bind(&PostTaskAndReplyRelay::RunTaskAndPostReply,
|
| Unretained(relay)))) {
|
| delete relay;
|
|
|