mirror of
https://github.com/mpv-player/mpv
synced 2025-01-13 02:16:40 +00:00
m_config: remove alias information
We don't need to store anymore whether an option is aliased by another option (which is what the alias_owner member did). Also, that member had a really bad name. This also removes some unneeded code from config_destroy(). Calling m_option_free() is always ok; this just skipped the call if it did nothing. In particular, it's ok to call m_option_free() on the same pointer multiple times. (Maybe that function is misnamed, and it should be m_option_clear().)
This commit is contained in:
parent
0656411e97
commit
a8a0c5023b
@ -184,13 +184,8 @@ static int config_destroy(void *p)
|
|||||||
struct m_config *config = p;
|
struct m_config *config = p;
|
||||||
if (config->file_local_mode)
|
if (config->file_local_mode)
|
||||||
m_config_leave_file_local(config);
|
m_config_leave_file_local(config);
|
||||||
for (struct m_config_option *copt = config->opts; copt; copt = copt->next) {
|
for (struct m_config_option *copt = config->opts; copt; copt = copt->next)
|
||||||
if (copt->alias_owner)
|
m_option_free(copt->opt, copt->data);
|
||||||
continue;
|
|
||||||
if (copt->opt->type->flags & M_OPT_TYPE_DYNAMIC) {
|
|
||||||
m_option_free(copt->opt, copt->data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -422,19 +417,8 @@ static struct m_config_option *m_config_add_option(struct m_config *config,
|
|||||||
add_options(config, co, sub);
|
add_options(config, co, sub);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Check if there is already an option pointing to this address
|
// Initialize options
|
||||||
if (co->data) {
|
if (co->data) {
|
||||||
for (struct m_config_option *i = config->opts; i; i = i->next) {
|
|
||||||
if (co->data == i->data) {
|
|
||||||
// So we don't save the same vars more than 1 time
|
|
||||||
co->alias_owner = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (co->alias_owner) {
|
|
||||||
assert(!arg->defval);
|
|
||||||
} else {
|
|
||||||
if (arg->defval) {
|
if (arg->defval) {
|
||||||
// Target data in optstruct is supposed to be cleared (consider
|
// Target data in optstruct is supposed to be cleared (consider
|
||||||
// m_option freeing previously set dynamic data).
|
// m_option freeing previously set dynamic data).
|
||||||
@ -444,7 +428,15 @@ static struct m_config_option *m_config_add_option(struct m_config *config,
|
|||||||
// string options): copy the option into temporary memory,
|
// string options): copy the option into temporary memory,
|
||||||
// clear the original option (to stop m_option from freeing the
|
// clear the original option (to stop m_option from freeing the
|
||||||
// static data), copy it back.
|
// static data), copy it back.
|
||||||
if (co->data) {
|
// This would leak memory when done on aliased options.
|
||||||
|
bool aliased = false;
|
||||||
|
for (struct m_config_option *i = config->opts; i; i = i->next) {
|
||||||
|
if (co->data == i->data) {
|
||||||
|
aliased = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!aliased) {
|
||||||
union m_option_value temp = {0};
|
union m_option_value temp = {0};
|
||||||
m_option_copy(arg, &temp, co->data);
|
m_option_copy(arg, &temp, co->data);
|
||||||
memset(co->data, 0, arg->type->size);
|
memset(co->data, 0, arg->type->size);
|
||||||
|
@ -46,10 +46,6 @@ struct m_config_option {
|
|||||||
void *data;
|
void *data;
|
||||||
// If this is a suboption, the option that contains this option.
|
// If this is a suboption, the option that contains this option.
|
||||||
struct m_config_option *parent;
|
struct m_config_option *parent;
|
||||||
// If this option aliases another, more important option. The alias_owner
|
|
||||||
// option is the one that has the most correct option type for the data
|
|
||||||
// variable, and which is considered the original.
|
|
||||||
struct m_config_option *alias_owner;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Config object
|
// Config object
|
||||||
|
Loading…
Reference in New Issue
Block a user