context: clean up the settings object as well

This commit is contained in:
Wim Taymans 2021-06-18 15:25:49 +02:00
parent 1662e3834f
commit 4518eded5b
4 changed files with 26 additions and 9 deletions

View file

@ -462,6 +462,8 @@ void pw_context_destroy(struct pw_context *context)
pw_properties_free(context->properties);
pw_properties_free(context->conf);
pw_settings_clean(context);
if (impl->dbus_handle)
pw_unload_spa_handle(impl->dbus_handle);

View file

@ -102,8 +102,8 @@ static void core_event_add_mem(void *data, uint32_t id, uint32_t type, int fd, u
m = pw_mempool_import(this->pool, flags, type, fd);
if (m->id != id) {
pw_log_error(NAME" %p: invalid mem id %u, expected %u",
this, id, m->id);
pw_log_error(NAME" %p: invalid mem id %u, fd:%d expected %u",
this, id, fd, m->id);
pw_proxy_errorf(&this->proxy, -EINVAL, "invalid mem id %u, expected %u", id, m->id);
pw_memblock_unref(m);
}

View file

@ -410,6 +410,8 @@ struct pw_context {
struct settings defaults; /**< default parameters */
struct settings settings; /**< current parameters */
void *settings_impl; /**< settings metadata */
struct pw_mempool *pool; /**< global memory pool */
struct pw_map globals; /**< map of globals */
@ -1242,6 +1244,7 @@ void pw_log_log_object(enum spa_log_level level, const char *file, int line,
bool pw_log_is_default(void);
int pw_settings_init(struct pw_context *context);
void pw_settings_clean(struct pw_context *context);
/** \endcond */

View file

@ -114,18 +114,18 @@ static void init_defaults(struct impl *impl)
PW_ID_CORE, "clock.force-rate", "", "%d", s->clock_force_rate);
}
int pw_settings_init(struct pw_context *context)
{
struct impl *impl;
int res;
impl = calloc(1, sizeof(*impl));
if (impl == NULL)
goto error_errno;
return -errno;
impl->context = context;
impl->metadata = pw_context_create_metadata(context, "settings", NULL, 0);
if (impl->metadata == NULL)
goto error_free;
init_defaults(impl);
@ -135,12 +135,24 @@ int pw_settings_init(struct pw_context *context)
pw_impl_metadata_register(impl->metadata, NULL);
context->settings_impl = impl;
return 0;
error_errno:
res = -errno;
goto error_free;
error_free:
free(impl);
return res;
return -errno;
}
void pw_settings_clean(struct pw_context *context)
{
struct impl *impl = context->settings_impl;
if (impl == NULL)
return;
context->settings_impl = NULL;
if (impl->metadata != NULL)
pw_impl_metadata_destroy(impl->metadata);
free(impl);
}