diff --git a/configuration.c b/configuration.c index 29bd6856a6..91db35de13 100644 --- a/configuration.c +++ b/configuration.c @@ -1971,12 +1971,15 @@ static bool config_load_file(const char *path, bool set_defaults) return true; } +/* Config file associated with per-core configs. */ +static char path_core_specific_config[PATH_MAX_LENGTH]; + static void config_load_core_specific(void) { settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); - *global->path.core_specific_config = '\0'; + *path_core_specific_config = '\0'; if (string_is_empty(settings->path.libretro)) { @@ -1994,22 +1997,22 @@ static void config_load_core_specific(void) { path_resolve_realpath(settings->directory.menu_config, sizeof(settings->directory.menu_config)); - strlcpy(global->path.core_specific_config, + strlcpy(path_core_specific_config, settings->directory.menu_config, - sizeof(global->path.core_specific_config)); + sizeof(path_core_specific_config)); } else #endif { /* Use original config file's directory as a fallback. */ - fill_pathname_basedir(global->path.core_specific_config, - global->path.config, sizeof(global->path.core_specific_config)); + fill_pathname_basedir(path_core_specific_config, + global->path.config, sizeof(path_core_specific_config)); } - fill_pathname_dir(global->path.core_specific_config, + fill_pathname_dir(path_core_specific_config, settings->path.libretro, file_path_str(FILE_PATH_CONFIG_EXTENSION), - sizeof(global->path.core_specific_config)); + sizeof(path_core_specific_config)); if (settings->core_specific_config) { @@ -2021,9 +2024,9 @@ static void config_load_core_specific(void) strlcpy(tmp, settings->path.libretro, sizeof(tmp)); RARCH_LOG("Config: loading core-specific config from: %s.\n", - global->path.core_specific_config); + path_core_specific_config); - if (!config_load_file(global->path.core_specific_config, true)) + if (!config_load_file(path_core_specific_config, true)) RARCH_WARN("Config: core-specific config not found, reusing last config.\n"); /* Force some parameters which are implied when using core specific configs. @@ -2513,9 +2516,9 @@ void config_load(void) global_t *global = global_get_ptr(); /* Flush out per-core configs before loading a new config. */ - if (!string_is_empty(global->path.core_specific_config) && + if (!string_is_empty(path_core_specific_config) && settings->config_save_on_exit && settings->core_specific_config) - config_save_file(global->path.core_specific_config); + config_save_file(path_core_specific_config); /* Flush out some states that could have been * set by core environment variables */ @@ -3233,12 +3236,17 @@ const char *config_get_active_path(void) settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); - if (!string_is_empty(global->path.core_specific_config) + if (!string_is_empty(path_core_specific_config) && settings->core_specific_config) - return global->path.core_specific_config; + return path_core_specific_config; if (!string_is_empty(global->path.config)) return global->path.config; return NULL; } + +void config_free_state(void) +{ + *path_core_specific_config = '\0'; +} diff --git a/configuration.h b/configuration.h index 572d3aa441..5d2ad7e6cf 100644 --- a/configuration.h +++ b/configuration.h @@ -598,6 +598,8 @@ void config_free(void); const char *config_get_active_path(void); +void config_free_state(void); + settings_t *config_get_ptr(void); RETRO_END_DECLS diff --git a/runloop.c b/runloop.c index c0fe059dcf..7cc3beb908 100644 --- a/runloop.c +++ b/runloop.c @@ -966,6 +966,7 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data) global = global_get_ptr(); memset(global, 0, sizeof(struct global)); + config_free_state(); } break; case RUNLOOP_CTL_CLEAR_STATE: diff --git a/runloop.h b/runloop.h index c4cfc07143..19abb7173f 100644 --- a/runloop.h +++ b/runloop.h @@ -153,7 +153,6 @@ typedef struct rarch_path char default_log[PATH_MAX_LENGTH]; #endif /* Config file associated with per-core configs. */ - char core_specific_config[PATH_MAX_LENGTH]; char core_options_path[PATH_MAX_LENGTH]; } rarch_path_t;