Browse Source

another locking fix

git.mgm/mediaproxy-ng/2.1
Richard Fuchs 13 years ago
parent
commit
8092a56761
1 changed files with 11 additions and 7 deletions
  1. +11
    -7
      daemon/call.c

+ 11
- 7
daemon/call.c View File

@ -196,6 +196,7 @@ void kernelize(struct callstream *c) {
/* called with r->up (== cs) locked */
static int stream_packet(struct streamrelay *r, char *b, int l, struct sockaddr_in6 *fsin) { static int stream_packet(struct streamrelay *r, char *b, int l, struct sockaddr_in6 *fsin) {
struct streamrelay *p, *p2; struct streamrelay *p, *p2;
struct peer *pe, *pe2; struct peer *pe, *pe2;
@ -222,13 +223,10 @@ static int stream_packet(struct streamrelay *r, char *b, int l, struct sockaddr_
m = c->callmaster; m = c->callmaster;
smart_ntop_p(addr, &fsin->sin6_addr, sizeof(addr)); smart_ntop_p(addr, &fsin->sin6_addr, sizeof(addr));
mutex_lock(&cs->lock);
if (p->fd == -1) { if (p->fd == -1) {
mylog(LOG_WARNING, LOG_PREFIX_C "RTP packet to port %u discarded from %s:%u", mylog(LOG_WARNING, LOG_PREFIX_C "RTP packet to port %u discarded from %s:%u",
LOG_PARAMS_C(c), r->localport, addr, ntohs(fsin->sin6_port)); LOG_PARAMS_C(c), r->localport, addr, ntohs(fsin->sin6_port));
r->stats.errors++; r->stats.errors++;
mutex_unlock(&cs->lock);
mutex_lock(&m->statspslock); mutex_lock(&m->statspslock);
m->statsps.errors++; m->statsps.errors++;
mutex_unlock(&m->statspslock); mutex_unlock(&m->statspslock);
@ -350,7 +348,6 @@ drop:
r->stats.packets++; r->stats.packets++;
r->stats.bytes += l; r->stats.bytes += l;
r->last = poller_now; r->last = poller_now;
mutex_unlock(&cs->lock);
mutex_lock(&m->statspslock); mutex_lock(&m->statspslock);
m->statsps.packets++; m->statsps.packets++;
m->statsps.bytes += l; m->statsps.bytes += l;
@ -377,8 +374,10 @@ static void stream_readable(int fd, void *p, uintptr_t u) {
unsigned int sinlen; unsigned int sinlen;
void *sinp; void *sinp;
mutex_lock(&cs->lock);
r = &cs->peers[u >> 1].rtps[u & 1]; r = &cs->peers[u >> 1].rtps[u & 1];
assert(r->fd == fd);
if (r->fd != fd)
goto out;
for (;;) { for (;;) {
sinlen = sizeof(ss); sinlen = sizeof(ss);
@ -389,8 +388,9 @@ static void stream_readable(int fd, void *p, uintptr_t u) {
continue; continue;
if (errno == EAGAIN || errno == EWOULDBLOCK) if (errno == EAGAIN || errno == EWOULDBLOCK)
break; break;
mutex_unlock(&cs->lock);
stream_closed(fd, r, 0); stream_closed(fd, r, 0);
break;
return;
} }
if (ret >= sizeof(buf)) if (ret >= sizeof(buf))
mylog(LOG_WARNING, "UDP packet possibly truncated"); mylog(LOG_WARNING, "UDP packet possibly truncated");
@ -410,10 +410,14 @@ static void stream_readable(int fd, void *p, uintptr_t u) {
if (stream_packet(r, buf, ret, sinp)) { if (stream_packet(r, buf, ret, sinp)) {
mylog(LOG_WARNING, "Write error on RTP socket"); mylog(LOG_WARNING, "Write error on RTP socket");
call_destroy(r->up->up->call);
mutex_unlock(&cs->lock);
call_destroy(cs->call);
return; return;
} }
} }
out:
mutex_unlock(&cs->lock);
} }


Loading…
Cancel
Save