mirror of
https://github.com/libretro/RetroArch
synced 2025-03-29 22:20:21 +00:00
Merge pull request #3020 from sronsse/fixes_for_team
Memory leak-related fixes
This commit is contained in:
commit
1be1c6a6e2
@ -529,8 +529,6 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data)
|
||||
menu_driver_data_own = true;
|
||||
break;
|
||||
case RARCH_MENU_CTL_UNSET_OWN_DRIVER:
|
||||
if (!content_is_inited())
|
||||
return false;
|
||||
menu_driver_data_own = false;
|
||||
break;
|
||||
case RARCH_MENU_CTL_SET_TEXTURE:
|
||||
|
@ -101,6 +101,7 @@ struct rarch_setting
|
||||
double max;
|
||||
|
||||
uint64_t flags;
|
||||
uint64_t free_flags;
|
||||
|
||||
change_handler_t change_handler;
|
||||
change_handler_t read_handler;
|
||||
@ -1692,6 +1693,10 @@ bool CONFIG_STRING_OPTIONS(
|
||||
setting_string_setting_options(ST_STRING_OPTIONS, name, SHORT, target, len, default_value, "", values,
|
||||
group_info->name, subgroup_info->name, parent_group, change_handler, read_handler))))
|
||||
return false;
|
||||
|
||||
/* Request values to be freed later */
|
||||
settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_VALUES);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1729,6 +1734,10 @@ bool CONFIG_BIND(
|
||||
setting_bind_setting(name, SHORT, target, player, player_offset, default_value,
|
||||
group_info->name, subgroup_info->name, parent_group))))
|
||||
return false;
|
||||
|
||||
/* Request name and short description to be freed later */
|
||||
settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -3105,6 +3114,14 @@ void settings_data_list_current_add_flags(
|
||||
setting_add_special_callbacks(list, list_info, values);
|
||||
}
|
||||
|
||||
void settings_data_list_current_add_free_flags(
|
||||
rarch_setting_t **list,
|
||||
rarch_setting_info_t *list_info,
|
||||
unsigned values)
|
||||
{
|
||||
(*list)[list_info->index - 1].free_flags |= values;
|
||||
}
|
||||
|
||||
#ifdef HAVE_OVERLAY
|
||||
static void overlay_enable_toggle_change_handler(void *data)
|
||||
{
|
||||
@ -3438,7 +3455,7 @@ static bool setting_append_list_input_player_options(
|
||||
&settings->input.binds[user][i],
|
||||
user + 1,
|
||||
user,
|
||||
strdup(name), /* TODO: Find a way to fix these memleaks. */
|
||||
strdup(name),
|
||||
strdup(label),
|
||||
&defaults[i],
|
||||
&group_info,
|
||||
@ -6571,6 +6588,7 @@ static bool setting_append_list(
|
||||
general_write_handler,
|
||||
general_read_handler);
|
||||
settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
|
||||
settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT);
|
||||
}
|
||||
|
||||
CONFIG_BOOL(
|
||||
@ -7324,31 +7342,33 @@ static bool setting_append_list(
|
||||
static bool menu_setting_free(void *data)
|
||||
{
|
||||
rarch_setting_t *setting = (rarch_setting_t*)data;
|
||||
unsigned values;
|
||||
unsigned n;
|
||||
|
||||
if (!data)
|
||||
return false;
|
||||
|
||||
/* Free data which was previously tagged */
|
||||
for (; menu_setting_get_type(setting) != ST_NONE; menu_settings_list_increment(&setting))
|
||||
{
|
||||
enum setting_type setting_type = menu_setting_get_type(setting);
|
||||
|
||||
switch (setting_type)
|
||||
{
|
||||
case ST_STRING_OPTIONS:
|
||||
if (setting->values)
|
||||
for (values = setting->free_flags, n = 0; values != 0; values >>= 1, n++)
|
||||
if (values & 1)
|
||||
switch (1 << n)
|
||||
{
|
||||
case SD_FREE_FLAG_VALUES:
|
||||
free((void*)setting->values);
|
||||
setting->values = NULL;
|
||||
break;
|
||||
case ST_BIND:
|
||||
free((void*)setting->name);
|
||||
free((void*)setting->short_description);
|
||||
setting->name = NULL;
|
||||
setting->short_description = NULL;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
setting->values = NULL;
|
||||
break;
|
||||
case SD_FREE_FLAG_NAME:
|
||||
free((void*)setting->name);
|
||||
setting->name = NULL;
|
||||
break;
|
||||
case SD_FREE_FLAG_SHORT:
|
||||
free((void*)setting->short_description);
|
||||
setting->short_description = NULL;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
free(data);
|
||||
|
||||
|
@ -62,6 +62,13 @@ enum setting_flags
|
||||
SD_FLAG_ADVANCED = (1 << 9)
|
||||
};
|
||||
|
||||
enum settings_free_flags
|
||||
{
|
||||
SD_FREE_FLAG_VALUES = (1 << 0),
|
||||
SD_FREE_FLAG_NAME = (1 << 1),
|
||||
SD_FREE_FLAG_SHORT = (1 << 2)
|
||||
};
|
||||
|
||||
enum menu_setting_ctl_state
|
||||
{
|
||||
MENU_SETTING_CTL_NONE = 0,
|
||||
@ -370,6 +377,11 @@ void settings_data_list_current_add_flags(
|
||||
rarch_setting_info_t *list_info,
|
||||
unsigned values);
|
||||
|
||||
void settings_data_list_current_add_free_flags(
|
||||
rarch_setting_t **list,
|
||||
rarch_setting_info_t *list_info,
|
||||
unsigned values);
|
||||
|
||||
bool menu_setting_ctl(enum menu_setting_ctl_state state, void *data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
Loading…
x
Reference in New Issue
Block a user