From: Byron Campen Date: Thu, 20 Jul 2023 14:24:00 +0000 Subject: Bug 1838080: Ensure that last ref to transformation_queue_ is not released on itself. r=pehrsons,webrtc-reviewers Differential Revision: https://phabricator.services.mozilla.com/D181699 Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/91d9e8b6a5c430a73561ffd2330865f04fcb1a6d --- .../rtp_sender_video_frame_transformer_delegate.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc index f24c91ae35..9d7c58d19a 100644 --- a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc +++ b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc @@ -18,6 +18,7 @@ #include "api/task_queue/task_queue_factory.h" #include "modules/rtp_rtcp/source/rtp_descriptor_authentication.h" #include "rtc_base/checks.h" +#include "rtc_base/event.h" namespace webrtc { namespace { @@ -232,6 +233,14 @@ void RTPSenderVideoFrameTransformerDelegate::Reset() { MutexLock lock(&sender_lock_); sender_ = nullptr; } + // Wait until all pending tasks are executed, to ensure that the last ref + // standing is not on the transformation queue. + rtc::Event flush; + transformation_queue_->PostTask([this, &flush]() { + RTC_DCHECK_RUN_ON(transformation_queue_.get()); + flush.Set(); + }); + flush.Wait(rtc::Event::kForever); } std::unique_ptr CloneSenderVideoFrame(