Browse Source

here we go with the subtle race conditions

git.mgm/mediaproxy-ng/2.1
Richard Fuchs 14 years ago
parent
commit
683b716885
1 changed files with 19 additions and 9 deletions
  1. +19
    -9
      daemon/control.c

+ 19
- 9
daemon/control.c View File

@ -29,6 +29,7 @@ struct control_stream {
struct control *control;
struct poller *poller;
int linked:1;
};
@ -52,22 +53,28 @@ struct control {
static void control_stream_closed(int fd, void *p, uintptr_t u) {
struct control_stream *s = p;
struct control *c;
GList *l;
GList *l = NULL;
mylog(LOG_INFO, "Control connection from " DF " closed", DP(s->inaddr));
c = s->control;
restart:
mutex_lock(&c->lock);
l = g_list_find(c->streams, s);
if (l)
if (s->linked) {
/* we might get called when it's not quite linked yet */
l = g_list_find(c->streams, s);
if (!l) {
mutex_unlock(&c->lock);
goto restart;
}
c->streams = g_list_delete_link(c->streams, l);
s->linked = 0;
}
mutex_unlock(&c->lock);
if (!l)
return;
obj_put(s);
if (poller_del_item(s->poller, fd))
abort();
if (l)
obj_put(s);
poller_del_item(s->poller, fd);
}
@ -78,7 +85,9 @@ static void control_list(struct control *c, struct control_stream *s) {
mutex_lock(&c->lock);
for (l = c->streams; l; l = l->next) {
i = l->data;
mutex_lock(&s->lock);
streambuf_printf(s->outbuf, DF "\n", DP(i->inaddr));
mutex_unlock(&s->lock);
}
mutex_unlock(&c->lock);
@ -113,7 +122,7 @@ static int control_stream_parse(struct control_stream *s, char *line) {
else if (!strcmp(out[RE_TCP_DIV_CMD], "status"))
calls_status(c->callmaster, s);
else if (!strcmp(out[RE_TCP_DIV_CMD], "build") | !strcmp(out[RE_TCP_DIV_CMD], "version"))
streambuf_printf(s->outbuf, "Version: %s\n", MEDIAPROXY_VERSION);
control_stream_printf(s, "Version: %s\n", MEDIAPROXY_VERSION);
else if (!strcmp(out[RE_TCP_DIV_CMD], "controls"))
control_list(c, s);
else if (!strcmp(out[RE_TCP_DIV_CMD], "quit") || !strcmp(out[RE_TCP_DIV_CMD], "exit"))
@ -226,6 +235,7 @@ next:
s->outbuf = streambuf_new(c->poller, nfd);
memcpy(&s->inaddr, &sin, sizeof(s->inaddr));
mutex_init(&s->lock);
s->linked = 1;
ZERO(i);
i.fd = nfd;


Loading…
Cancel
Save