From 6a850f3cc840a574d3b5b5af7b608ae3536f96ec Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 15 May 2020 16:53:43 +1000 Subject: Fix duplicate ID's being created when appending/linking This removes grease pencil brush creation/dat-block delete on load, since this causes duplicate data-blocks. Add assert to prevent this happening in the future since the error is isn't obvious. --- source/blender/blenkernel/BKE_main.h | 6 ++++++ source/blender/blenkernel/intern/lib_id.c | 2 ++ source/blender/blenkernel/intern/lib_id_delete.c | 2 ++ 3 files changed, 10 insertions(+) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h index ed1f67350c3..62f50fb8ff6 100644 --- a/source/blender/blenkernel/BKE_main.h +++ b/source/blender/blenkernel/BKE_main.h @@ -105,6 +105,12 @@ typedef struct Main { */ char use_memfile_full_barrier; + /** + * When linking, disallow creation of new data-blocks. + * Make sure we don't do this by accident, see T76738. + */ + char is_locked_for_linking; + BlendThumbnail *blen_thumb; struct Library *curlib; diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c index e976d59ce16..cd10d8b1670 100644 --- a/source/blender/blenkernel/intern/lib_id.c +++ b/source/blender/blenkernel/intern/lib_id.c @@ -1018,6 +1018,8 @@ void *BKE_libblock_alloc(Main *bmain, short type, const char *name, const int fl id->us = 1; } if ((flag & LIB_ID_CREATE_NO_MAIN) == 0) { + /* Note that 2.8x versioning has tested not to cause conflicts. */ + BLI_assert(bmain->is_locked_for_linking == false || ELEM(type, ID_WS, ID_GR)); ListBase *lb = which_libbase(bmain, type); BKE_main_lock(bmain); diff --git a/source/blender/blenkernel/intern/lib_id_delete.c b/source/blender/blenkernel/intern/lib_id_delete.c index 245e4f43452..9b1abf4d76c 100644 --- a/source/blender/blenkernel/intern/lib_id_delete.c +++ b/source/blender/blenkernel/intern/lib_id_delete.c @@ -188,6 +188,8 @@ void BKE_id_free_ex(Main *bmain, void *idv, int flag, const bool use_flag_from_i const short type = GS(id->name); if (bmain && (flag & LIB_ID_FREE_NO_DEG_TAG) == 0) { + BLI_assert(bmain->is_locked_for_linking == false); + DEG_id_type_tag(bmain, type); } -- cgit v1.2.3