From fe18043c0a44707d3d3fb7685a4d081c42b2c150 Mon Sep 17 00:00:00 2001 From: Vitalii Aleksandrov Date: Tue, 16 Apr 2019 16:21:31 +0300 Subject: [PATCH] Insert streambuf object to listener->streams before adding it to poller --- daemon/tcp_listener.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/daemon/tcp_listener.c b/daemon/tcp_listener.c index e232f2bb8..96e09599c 100644 --- a/daemon/tcp_listener.c +++ b/daemon/tcp_listener.c @@ -172,19 +172,30 @@ static void streambuf_listener_newconn(struct obj *p, socket_t *newsock, char *a i.timer = streambuf_stream_timer; i.obj = &s->obj; - if (poller_add_item(listener->poller, &i)) - goto fail; - if (cb->newconn_func) cb->newconn_func(s); + obj_hold(s); + mutex_lock(&listener->lock); g_hash_table_insert(listener->streams, s, s); // hand over ref mutex_unlock(&listener->lock); + if (poller_add_item(listener->poller, &i)) + goto fail; + + obj_put(s); + return; fail: + mutex_lock(&listener->lock); + int ret = g_hash_table_remove(listener->streams, s); + mutex_unlock(&listener->lock); + + if (ret) + obj_put(s); + obj_put(s); }