[vlc-commits] cli: add a list of clients
Rémi Denis-Courmont
git at videolan.org
Sun Nov 29 14:55:56 CET 2020
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Nov 29 10:47:12 2020 +0200| [5b663927c28ac5e605836474c002b4e3b913c015] | committer: Rémi Denis-Courmont
cli: add a list of clients
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5b663927c28ac5e605836474c002b4e3b913c015
---
modules/control/cli/cli.c | 56 ++++++++++++++++++++++++++++++-----------------
modules/control/cli/cli.h | 2 ++
2 files changed, 38 insertions(+), 20 deletions(-)
diff --git a/modules/control/cli/cli.c b/modules/control/cli/cli.c
index d8237423e3..b66a860116 100644
--- a/modules/control/cli/cli.c
+++ b/modules/control/cli/cli.c
@@ -70,6 +70,8 @@ struct intf_sys_t
void *player_cli;
#ifndef _WIN32
+ vlc_mutex_t clients_lock;
+ struct vlc_list clients;
struct cli_client client;
char *psz_unix_path;
#else
@@ -399,11 +401,15 @@ int cli_printf(struct cli_client *cl, const char *fmt, ...)
return len;
}
-static void msg_vprint(intf_thread_t *p_intf, const char *psz_fmt, va_list args)
+static void msg_vprint(intf_thread_t *p_intf, const char *fmt, va_list args)
{
intf_sys_t *sys = p_intf->p_sys;
+ struct cli_client *cl;
- cli_vprintf(&sys->client, psz_fmt, args);
+ vlc_mutex_lock(&sys->clients_lock);
+ vlc_list_foreach (cl, &sys->clients, node)
+ cli_vprintf(cl, fmt, args);
+ vlc_mutex_unlock(&sys->clients_lock);
}
void msg_print(intf_thread_t *intf, const char *fmt, ...)
@@ -453,7 +459,7 @@ static void *Run(void *data)
{
struct cli_client *cl = &sys->client;
- while (cl->stream == NULL)
+ while (vlc_list_is_empty(&sys->clients))
{
assert(sys->pi_socket_listen != NULL);
@@ -467,10 +473,12 @@ static void *Run(void *data)
cl->stream = fdopen(fd, "r");
if (cl->stream != NULL)
{
- vlc_mutex_lock(&cl->output_lock);
cl->fd = fd;
- vlc_mutex_unlock(&cl->output_lock);
cl->intf = intf;
+ vlc_mutex_init(&cl->output_lock);
+ vlc_mutex_lock(&sys->clients_lock);
+ vlc_list_append(&cl->node, &sys->clients);
+ vlc_mutex_unlock(&sys->clients_lock);
}
else
vlc_close(fd);
@@ -478,6 +486,9 @@ static void *Run(void *data)
}
cli_client_thread(cl);
+ vlc_mutex_lock(&sys->clients_lock);
+ vlc_list_remove(&cl->node);
+ vlc_mutex_unlock(&sys->clients_lock);
if (sys->pi_socket_listen == NULL)
break;
@@ -868,21 +879,8 @@ static int Activate( vlc_object_t *p_this )
setvbuf( stdout, (char *)NULL, _IOLBF, 0 );
#ifndef _WIN32
- struct cli_client *cl = &p_sys->client;
-
- vlc_mutex_init(&cl->output_lock);
-
- if (pi_socket == NULL)
- {
- cl->stream = stdin;
- cl->fd = 1;
- cl->intf = p_intf;
- }
- else
- {
- cl->stream = NULL;
- cl->fd = -1;
- }
+ vlc_mutex_init(&p_sys->clients_lock);
+ vlc_list_init(&p_sys->clients);
p_sys->psz_unix_path = psz_unix_path;
#else
p_sys->i_socket = -1;
@@ -901,6 +899,24 @@ static int Activate( vlc_object_t *p_this )
RegisterPlaylist(p_intf);
+#ifndef _WIN32
+ struct cli_client *cl = &p_sys->client;
+
+ if (pi_socket == NULL)
+ {
+ cl->stream = stdin;
+ cl->fd = 1;
+ cl->intf = p_intf;
+ vlc_mutex_init(&cl->output_lock);
+ vlc_list_append(&cl->node, &p_sys->clients);
+ }
+ else
+ {
+ cl->stream = NULL;
+ cl->fd = -1;
+ }
+#endif
+
if( vlc_clone( &p_sys->thread, Run, p_intf, VLC_THREAD_PRIORITY_LOW ) )
goto error;
diff --git a/modules/control/cli/cli.h b/modules/control/cli/cli.h
index 0f884f645e..6b6ae12e7e 100644
--- a/modules/control/cli/cli.h
+++ b/modules/control/cli/cli.h
@@ -23,6 +23,7 @@
#include <stdio.h>
#include <vlc_common.h>
+#include <vlc_list.h>
struct cli_client
{
@@ -31,6 +32,7 @@ struct cli_client
FILE *stream;
int fd;
vlc_mutex_t output_lock;
+ struct vlc_list node;
#endif
};
More information about the vlc-commits
mailing list