From 80840cac0c97b0db8c3b49b9c7c9b6e8feb60244 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 21 Mar 2015 01:47:06 +0100 Subject: [PATCH] Put g_config on heap --- configuration.c | 24 +++++++++++++++++-- configuration.h | 4 ++++ general.h | 6 ++--- .../include/file/config_file_macros.h | 24 +++++++++---------- retroarch.c | 8 ++++++- 5 files changed, 48 insertions(+), 18 deletions(-) diff --git a/configuration.c b/configuration.c index bf37b4ce56..833fe4574c 100644 --- a/configuration.c +++ b/configuration.c @@ -31,7 +31,7 @@ #include "config.h" #endif -static settings_t g_config; +static settings_t *g_config; struct global g_extern; struct defaults g_defaults; @@ -1068,6 +1068,7 @@ static bool config_load_file(const char *path, bool set_defaults) unsigned msg_color = 0; config_file_t *conf = NULL; settings_t *settings = config_get_ptr(); + global_t *global = &g_extern; if (path) { @@ -2148,5 +2149,24 @@ bool config_save_file(const char *path) settings_t *config_get_ptr(void) { - return &g_config; + return g_config; +} + +void config_free(void) +{ + if (!g_config) + return; + + free(g_config); + g_config = NULL; +} + +settings_t *config_init(void) +{ + g_config = (settings_t*)calloc(1, sizeof(settings_t)); + + if (!g_config) + return NULL; + + return g_config; } diff --git a/configuration.h b/configuration.h index 52ec3186de..b658ec87e2 100644 --- a/configuration.h +++ b/configuration.h @@ -407,6 +407,10 @@ bool config_save_keybinds_file(const char *path); **/ bool config_save_file(const char *path); +settings_t *config_init(void); + +void config_free(void); + settings_t *config_get_ptr(void); #ifdef __cplusplus diff --git a/general.h b/general.h index 3e2f66e168..24bb388bbe 100644 --- a/general.h +++ b/general.h @@ -124,7 +124,7 @@ typedef struct rarch_resolution /* All run-time- / command line flag-related globals go here. */ -struct global +typedef struct global { bool verbosity; bool perfcnt_enable; @@ -441,10 +441,10 @@ struct global char core_specific_config_path[PATH_MAX_LENGTH]; retro_keyboard_event_t frontend_key_event; -}; +} global_t; /* Public data structures. */ -extern struct global g_extern; +extern global_t g_extern; extern struct defaults g_defaults; /* Public functions. */ diff --git a/libretro-common/include/file/config_file_macros.h b/libretro-common/include/file/config_file_macros.h index 6782898b1f..4c42bbab31 100644 --- a/libretro-common/include/file/config_file_macros.h +++ b/libretro-common/include/file/config_file_macros.h @@ -29,38 +29,38 @@ #define CONFIG_GET_BOOL_BASE(conf, base, var, key) do { \ bool tmp = false; \ if (config_get_bool(conf, key, &tmp)) \ - base.var = tmp; \ + base->var = tmp; \ } while(0) #define CONFIG_GET_INT_BASE(conf, base, var, key) do { \ int tmp = 0; \ if (config_get_int(conf, key, &tmp)) \ - base.var = tmp; \ + base->var = tmp; \ } while(0) #define CONFIG_GET_UINT64_BASE(conf, base, var, key) do { \ uint64_t tmp = 0; \ if (config_get_int(conf, key, &tmp)) \ - base.var = tmp; \ + base->var = tmp; \ } while(0) #define CONFIG_GET_HEX_BASE(conf, base, var, key) do { \ unsigned tmp = 0; \ if (config_get_hex(conf, key, &tmp)) \ - base.var = tmp; \ + base->var = tmp; \ } while(0) #define CONFIG_GET_FLOAT_BASE(conf, base, var, key) do { \ float tmp = 0.0f; \ if (config_get_float(conf, key, &tmp)) \ - base.var = tmp; \ + base->var = tmp; \ } while(0) #define CONFIG_GET_STRING_BASE(conf, base, var, key) \ - config_get_array(conf, key, base.var, sizeof(base.var)) + config_get_array(conf, key, base->var, sizeof(base->var)) #define CONFIG_GET_PATH_BASE(conf, base, var, key) \ - config_get_path(conf, key, base.var, sizeof(base.var)) + config_get_path(conf, key, base->var, sizeof(base->var)) #define CONFIG_GET_BOOL(var, key) CONFIG_GET_BOOL_BASE(conf, g_config, var, key) #define CONFIG_GET_INT(var, key) CONFIG_GET_INT_BASE(conf, g_config, var, key) @@ -68,10 +68,10 @@ #define CONFIG_GET_STRING(var, key) CONFIG_GET_STRING_BASE(conf, g_config, var, key) #define CONFIG_GET_PATH(var, key) CONFIG_GET_PATH_BASE(conf, g_config, var, key) -#define CONFIG_GET_BOOL_EXTERN(var, key) CONFIG_GET_BOOL_BASE(conf, g_extern, var, key) -#define CONFIG_GET_INT_EXTERN(var, key) CONFIG_GET_INT_BASE(conf, g_extern, var, key) -#define CONFIG_GET_FLOAT_EXTERN(var, key) CONFIG_GET_FLOAT_BASE(conf, g_extern, var, key) -#define CONFIG_GET_STRING_EXTERN(var, key) CONFIG_GET_STRING_BASE(conf, g_extern, var, key) -#define CONFIG_GET_PATH_EXTERN(var, key) CONFIG_GET_PATH_BASE(conf, g_extern, var, key) +#define CONFIG_GET_BOOL_EXTERN(var, key) CONFIG_GET_BOOL_BASE(conf, global, var, key) +#define CONFIG_GET_INT_EXTERN(var, key) CONFIG_GET_INT_BASE(conf, global, var, key) +#define CONFIG_GET_FLOAT_EXTERN(var, key) CONFIG_GET_FLOAT_BASE(conf, global, var, key) +#define CONFIG_GET_STRING_EXTERN(var, key) CONFIG_GET_STRING_BASE(conf, global, var, key) +#define CONFIG_GET_PATH_EXTERN(var, key) CONFIG_GET_PATH_BASE(conf, global, var, key) #endif diff --git a/retroarch.c b/retroarch.c index f13001ed51..997d7626a7 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1674,7 +1674,13 @@ static void main_clear_state(bool inited) unsigned i; settings_t *settings = config_get_ptr(); - memset(settings, 0, sizeof(*settings)); + if (settings) + config_free(); + + settings = config_init(); + + if (!settings) + return; if (inited) rarch_main_command(RARCH_CMD_DRIVERS_DEINIT);