From 72c6bf1345235801dc8916a907360fd7e2514933 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 2 Sep 2016 15:58:15 +0200 Subject: m_config: add some convenience functions To be used by the following commits. --- options/m_config.c | 21 +++++++++++++++++++++ options/m_config.h | 14 ++++++++++++++ 2 files changed, 35 insertions(+) (limited to 'options') diff --git a/options/m_config.c b/options/m_config.c index 25b7d75c7f..19eb61d082 100644 --- a/options/m_config.c +++ b/options/m_config.c @@ -1143,6 +1143,27 @@ void m_config_notify_change_co(struct m_config *config, mp_msg_update_msglevels(config->global); } +void *mp_get_config_group(void *ta_parent, struct mpv_global *global, + const struct m_sub_options *group) +{ + assert(ta_parent); // without you'd necessarily leak memory + struct m_config_cache *cache = m_config_cache_alloc(ta_parent, global, group); + return cache->opts; +} + +void mp_read_option_raw(struct mpv_global *global, const char *name, + const struct m_option_type *type, void *dst) +{ + struct m_config_shadow *shadow = global->config; + struct m_config_option *co = m_config_get_co(shadow->root, bstr0(name)); + assert(co); + assert(co->shadow_offset >= 0); + assert(co->opt->type == type); + + memset(dst, 0, co->opt->type->size); + m_option_copy(co->opt, dst, shadow->data + co->shadow_offset); +} + struct m_config *mp_get_root_config(struct mpv_global *global) { return global->config->root; diff --git a/options/m_config.h b/options/m_config.h index 101565745f..e1fbb758b6 100644 --- a/options/m_config.h +++ b/options/m_config.h @@ -304,6 +304,20 @@ struct m_config_cache *m_config_cache_alloc(void *ta_parent, // data itself will (e.g. string options might be reallocated). bool m_config_cache_update(struct m_config_cache *cache); +// Like m_config_cache_alloc(), but return the struct (m_config_cache->opts) +// directly, with no way to update the config. +// Warning: does currently not set the child as its own talloc root, which +// means the only way to free the struct is by freeing ta_parent. +void *mp_get_config_group(void *ta_parent, struct mpv_global *global, + const struct m_sub_options *group); + + +// Read a single global option in a thread-safe way. For multiple options, +// use m_config_cache. The option must exist and match the provided type (the +// type is used as a sanity check only). Performs semi-expensive lookup. +void mp_read_option_raw(struct mpv_global *global, const char *name, + const struct m_option_type *type, void *dst); + struct m_config *mp_get_root_config(struct mpv_global *global); #endif /* MPLAYER_M_CONFIG_H */ -- cgit v1.2.3