diff options
Diffstat (limited to 'source/blender/blenkernel/intern/blender.c')
-rw-r--r-- | source/blender/blenkernel/intern/blender.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 947cdc0c8bf..23cf368af01 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -62,8 +62,7 @@ void BKE_blender_free(void) /* Needs to run before main free as wm is still referenced for icons preview jobs. */ BKE_studiolight_free(); - BKE_main_free(G_MAIN); - G_MAIN = NULL; + BKE_blender_globals_clear(); if (G.log.file != NULL) { fclose(G.log.file); @@ -146,7 +145,7 @@ void BKE_blender_globals_init(void) U.savetime = 1; - G_MAIN = BKE_main_new(); + BKE_blender_globals_main_replace(BKE_main_new()); strcpy(G.ima, "//"); @@ -161,11 +160,34 @@ void BKE_blender_globals_init(void) void BKE_blender_globals_clear(void) { + if (G_MAIN == NULL) { + return; + } + BLI_assert(G_MAIN->is_global_main); BKE_main_free(G_MAIN); /* free all lib data */ G_MAIN = NULL; } +void BKE_blender_globals_main_replace(Main *bmain) +{ + BLI_assert(!bmain->is_global_main); + BKE_blender_globals_clear(); + bmain->is_global_main = true; + G_MAIN = bmain; +} + +Main *BKE_blender_globals_main_swap(Main *new_gmain) +{ + Main *old_gmain = G_MAIN; + BLI_assert(old_gmain->is_global_main); + BLI_assert(!new_gmain->is_global_main); + new_gmain->is_global_main = true; + G_MAIN = new_gmain; + old_gmain->is_global_main = false; + return old_gmain; +} + /** \} */ /* -------------------------------------------------------------------- */ |