From 094ac39b5a5203fcdd83294e1088893131f99db9 Mon Sep 17 00:00:00 2001 From: "solenberg@webrtc.org" Date: Wed, 29 Jan 2014 11:21:58 +0000 Subject: [PATCH] Fix race when deleting video receive streams in Call. BUG= R=mflodman@webrtc.org, pbos@webrtc.org Review URL: https://webrtc-codereview.appspot.com/6889004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5457 4adac7df-926f-26a2-2b94-8c16560cd09d --- webrtc/video/call.cc | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/webrtc/video/call.cc b/webrtc/video/call.cc index ff7a05f36d..10dcf14b89 100644 --- a/webrtc/video/call.cc +++ b/webrtc/video/call.cc @@ -312,6 +312,8 @@ void Call::DestroyVideoReceiveStream( receive_ssrcs_.begin(); while (it != receive_ssrcs_.end()) { if (it->second == static_cast(receive_stream)) { + assert(receive_stream_impl == NULL || + receive_stream_impl == it->second); receive_stream_impl = it->second; receive_ssrcs_.erase(it++); } else { @@ -365,19 +367,14 @@ bool Call::DeliverRtcp(const uint8_t* packet, size_t length) { bool Call::DeliverRtp(const RTPHeader& header, const uint8_t* packet, size_t length) { - VideoReceiveStream* receiver; - { - ReadLockScoped read_lock(*receive_lock_); - std::map::iterator it = - receive_ssrcs_.find(header.ssrc); - if (it == receive_ssrcs_.end()) { - // TODO(pbos): Log some warning, SSRC without receiver. - return false; - } - - receiver = it->second; + ReadLockScoped read_lock(*receive_lock_); + std::map::iterator it = + receive_ssrcs_.find(header.ssrc); + if (it == receive_ssrcs_.end()) { + // TODO(pbos): Log some warning, SSRC without receiver. + return false; } - return receiver->DeliverRtp(static_cast(packet), length); + return it->second->DeliverRtp(static_cast(packet), length); } bool Call::DeliverPacket(const uint8_t* packet, size_t length) {