From ba938da348af2bf3a45df36b3d209f7d0fc0c162 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 23 Mar 2015 23:40:36 +0100 Subject: [PATCH] Fixes segfault with environ SHUTDOWN with prboom --- retroarch.c | 5 ++++- retroarch.h | 1 + runloop.h | 2 ++ runloop_data.c | 12 ++++++++++-- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/retroarch.c b/retroarch.c index 6ccc2d848c..7ee5a39774 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2385,7 +2385,7 @@ bool rarch_main_command(unsigned cmd) if (menu) menu->load_no_content = false; #endif - rarch_main_data_free(); + rarch_main_data_deinit(); *global->fullpath = '\0'; @@ -2591,6 +2591,9 @@ bool rarch_main_command(unsigned cmd) core_info_list_free(global->core_info); global->core_info = NULL; break; + case RARCH_CMD_DATA_RUNLOOP_FREE: + rarch_main_data_free(); + break; case RARCH_CMD_CORE_INFO_INIT: rarch_main_command(RARCH_CMD_CORE_INFO_DEINIT); diff --git a/retroarch.h b/retroarch.h index 3c2c07b243..bc35fecb48 100644 --- a/retroarch.h +++ b/retroarch.h @@ -193,6 +193,7 @@ enum basic_event RARCH_CMD_REMAPPING_DEINIT, RARCH_CMD_VOLUME_UP, RARCH_CMD_VOLUME_DOWN, + RARCH_CMD_DATA_RUNLOOP_FREE, }; enum action_state diff --git a/runloop.h b/runloop.h index 7cc569881b..2d1420cc0d 100644 --- a/runloop.h +++ b/runloop.h @@ -486,6 +486,8 @@ void rarch_main_state_free(void); void rarch_main_global_free(void); +void rarch_main_data_deinit(void); + void rarch_main_data_free(void); void rarch_main_data_init_queues(void); diff --git a/runloop_data.c b/runloop_data.c index 31c4e49917..dfde4b7489 100644 --- a/runloop_data.c +++ b/runloop_data.c @@ -778,7 +778,7 @@ static void data_runloop_thread_deinit(data_runloop_t *runloop) } #endif -void rarch_main_data_free(void) +void rarch_main_data_deinit(void) { data_runloop_t *data_runloop = (data_runloop_t*)rarch_main_data_get_ptr(); @@ -794,8 +794,15 @@ void rarch_main_data_free(void) #endif data_runloop->inited = false; +} - free(data_runloop); +void rarch_main_data_free(void) +{ + data_runloop_t *data_runloop = (data_runloop_t*)rarch_main_data_get_ptr(); + + if (data_runloop) + free(data_runloop); + data_runloop = NULL; } static void data_runloop_iterate(bool is_thread, data_runloop_t *runloop) @@ -915,6 +922,7 @@ static data_runloop_t *rarch_main_data_new(void) void rarch_main_data_clear_state(void) { + rarch_main_data_deinit(); rarch_main_data_free(); g_data_runloop = rarch_main_data_new(); }