[Bf-blender-cvs] [49b67b5] id-remap: Fix id-remap looper not 'freeing' 'use-one' id usercount.
Bastien Montagne
noreply at git.blender.org
Mon Dec 7 15:54:34 CET 2015
Commit: 49b67b58aa9614f70769322ce595e9a8a5625633
Author: Bastien Montagne
Date: Mon Dec 7 15:54:03 2015 +0100
Branches: id-remap
https://developer.blender.org/rB49b67b58aa9614f70769322ce595e9a8a5625633
Fix id-remap looper not 'freeing' 'use-one' id usercount.
===================================================================
M source/blender/blenkernel/intern/library.c
M source/blender/blenkernel/intern/library_query.c
===================================================================
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index ada6ccb..6ad2f0b 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -182,6 +182,18 @@ void id_us_ensure_real(ID *id)
}
}
+static void id_us_clear_real(ID *id)
+{
+ if (id && (id->flag2 & LIB_EXTRAUSER)) {
+ if (id->flag2 & LIB_EXTRAUSER_SET) {
+ const int limit = ID_FAKE_USERS(id);
+ id->us--;
+ BLI_assert(id->us >= limit);
+ }
+ id->flag2 &= ~(LIB_EXTRAUSER | LIB_EXTRAUSER_SET);
+ }
+}
+
void id_us_plus(ID *id)
{
if (id) {
@@ -1209,6 +1221,8 @@ static void libblock_remap_data(
id_fake_user_set(new_id);
}
+ id_us_clear_real(old_id);
+
if (new_id && (new_id->flag & LIB_INDIRECT) && (r_id_remap_data->status & ID_REMAP_IS_LINKED_DIRECT)) {
new_id->flag &= ~LIB_INDIRECT;
new_id->flag |= LIB_EXTERN;
diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c
index 9fdac85..2292737 100644
--- a/source/blender/blenkernel/intern/library_query.c
+++ b/source/blender/blenkernel/intern/library_query.c
@@ -727,11 +727,14 @@ typedef struct IDUsersIter {
int count; /* Set by callback. */
} IDUsersIter;
-static bool foreach_libblock_id_users_callback(void *user_data, ID **id_p, int UNUSED(cb_flag))
+static bool foreach_libblock_id_users_callback(void *user_data, ID **id_p, int cb_flag)
{
IDUsersIter *iter = user_data;
if (*id_p && (*id_p == iter->id)) {
+ printf("%s uses %s (refcounted: %d, userone: %d, used_one: %d, used_one_active: %d)\n",
+ iter->curr_id->name, iter->id->name, (cb_flag & IDWALK_USER) ? 1 : 0, (cb_flag & IDWALK_USER_ONE) ? 1 : 0,
+ (iter->id->flag2 & LIB_EXTRAUSER) ? 1 : 0, (iter->id->flag2 & LIB_EXTRAUSER_SET) ? 1 : 0);
iter->count++;
}
More information about the Bf-blender-cvs
mailing list