From: Philip Chimento Date: Sun, 16 Sep 2012 17:52:38 +0000 (+0200) Subject: Keep glkunix startup arg[c,v] alive X-Git-Tag: v0.9~1 X-Git-Url: https://git.stderr.nl/gitweb?a=commitdiff_plain;h=6e8270f9b73debc54dd221ba08ff9db3dd1f8aee;p=projects%2Fchimara%2Fchimara.git 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. --- 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;