Keep glkunix startup arg[c,v] alive
authorPhilip Chimento <philip.chimento@gmail.com>
Sun, 16 Sep 2012 17:52:38 +0000 (19:52 +0200)
committerPhilip Chimento <philip.chimento@gmail.com>
Sat, 31 Aug 2013 23:43:52 +0000 (16:43 -0700)
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

index b3fb583f1bc5162f30969d083299091044c53417..74d07724efb78a1e587fba409f820579bff46d63 100644 (file)
@@ -1191,6 +1191,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)
@@ -1207,14 +1216,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 */
@@ -1224,6 +1230,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;