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; |