From: Jaroslav Kysela Date: Mon, 4 Jan 2016 21:07:08 +0000 (+0100) Subject: tcp server: the tcp_server_delete() must be in sync with poll X-Git-Tag: v4.2.1~1224 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2d9ff18b4d757e31310fe946c78ae0a977093c07;p=thirdparty%2Ftvheadend.git tcp server: the tcp_server_delete() must be in sync with poll --- diff --git a/src/tcp.c b/src/tcp.c index 87546b48c..2b052edc9 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -453,6 +453,7 @@ typedef struct tcp_server { struct sockaddr_storage bound; tcp_server_ops_t ops; void *opaque; + LIST_ENTRY(tcp_server) link; } tcp_server_t; typedef struct tcp_server_launch { @@ -471,6 +472,7 @@ typedef struct tcp_server_launch { LIST_ENTRY(tcp_server_launch) jlink; } tcp_server_launch_t; +static LIST_HEAD(, tcp_server) tcp_server_delete_list = { 0 }; static LIST_HEAD(, tcp_server_launch) tcp_server_launches = { 0 }; static LIST_HEAD(, tcp_server_launch) tcp_server_active = { 0 }; static LIST_HEAD(, tcp_server_launch) tcp_server_join = { 0 }; @@ -685,6 +687,10 @@ next: free(tsl); goto next; } + while ((ts = LIST_FIRST(&tcp_server_delete_list)) != NULL) { + LIST_REMOVE(ts, link); + free(ts); + } pthread_mutex_unlock(&global_lock); } continue; @@ -919,6 +925,7 @@ tcp_server_delete(void *server) { tcp_server_t *ts = server; tvhpoll_event_t ev; + char c = 'D'; if (server == NULL) return; @@ -927,8 +934,9 @@ tcp_server_delete(void *server) ev.fd = ts->serverfd; ev.events = TVHPOLL_IN; ev.data.ptr = ts; - tvhpoll_rem(tcp_server_poll, &ev, 1); - free(ts); + tvhpoll_rem(tcp_server_poll, &ev, 1); + LIST_INSERT_HEAD(&tcp_server_delete_list, ts, link); + tvh_write(tcp_server_pipe.wr, &c, 1); } /** @@ -1081,6 +1089,7 @@ tcp_server_init(void) void tcp_server_done(void) { + tcp_server_t *ts; tcp_server_launch_t *tsl; char c = 'E'; int64_t t; @@ -1117,5 +1126,9 @@ tcp_server_done(void) free(tsl); pthread_mutex_lock(&global_lock); } + while ((ts = LIST_FIRST(&tcp_server_delete_list)) != NULL) { + LIST_REMOVE(ts, link); + free(ts); + } pthread_mutex_unlock(&global_lock); }