From 6e8270f9b73debc54dd221ba08ff9db3dd1f8aee Mon Sep 17 00:00:00 2001 From: Philip Chimento Date: Sun, 16 Sep 2012 19:52:38 +0200 Subject: [PATCH] Keep glkunix startup arg[c,v] alive Bocfel (for one) relies on the argc and argv that it gets from the Glk library not being freed during the course of the game. So now we keep them alive. --- libchimara/chimara-glk.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/libchimara/chimara-glk.c b/libchimara/chimara-glk.c index 0683572..aea0f69 100644 --- a/libchimara/chimara-glk.c +++ b/libchimara/chimara-glk.c @@ -1130,6 +1130,15 @@ struct StartupData { ChimaraGlkPrivate *glk_data; }; +static void +free_startup_data(struct StartupData *startup) +{ + int i = 0; + while(i < startup->args.argc) + g_free(startup->args.argv[i++]); + g_free(startup->args.argv); +} + /* glk_enter() is the actual function called in the new thread in which glk_main() runs. */ static gpointer glk_enter(struct StartupData *startup) @@ -1146,14 +1155,11 @@ glk_enter(struct StartupData *startup) startup->glk_data->in_startup = TRUE; int result = startup->glkunix_startup_code(&startup->args); startup->glk_data->in_startup = FALSE; - - int i = 0; - while(i < startup->args.argc) - g_free(startup->args.argv[i++]); - g_free(startup->args.argv); - - if(!result) + + if(!result) { + free_startup_data(startup); return NULL; + } } /* Run main function */ @@ -1163,6 +1169,7 @@ glk_enter(struct StartupData *startup) g_free(startup); g_signal_emit_by_name(startup->glk_data->self, "started"); glk_main(); + free_startup_data(startup); glk_exit(); /* Run shutdown code in glk_exit() even if glk_main() returns normally */ g_assert_not_reached(); /* because glk_exit() calls g_thread_exit() */ return NULL; -- 2.30.2