From 772b1494a948ec1a2499e3320760eca40bf587a2 Mon Sep 17 00:00:00 2001 From: Markus Handell Date: Thu, 14 May 2020 14:23:21 +0200 Subject: [PATCH] MediaChannel: remove lock recursions. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change removes lock recursions and adds thread annotations. Bug: webrtc:11567 Change-Id: I2730e8159673e7a2802ab0525ebcf26be0e36fd7 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/175100 Reviewed-by: Erik Språng Commit-Queue: Markus Handell Cr-Commit-Position: refs/heads/master@{#31270} --- media/base/media_channel.h | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/media/base/media_channel.h b/media/base/media_channel.h index d71ec9158a..7f9009acd5 100644 --- a/media/base/media_channel.h +++ b/media/base/media_channel.h @@ -203,7 +203,8 @@ class MediaChannel : public sigslot::has_slots<> { // transport. virtual void SetInterface( NetworkInterface* iface, - const webrtc::MediaTransportConfig& media_transport_config); + const webrtc::MediaTransportConfig& media_transport_config) + RTC_LOCKS_EXCLUDED(network_interface_crit_); // Called when a RTP packet is received. virtual void OnPacketReceived(rtc::CopyOnWriteBuffer packet, int64_t packet_time_us) = 0; @@ -264,12 +265,9 @@ class MediaChannel : public sigslot::has_slots<> { int SetOption(NetworkInterface::SocketType type, rtc::Socket::Option opt, - int option) { + int option) RTC_LOCKS_EXCLUDED(network_interface_crit_) { rtc::CritScope cs(&network_interface_crit_); - if (!network_interface_) - return -1; - - return network_interface_->SetOption(type, opt, option); + return SetOptionLocked(type, opt, option); } const webrtc::MediaTransportConfig& media_transport_config() const { @@ -298,16 +296,27 @@ class MediaChannel : public sigslot::has_slots<> { rtc::scoped_refptr frame_transformer); protected: + int SetOptionLocked(NetworkInterface::SocketType type, + rtc::Socket::Option opt, + int option) + RTC_EXCLUSIVE_LOCKS_REQUIRED(network_interface_crit_) { + if (!network_interface_) + return -1; + return network_interface_->SetOption(type, opt, option); + } + bool DscpEnabled() const { return enable_dscp_; } // This is the DSCP value used for both RTP and RTCP channels if DSCP is // enabled. It can be changed at any time via |SetPreferredDscp|. - rtc::DiffServCodePoint PreferredDscp() const { + rtc::DiffServCodePoint PreferredDscp() const + RTC_LOCKS_EXCLUDED(network_interface_crit_) { rtc::CritScope cs(&network_interface_crit_); return preferred_dscp_; } - int SetPreferredDscp(rtc::DiffServCodePoint preferred_dscp) { + int SetPreferredDscp(rtc::DiffServCodePoint preferred_dscp) + RTC_LOCKS_EXCLUDED(network_interface_crit_) { rtc::CritScope cs(&network_interface_crit_); if (preferred_dscp == preferred_dscp_) { return 0; @@ -322,16 +331,19 @@ class MediaChannel : public sigslot::has_slots<> { int UpdateDscp() RTC_EXCLUSIVE_LOCKS_REQUIRED(network_interface_crit_) { rtc::DiffServCodePoint value = enable_dscp_ ? preferred_dscp_ : rtc::DSCP_DEFAULT; - int ret = SetOption(NetworkInterface::ST_RTP, rtc::Socket::OPT_DSCP, value); + int ret = + SetOptionLocked(NetworkInterface::ST_RTP, rtc::Socket::OPT_DSCP, value); if (ret == 0) { - ret = SetOption(NetworkInterface::ST_RTCP, rtc::Socket::OPT_DSCP, value); + ret = SetOptionLocked(NetworkInterface::ST_RTCP, rtc::Socket::OPT_DSCP, + value); } return ret; } bool DoSendPacket(rtc::CopyOnWriteBuffer* packet, bool rtcp, - const rtc::PacketOptions& options) { + const rtc::PacketOptions& options) + RTC_LOCKS_EXCLUDED(network_interface_crit_) { rtc::CritScope cs(&network_interface_crit_); if (!network_interface_) return false;