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
This commit is contained in:
solenberg@webrtc.org 2014-01-29 11:21:58 +00:00
parent f7c6e743b3
commit 094ac39b5a

View File

@ -312,6 +312,8 @@ void Call::DestroyVideoReceiveStream(
receive_ssrcs_.begin();
while (it != receive_ssrcs_.end()) {
if (it->second == static_cast<VideoReceiveStream*>(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<uint32_t, VideoReceiveStream*>::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<uint32_t, VideoReceiveStream*>::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<const uint8_t*>(packet), length);
return it->second->DeliverRtp(static_cast<const uint8_t*>(packet), length);
}
bool Call::DeliverPacket(const uint8_t* packet, size_t length) {