tools: fix some leaks

This commit is contained in:
Wim Taymans 2020-06-04 12:35:16 +02:00
parent 0ee7d8119c
commit 30571d4706
2 changed files with 32 additions and 1 deletions

View file

@ -433,6 +433,7 @@ static void on_core_destroy(void *_data)
pw_map_remove(&data->vars, rd->id); pw_map_remove(&data->vars, rd->id);
pw_map_for_each(&rd->globals, destroy_global, rd); pw_map_for_each(&rd->globals, destroy_global, rd);
pw_map_clear(&rd->globals);
if (data->current == rd) if (data->current == rd)
data->current = NULL; data->current = NULL;
@ -444,6 +445,12 @@ static const struct pw_proxy_events proxy_core_events = {
.destroy = on_core_destroy, .destroy = on_core_destroy,
}; };
static void remote_data_free(struct remote_data *rd)
{
pw_proxy_destroy((struct pw_proxy*)rd->registry);
pw_core_disconnect(rd->core);
}
static bool do_connect(struct data *data, const char *cmd, char *args, char **error) static bool do_connect(struct data *data, const char *cmd, char *args, char **error)
{ {
char *a[1]; char *a[1];
@ -504,7 +511,8 @@ static bool do_disconnect(struct data *data, const char *cmd, char *args, char *
goto no_remote; goto no_remote;
} }
pw_core_disconnect(rd->core); if (rd)
remote_data_free(rd);
if (data->current == NULL) { if (data->current == NULL) {
if (spa_list_is_empty(&data->remotes)) { if (spa_list_is_empty(&data->remotes)) {
@ -1090,6 +1098,13 @@ static const struct pw_endpoint_stream_events endpoint_stream_events = {
.param = event_param .param = event_param
}; };
static void
removed_proxy (void *data)
{
struct proxy_data *pd = data;
pw_proxy_destroy(pd->proxy);
}
static void static void
destroy_proxy (void *data) destroy_proxy (void *data)
{ {
@ -1108,6 +1123,7 @@ destroy_proxy (void *data)
static const struct pw_proxy_events proxy_events = { static const struct pw_proxy_events proxy_events = {
PW_VERSION_PROXY_EVENTS, PW_VERSION_PROXY_EVENTS,
.removed = removed_proxy,
.destroy = destroy_proxy, .destroy = destroy_proxy,
}; };
@ -2760,6 +2776,7 @@ int main(int argc, char *argv[])
char *opt_remote = NULL; char *opt_remote = NULL;
char *error; char *error;
bool daemon = false; bool daemon = false;
struct remote_data *rd;
static const struct option long_options[] = { static const struct option long_options[] = {
{ "help", no_argument, NULL, 'h' }, { "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, 'V' }, { "version", no_argument, NULL, 'V' },
@ -2847,9 +2864,13 @@ int main(int argc, char *argv[])
pw_main_loop_run(data.loop); pw_main_loop_run(data.loop);
} }
} }
spa_list_consume(rd, &data.remotes, link)
remote_data_free(rd);
pw_context_destroy(data.context); pw_context_destroy(data.context);
pw_main_loop_destroy(data.loop); pw_main_loop_destroy(data.loop);
pw_map_clear(&data.vars);
pw_deinit();
return 0; return 0;
} }

View file

@ -540,6 +540,13 @@ static const struct pw_device_events device_events = {
.param = event_param .param = event_param
}; };
static void
removed_proxy (void *data)
{
struct proxy_data *pd = data;
pw_proxy_destroy(pd->proxy);
}
static void static void
destroy_proxy (void *data) destroy_proxy (void *data)
{ {
@ -559,6 +566,7 @@ destroy_proxy (void *data)
static const struct pw_proxy_events proxy_events = { static const struct pw_proxy_events proxy_events = {
PW_VERSION_PROXY_EVENTS, PW_VERSION_PROXY_EVENTS,
.removed = removed_proxy,
.destroy = destroy_proxy, .destroy = destroy_proxy,
}; };
@ -764,8 +772,10 @@ int main(int argc, char *argv[])
pw_main_loop_run(data.loop); pw_main_loop_run(data.loop);
pw_proxy_destroy((struct pw_proxy*)data.registry);
pw_context_destroy(data.context); pw_context_destroy(data.context);
pw_main_loop_destroy(data.loop); pw_main_loop_destroy(data.loop);
pw_deinit();
return 0; return 0;
} }