diff --git a/tools/valgrind-webrtc/tsan/suppressions.txt b/tools/valgrind-webrtc/tsan/suppressions.txt index a8b0d8a425..f45bfeae92 100644 --- a/tools/valgrind-webrtc/tsan/suppressions.txt +++ b/tools/valgrind-webrtc/tsan/suppressions.txt @@ -16,29 +16,6 @@ fun:webrtc::Trace::SetTraceCallback ... } -{ - BUG_2349 - ThreadSanitizer:Race - fun:webrtc::RTPSender::SendToNetwork - fun:webrtc::RTPSenderVideo::SendVideoPacket - ... - fun:webrtc::RTPSenderVideo::SendVideo - fun:webrtc::RTPSender::SendOutgoingData - fun:webrtc::ModuleRtpRtcpImpl::SendOutgoingData - fun:webrtc::ModuleRtpRtcpImpl::SendOutgoingData - fun:webrtc::ViEEncoder::SendData - fun:webrtc::VCMEncodedFrameCallback::Encoded - fun:webrtc::test::FakeEncoder::Encode - fun:webrtc::VCMGenericEncoder::Encode - fun:webrtc::VideoCodingModuleImpl::AddVideoFrame - fun:webrtc::ViEEncoder::DeliverFrame - fun:webrtc::ViEFrameProviderBase::DeliverFrame - fun:webrtc::ViECapturer::DeliverI420Frame - fun:webrtc::ViECapturer::ViECaptureProcess - fun:webrtc::ViECapturer::ViECaptureThreadFunction - fun:webrtc::ThreadPosix::Run - fun:StartThread -} # Known bugs we don't care about / problems in third parties { diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc index 88b7d9ba5f..d4980f2ead 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc @@ -56,6 +56,7 @@ RTPSender::RTPSender(const int32_t id, const bool audio, Clock *clock, nack_byte_count_times_(), nack_byte_count_(), nack_bitrate_(clock), packet_history_(new RTPPacketHistory(clock)), // Statistics + statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()), packets_sent_(0), payload_bytes_sent_(0), start_time_stamp_forced_(false), start_time_stamp_(0), ssrc_db_(*SSRCDatabase::GetSSRCDatabase()), remote_ssrc_(0), sequence_number_forced_(false), ssrc_forced_(false), @@ -546,9 +547,9 @@ int32_t RTPSender::ReSendPacket(uint16_t packet_id, uint32_t min_resend_time) { { // Update send statistics prior to pacer. - CriticalSectionScoped cs(send_critsect_); + CriticalSectionScoped lock(statistics_crit_.get()); Bitrate::Update(length); - packets_sent_++; + ++packets_sent_; // We on purpose don't add to payload_bytes_sent_ since this is a // re-transmit and not new payload data. } @@ -807,7 +808,7 @@ int32_t RTPSender::SendToNetwork( } { // Update send statistics prior to pacer. - CriticalSectionScoped cs(send_critsect_); + CriticalSectionScoped lock(statistics_crit_.get()); Bitrate::Update(payload_length + rtp_header_length); ++packets_sent_; payload_bytes_sent_ += payload_length; @@ -858,18 +859,19 @@ uint16_t RTPSender::IncrementSequenceNumber() { } void RTPSender::ResetDataCounters() { + CriticalSectionScoped lock(statistics_crit_.get()); packets_sent_ = 0; payload_bytes_sent_ = 0; } uint32_t RTPSender::Packets() const { - // Don't use critsect to avoid potential deadlock. + CriticalSectionScoped lock(statistics_crit_.get()); return packets_sent_; } // Number of sent RTP bytes. -// Don't use critsect to avoid potental deadlock. uint32_t RTPSender::Bytes() const { + CriticalSectionScoped lock(statistics_crit_.get()); return payload_bytes_sent_; } diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.h b/webrtc/modules/rtp_rtcp/source/rtp_sender.h index 46b2a3da98..e0ead82225 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_sender.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.h @@ -314,6 +314,7 @@ class RTPSender : public Bitrate, public RTPSenderInterface { RTPPacketHistory *packet_history_; // Statistics + scoped_ptr statistics_crit_; uint32_t packets_sent_; uint32_t payload_bytes_sent_;