diff options
author | Bastien Montagne <mont29> | 2022-10-05 13:55:32 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2022-10-05 15:26:45 +0300 |
commit | b47a234f98dd7e6e0b53ad96b5b4d278635874d8 (patch) | |
tree | d1bc0efb0e769ba060c472862f2b7d45a96f908b /source/blender/blenkernel/intern/blender.c | |
parent | 31a4fb42d42af66ce6436803cad6d30173f34245 (diff) |
BKE_Main: Add clear separation between 'temp' mains and global main.
Blender is using more and more temporary Main data-base (historically
for reading linked data, but also now when resyncing liboverrides, for
temp data in asset code, etc.).
This commit aims at making this a bit more formal and defined, by:
* Adding a dedicated flag in Main struct to mark a Main as global.
* Adding some API to replace, or temporarily swap the current global
Main (`G_MAIN`) by another one.
NOTE: Having to temporarily replace `G_MAIN` is a workaround for the
limitation of current RNA, ideally this should be fixed in RNA itself,
but for now at least having an API helps tracking those cases (since
this is potentially risky operation).
This work is also a preparation for more usages of temp mains in the near
future (Asset Brushes and its presets system e.g. will most likely use
temp mains too).
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D15977
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; +} + /** \} */ /* -------------------------------------------------------------------- */ |