vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Nov 29 15:33:39 2020 +0200| [9095693cd4640b626cb3d7755a39ea609193fd6d] | committer: Rémi Denis-Courmont
cli: don't wait for exit to reap dead clients > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9095693cd4640b626cb3d7755a39ea609193fd6d --- modules/control/cli/cli.c | 15 ++++++++++++++- modules/control/cli/cli.h | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/modules/control/cli/cli.c b/modules/control/cli/cli.c index b71ff46a02..9c93a26f9a 100644 --- a/modules/control/cli/cli.c +++ b/modules/control/cli/cli.c @@ -442,6 +442,7 @@ static void *cli_client_thread(void *data) vlc_restorecancel(canc); } + atomic_store_explicit(&cl->zombie, true, memory_order_release); return NULL; } @@ -454,6 +455,7 @@ static struct cli_client *cli_client_new(intf_thread_t *intf, int fd, cl->stream = stream; cl->fd = fd; + atomic_init(&cl->zombie, false); cl->intf = intf; vlc_mutex_init(&cl->output_lock); @@ -520,7 +522,6 @@ static void *Run(void *data) int canc = vlc_savecancel(); struct cli_client *cl = cli_client_new_fd(intf, fd); - vlc_restorecancel(canc); if (cl != NULL) { @@ -528,6 +529,18 @@ static void *Run(void *data) vlc_list_append(&cl->node, &sys->clients); vlc_mutex_unlock(&sys->clients_lock); } + + /* Reap any dead client */ + vlc_list_foreach (cl, &sys->clients, node) + if (atomic_load_explicit(&cl->zombie, memory_order_acquire)) + { + vlc_mutex_lock(&sys->clients_lock); + vlc_list_remove(&cl->node); + vlc_mutex_unlock(&sys->clients_lock); + cli_client_delete(cl); + } + + vlc_restorecancel(canc); } } diff --git a/modules/control/cli/cli.h b/modules/control/cli/cli.h index 162c8c23cd..d1dde7b9c1 100644 --- a/modules/control/cli/cli.h +++ b/modules/control/cli/cli.h @@ -21,6 +21,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#include <stdatomic.h> #include <stdio.h> #include <vlc_common.h> #include <vlc_list.h> @@ -31,6 +32,7 @@ struct cli_client #ifndef _WIN32 FILE *stream; int fd; + atomic_bool zombie; vlc_mutex_t output_lock; struct vlc_list node; vlc_thread_t thread; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
