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.
ChimaraGlkPrivate *glk_data;
};
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)
/* glk_enter() is the actual function called in the new thread in which glk_main() runs. */
static gpointer
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;
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);
}
/* Run main function */
}
/* Run main function */
g_free(startup);
g_signal_emit_by_name(startup->glk_data->self, "started");
glk_main();
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;
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;