Fix build error on Windows 32 bit.
[blender-staging.git] / source / creator / creator.c
index 315d0d40243f446e1f4fca233744368308060cbf..a59a45f885c8685f5838c4d74f070f310f2011ef 100644 (file)
@@ -42,6 +42,8 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "DNA_genfile.h"
+
 #include "BLI_args.h"
 #include "BLI_threads.h"
 #include "BLI_utildefines.h"
@@ -52,6 +54,7 @@
 #include "BKE_appdir.h"
 #include "BKE_blender.h"
 #include "BKE_brush.h"
+#include "BKE_cachefile.h"
 #include "BKE_context.h"
 #include "BKE_depsgraph.h" /* for DAG_init */
 #include "BKE_font.h"
@@ -148,6 +151,35 @@ static void main_callback_setup(void)
        MEM_set_error_callback(callback_mem_error);
 }
 
+/* free data on early exit (if Python calls 'sys.exit()' while parsing args for eg). */
+struct CreatorAtExitData {
+       bArgs *ba;
+#ifdef WIN32
+       const char **argv;
+       int argv_num;
+#endif
+};
+
+static void callback_main_atexit(void *user_data)
+{
+       struct CreatorAtExitData *app_init_data = user_data;
+
+       if (app_init_data->ba) {
+               BLI_argsFree(app_init_data->ba);
+               app_init_data->ba = NULL;
+       }
+
+#ifdef WIN32
+       if (app_init_data->argv) {
+               while (app_init_data->argv_num) {
+                       free((void *)app_init_data->argv[--app_init_data->argv_num]);
+               }
+               free((void *)app_init_data->argv);
+               app_init_data->argv = NULL;
+       }
+#endif
+}
+
 /** \} */
 
 
@@ -199,6 +231,9 @@ int main(
 
        /* --- end declarations --- */
 
+       /* ensure we free data on early-exit */
+       struct CreatorAtExitData app_init_data = {NULL};
+       BKE_blender_atexit_register(callback_main_atexit, &app_init_data);
 
 #ifdef WIN32
        /* We delay loading of openmp so we can set the policy here. */
@@ -222,6 +257,10 @@ int main(
                        argv[argv_num] = alloc_utf_8_from_16(argv_16[argv_num], 0);
                }
                LocalFree(argv_16);
+
+               /* free on early-exit */
+               app_init_data.argv = argv;
+               app_init_data.argv_num = argv_num;
        }
 #endif  /* WIN32 */
 
@@ -314,9 +353,12 @@ int main(
 
        BLI_threadapi_init();
 
+       DNA_sdna_current_init();
+
        BKE_blender_globals_init();  /* blender.c */
 
        IMB_init();
+       BKE_cachefiles_init();
        BKE_images_init();
        BKE_modifier_init();
        DAG_init();
@@ -336,6 +378,10 @@ int main(
        /* first test for background */
 #ifndef WITH_PYTHON_MODULE
        ba = BLI_argsInit(argc, (const char **)argv); /* skip binary path */
+
+       /* ensure we free on early exit */
+       app_init_data.ba = ba;
+
        main_args_setup(C, ba, &syshandle);
 
        BLI_argsParse(ba, 1, NULL, NULL);
@@ -432,16 +478,22 @@ int main(
 
 #endif
 
+       /* Explicitly free data allocated for argument parsing:
+        * - 'ba'
+        * - 'argv' on WIN32.
+        */
+       callback_main_atexit(&app_init_data);
+       BKE_blender_atexit_unregister(callback_main_atexit, &app_init_data);
+
+       /* paranoid, avoid accidental re-use */
 #ifndef WITH_PYTHON_MODULE
-       BLI_argsFree(ba);
+       ba = NULL;
+       (void)ba;
 #endif
 
 #ifdef WIN32
-       while (argv_num) {
-               free(argv[--argv_num]);
-       }
-       free(argv);
        argv = NULL;
+       (void)argv;
 #endif
 
 #ifdef WITH_PYTHON_MODULE