Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2016-03-14 17:05:52 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2016-03-14 17:05:52 +0300
commit00166ff62e689b7caebdd3a0c4f9051b2739826a (patch)
tree7daed8f9b67b1d4b5c3597997b335b9ad6ef484f /source/blender/blenkernel
parent6b1d77a8052b0706ef2277cb1a5e4f3c67310806 (diff)
Better fix for T47787 - remove extra user due to 'user_one' as soon as we increase 'real' user count.
This has several benefits: * User count remains coherent, regardless of the order in which you use 'user_one' & real refcounting users (i.e. if you add to group, and then link in scene, or the reverse, you now always get same final user count). * Avoids the need to check for potential 'user_one' extra user in count in several places in code (e.g. when making IDs single users...). * Users won't wonder why they cannot make 'single user' and ID even though its user count shows '2'! * readfile.c now always uses code from BKE's library.c when modifying id->us. Which means we can consider (asside from assignment during initialization) that id->us is read-only outside of library.c context. Note that this commit reverts previous one (rB6b1d77a8052b) - please **do not** backport this one in 2.77.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_library.h1
-rw-r--r--source/blender/blenkernel/intern/library.c22
2 files changed, 21 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index 606edd9cc3a..21585a160dd 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -73,6 +73,7 @@ void id_lib_extern(struct ID *id);
void BKE_library_filepath_set(struct Library *lib, const char *filepath);
void id_us_ensure_real(struct ID *id);
void id_us_clear_real(struct ID *id);
+void id_us_plus_no_lib(struct ID *id);
void id_us_plus(struct ID *id);
void id_us_min(struct ID *id);
void id_fake_user_set(struct ID *id);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index c04eda00904..6d7a61534a8 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -194,11 +194,29 @@ void id_us_clear_real(ID *id)
}
}
+/* Same as \a id_us_plus, but does not handle lib indirect -> extern.
+ * Only used by readfile.c so far, but simpler/safer to keep it here nontheless. */
+void id_us_plus_no_lib(ID *id)
+{
+ if (id) {
+ if ((id->tag & LIB_TAG_EXTRAUSER) && (id->tag & LIB_TAG_EXTRAUSER_SET)) {
+ BLI_assert(id->us >= 1);
+ /* No need to increase count, just tag extra user as no more set.
+ * Avoids annoying & inconsistent +1 in user count. */
+ id->tag &= ~LIB_TAG_EXTRAUSER_SET;
+ }
+ else {
+ BLI_assert(id->us >= 0);
+ id->us++;
+ }
+ }
+}
+
+
void id_us_plus(ID *id)
{
if (id) {
- BLI_assert(id->us >= 0);
- id->us++;
+ id_us_plus_no_lib(id);
id_lib_extern(id);
}
}