Merge pull request #3020 from sronsse/fixes_for_team

Memory leak-related fixes
This commit is contained in:
Twinaphex 2016-05-23 12:25:51 +02:00
commit 1be1c6a6e2
3 changed files with 52 additions and 22 deletions

View File

@ -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:

View File

@ -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);

View File

@ -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