diff options
author | wm4 <wm4@nowhere> | 2018-01-16 11:35:37 +0100 |
---|---|---|
committer | Kevin Mitchell <kevmitch@gmail.com> | 2018-01-18 00:59:07 -0800 |
commit | 1d3b680427a4a08d8e3df212eef74751fa56694e (patch) | |
tree | f61438a04528fb973e239c8354293e5f79097c16 /options/m_config.c | |
parent | cc3cdcb0f065eb0166acc664bb3c743c4bcd246b (diff) | |
download | mpv-1d3b680427a4a08d8e3df212eef74751fa56694e.tar.bz2 mpv-1d3b680427a4a08d8e3df212eef74751fa56694e.tar.xz |
options: simplify mp_get_config_group() memory management
There is some craziness here: the function allocates m_config_cache,
which in turn allocates the actual option struct, which is what the
function returns. The user would expect to be able to use talloc_free()
to deallocate everything. Of course this didn't work, because the
returned pointer is not the root parent in the talloc tree.
But with some additional talloc craziness, this can be fixed. We
rearrange the parent pointers such that freeing the option struct will
free m_config_cache first, which uninits the contents in the option
struct, but fortunately not the option struct itself.
This change should simplify API use on the caller side, and reduce
surprises.
Diffstat (limited to 'options/m_config.c')
-rw-r--r-- | options/m_config.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/options/m_config.c b/options/m_config.c index 606e836d20..7237972660 100644 --- a/options/m_config.c +++ b/options/m_config.c @@ -1437,8 +1437,10 @@ bool m_config_is_in_group(struct m_config *config, 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); + struct m_config_cache *cache = m_config_cache_alloc(NULL, global, group); + // Make talloc_free(cache->opts) free the entire cache. + ta_set_parent(cache->opts, ta_parent); + ta_set_parent(cache, cache->opts); return cache->opts; } |