Browse Source

sink must also be unlocked when peer address changes

pull/6/head
Richard Fuchs 12 years ago
parent
commit
3030324c0a
1 changed files with 17 additions and 2 deletions
  1. +17
    -2
      daemon/call.c

+ 17
- 2
daemon/call.c View File

@ -263,6 +263,7 @@ static const struct mediaproxy_srtp __mps_null = {
static void call_destroy(struct call *);
static void unkernelize(struct packet_stream *);
static void __stream_unkernelize(struct packet_stream *ps);
static void stream_unkernelize(struct packet_stream *ps);
@ -531,7 +532,8 @@ static int stream_packet(struct stream_fd *sfd, str *s, struct sockaddr_in6 *fsi
*sink = NULL,
*in_srtp, *out_srtp;
struct call_media *media;
int ret = 0, update = 0, stun_ret = 0, handler_ret = 0, muxed_rtcp = 0, rtcp = 0;
int ret = 0, update = 0, stun_ret = 0, handler_ret = 0, muxed_rtcp = 0, rtcp = 0,
unk = 0;
struct sockaddr_in6 sin6;
struct msghdr mh;
struct iovec iov;
@ -654,7 +656,7 @@ use_cand:
if (tmp && PS_ISSET(stream, MEDIA_HANDOVER)) {
/* out_lock remains locked */
ilog(LOG_INFO, "Peer address changed to %s", addr);
__stream_unkernelize(stream);
unk = 1;
goto update_addr;
}
@ -755,7 +757,13 @@ out:
ret = 1;
done:
if (unk)
__stream_unkernelize(stream);
mutex_unlock(&stream->in_lock);
if (unk) {
stream_unkernelize(stream->rtp_sink);
stream_unkernelize(stream->rtcp_sink);
}
rwlock_unlock_r(&call->master_lock);
return ret;
@ -2289,6 +2297,13 @@ static void __stream_unkernelize(struct packet_stream *ps) {
PS_CLEAR(ps, CONFIRMED);
PS_CLEAR(ps, HAS_HANDLER);
}
static void stream_unkernelize(struct packet_stream *ps) {
if (!ps)
return;
mutex_lock(&ps->in_lock);
__stream_unkernelize(ps);
mutex_unlock(&ps->in_lock);
}
/* must be called with call->master_lock held in W */
static void __monologue_unkernelize(struct call_monologue *monologue) {


Loading…
Cancel
Save