diff --git a/modules/rtp_rtcp/source/rtcp_transceiver.cc b/modules/rtp_rtcp/source/rtcp_transceiver.cc index cec6da9f3b..cca32055a1 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver.cc +++ b/modules/rtp_rtcp/source/rtcp_transceiver.cc @@ -22,7 +22,10 @@ namespace webrtc { namespace { struct Destructor { - void operator()() { rtcp_transceiver = nullptr; } + void operator()() { + rtcp_transceiver->StopPeriodicTask(); + rtcp_transceiver = nullptr; + } std::unique_ptr rtcp_transceiver; }; } // namespace diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc b/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc index c6f8931075..dd895ad295 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc +++ b/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc @@ -97,13 +97,7 @@ RtcpTransceiverImpl::RtcpTransceiverImpl(const RtcpTransceiverConfig& config) } } -RtcpTransceiverImpl::~RtcpTransceiverImpl() { - // If RtcpTransceiverImpl is destroyed off task queue, assume it is destroyed - // after TaskQueue. In that case there is no need to Cancel periodic task. - if (config_.task_queue == rtc::TaskQueue::Current()) { - periodic_task_handle_.Stop(); - } -} +RtcpTransceiverImpl::~RtcpTransceiverImpl() = default; void RtcpTransceiverImpl::AddMediaReceiverRtcpObserver( uint32_t remote_ssrc, diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_impl.h b/modules/rtp_rtcp/source/rtcp_transceiver_impl.h index b08dd56b8b..083f77e379 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_impl.h +++ b/modules/rtp_rtcp/source/rtcp_transceiver_impl.h @@ -39,6 +39,8 @@ class RtcpTransceiverImpl { RtcpTransceiverImpl& operator=(const RtcpTransceiverImpl&) = delete; ~RtcpTransceiverImpl(); + void StopPeriodicTask() { periodic_task_handle_.Stop(); } + void AddMediaReceiverRtcpObserver(uint32_t remote_ssrc, MediaReceiverRtcpObserver* observer); void RemoveMediaReceiverRtcpObserver(uint32_t remote_ssrc, diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc b/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc index fec2bb770f..4f0d08eff2 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc +++ b/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc @@ -136,7 +136,7 @@ RtcpTransceiverConfig DefaultTestConfig() { return config; } -TEST(RtcpTransceiverImplTest, CanDestroyOnTaskQueue) { +TEST(RtcpTransceiverImplTest, NeedToStopPeriodicTaskToDestroyOnTaskQueue) { FakeRtcpTransport transport; rtc::TaskQueue queue("rtcp"); RtcpTransceiverConfig config = DefaultTestConfig(); @@ -149,6 +149,7 @@ TEST(RtcpTransceiverImplTest, CanDestroyOnTaskQueue) { rtc::Event done; queue.PostTask([rtcp_transceiver, &done] { + rtcp_transceiver->StopPeriodicTask(); delete rtcp_transceiver; done.Set(); }); @@ -188,6 +189,7 @@ TEST(RtcpTransceiverImplTest, DelaysSendingFirstCompondPacket) { // Cleanup. rtc::Event done; queue.PostTask([&] { + rtcp_transceiver->StopPeriodicTask(); rtcp_transceiver.reset(); done.Set(); }); @@ -221,6 +223,7 @@ TEST(RtcpTransceiverImplTest, PeriodicallySendsPackets) { // Cleanup. rtc::Event done; queue.PostTask([&] { + rtcp_transceiver->StopPeriodicTask(); rtcp_transceiver.reset(); done.Set(); }); @@ -266,6 +269,7 @@ TEST(RtcpTransceiverImplTest, SendCompoundPacketDelaysPeriodicSendPackets) { // Cleanup. rtc::Event done; queue.PostTask([&] { + rtcp_transceiver->StopPeriodicTask(); rtcp_transceiver.reset(); done.Set(); }); @@ -330,6 +334,7 @@ TEST(RtcpTransceiverImplTest, SendsPeriodicRtcpWhenNetworkStateIsUp) { // Cleanup. rtc::Event done; queue.PostTask([&] { + rtcp_transceiver->StopPeriodicTask(); rtcp_transceiver.reset(); done.Set(); });