Ensure task queues delete closures in task queue context.
Bug: webrtc:14449
Change-Id: I90d09d35398c1f8817701662f51cbc6a684a2fe0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/275773
Commit-Queue: Markus Handell <handellm@webrtc.org>
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38917}
diff --git a/rtc_base/task_queue_libevent.cc b/rtc_base/task_queue_libevent.cc
index f50e5a6..63633b5 100644
--- a/rtc_base/task_queue_libevent.cc
+++ b/rtc_base/task_queue_libevent.cc
@@ -166,10 +166,20 @@
CurrentTaskQueueSetter set_current(this);
while (is_active_)
event_base_loop(event_base_, 0);
- }
+ // Ensure remaining deleted tasks are destroyed with Current() set up
+ // to this task queue.
+ absl::InlinedVector<absl::AnyInvocable<void() &&>, 4> pending;
+ MutexLock lock(&pending_lock_);
+ pending_.swap(pending);
+ }
for (TimerEvent* timer : pending_timers_)
delete timer;
+
+#if RTC_DCHECK_IS_ON
+ MutexLock lock(&pending_lock_);
+ RTC_DCHECK(pending_.empty());
+#endif
},
queue_name, rtc::ThreadAttributes().SetPriority(priority));
}