Commit: d59c2d12b1226afa3789b0ef142f8f6cc9356ead
Author: Bastien Montagne
Date:   Wed Apr 4 14:56:32 2018 +0200
Branches: master
https://developer.blender.org/rBd59c2d12b1226afa3789b0ef142f8f6cc9356ead

Fix modifier freeing code re. ID refcounting.

Free code should not handle ID refcounting at all. This has to be done
at higher level, since in some case we want to free (temp) data that
actually did not refcount at all its IDs.

This change seems to be working OK, but as usual in that area, only
lots of testing in real-case situation will say whether there are some
hidden bugs or not.

===================================================================

M       source/blender/blenkernel/BKE_modifier.h
M       source/blender/blenkernel/BKE_object.h
M       source/blender/blenkernel/intern/mesh.c
M       source/blender/blenkernel/intern/modifier.c
M       source/blender/blenkernel/intern/object.c
M       source/blender/editors/object/object_add.c
M       source/blender/modifiers/intern/MOD_displace.c
M       source/blender/modifiers/intern/MOD_meshsequencecache.c
M       source/blender/modifiers/intern/MOD_wave.c
M       source/blender/modifiers/intern/MOD_weightvgedit.c
M       source/blender/modifiers/intern/MOD_weightvgmix.c
M       source/blender/modifiers/intern/MOD_weightvgproximity.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_modifier.h 
b/source/blender/blenkernel/BKE_modifier.h
index b0917e4f6cd..18cde156f5e 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -346,6 +346,7 @@ const ModifierTypeInfo *modifierType_getInfo(ModifierType 
type);
  * default values if pointer is optional.
  */
 struct ModifierData  *modifier_new(int type);
+void          modifier_free_ex(struct ModifierData *md, const int flag);
 void          modifier_free(struct ModifierData *md);
 
 bool          modifier_unique_name(struct ListBase *modifiers, struct 
ModifierData *md);
diff --git a/source/blender/blenkernel/BKE_object.h 
b/source/blender/blenkernel/BKE_object.h
index 5578290c41a..3fea26e7359 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -73,7 +73,7 @@ void BKE_object_modifier_hook_reset(struct Object *ob, struct 
HookModifierData *
 bool BKE_object_support_modifier_type_check(struct Object *ob, int 
modifier_type);
 
 void BKE_object_link_modifiers(struct Object *ob_dst, const struct Object 
*ob_src);
-void BKE_object_free_modifiers(struct Object *ob);
+void BKE_object_free_modifiers(struct Object *ob, const int flag);
 
 void BKE_object_make_proxy(struct Object *ob, struct Object *target, struct 
Object *gob);
 void BKE_object_copy_proxy_drivers(struct Object *ob, struct Object *target);
diff --git a/source/blender/blenkernel/intern/mesh.c 
b/source/blender/blenkernel/intern/mesh.c
index c8b44511edd..6a45432e863 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -2429,7 +2429,7 @@ Mesh *BKE_mesh_new_from_object(
 
                        /* if getting the original caged mesh, delete object 
modifiers */
                        if (cage)
-                               BKE_object_free_modifiers(tmpobj);
+                               BKE_object_free_modifiers(tmpobj, 0);
 
                        /* copies the data */
                        copycu = tmpobj->data = BKE_curve_copy(bmain, (Curve *) 
ob->data);
diff --git a/source/blender/blenkernel/intern/modifier.c 
b/source/blender/blenkernel/intern/modifier.c
index d7a24f90dbe..ce04f3c31e2 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -136,16 +136,38 @@ ModifierData *modifier_new(int type)
        return md;
 }
 
-void modifier_free(ModifierData *md) 
+static void modifier_free_data_id_us_cb(void *UNUSED(userData), Object 
*UNUSED(ob), ID **idpoin, int cb_flag)
+{
+       ID *id = *idpoin;
+       if (id != NULL && (cb_flag & IDWALK_CB_USER) != 0) {
+               id_us_min(id);
+       }
+}
+
+void modifier_free_ex(ModifierData *md, const int flag)
 {
        const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 
+       if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
+               if (mti->foreachIDLink) {
+                       mti->foreachIDLink(md, NULL, 
modifier_free_data_id_us_cb, NULL);
+               }
+               else if (mti->foreachObjectLink) {
+                       mti->foreachObjectLink(md, NULL, 
(ObjectWalkFunc)modifier_free_data_id_us_cb, NULL);
+               }
+       }
+
        if (mti->freeData) mti->freeData(md);
        if (md->error) MEM_freeN(md->error);
 
        MEM_freeN(md);
 }
 
+void modifier_free(ModifierData *md)
+{
+       modifier_free_ex(md, 0);
+}
+
 bool modifier_unique_name(ListBase *modifiers, ModifierData *md)
 {
        if (modifiers && md) {
diff --git a/source/blender/blenkernel/intern/object.c 
b/source/blender/blenkernel/intern/object.c
index acc652fb1be..751cd733ae1 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -201,12 +201,12 @@ void BKE_object_free_curve_cache(Object *ob)
        }
 }
 
-void BKE_object_free_modifiers(Object *ob)
+void BKE_object_free_modifiers(Object *ob, const int flag)
 {
        ModifierData *md;
 
        while ((md = BLI_pophead(&ob->modifiers))) {
-               modifier_free(md);
+               modifier_free_ex(md, flag);
        }
 
        /* particle modifiers were freed, so free the particlesystems as well */
@@ -268,7 +268,7 @@ bool BKE_object_support_modifier_type_check(Object *ob, int 
modifier_type)
 void BKE_object_link_modifiers(struct Object *ob_dst, const struct Object 
*ob_src)
 {
        ModifierData *md;
-       BKE_object_free_modifiers(ob_dst);
+       BKE_object_free_modifiers(ob_dst, 0);
 
        if (!ELEM(ob_dst->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, 
OB_LATTICE)) {
                /* only objects listed above can have modifiers and linking 
them to objects
@@ -410,7 +410,8 @@ void BKE_object_free(Object *ob)
 {
        BKE_animdata_free((ID *)ob, false);
 
-       BKE_object_free_modifiers(ob);
+       /* BKE_<id>_free shall never touch to ID->us. Never ever. */
+       BKE_object_free_modifiers(ob, LIB_ID_CREATE_NO_USER_REFCOUNT);
 
        MEM_SAFE_FREE(ob->mat);
        MEM_SAFE_FREE(ob->matbits);
diff --git a/source/blender/editors/object/object_add.c 
b/source/blender/editors/object/object_add.c
index 0b486f8e5a3..6715879361a 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -1573,7 +1573,7 @@ static void curvetomesh(Main *bmain, Scene *scene, Object 
*ob)
        BKE_mesh_from_nurbs(ob); /* also does users */
 
        if (ob->type == OB_MESH) {
-               BKE_object_free_modifiers(ob);
+               BKE_object_free_modifiers(ob, 0);
 
                /* Game engine defaults for mesh objects */
                ob->body_type = OB_BODY_TYPE_STATIC;
@@ -1702,7 +1702,7 @@ static int convert_exec(bContext *C, wmOperator *op)
                                /* When 2 objects with linked data are 
selected, converting both
                                 * would keep modifiers on all but the 
converted object [#26003] */
                                if (ob->type == OB_MESH) {
-                                       BKE_object_free_modifiers(ob);  /* 
after derivedmesh calls! */
+                                       BKE_object_free_modifiers(ob, 0);  /* 
after derivedmesh calls! */
                                }
                        }
                }
@@ -1727,7 +1727,7 @@ static int convert_exec(bContext *C, wmOperator *op)
                        BKE_mesh_to_curve(scene, newob);
 
                        if (newob->type == OB_CURVE) {
-                               BKE_object_free_modifiers(newob);   /* after 
derivedmesh calls! */
+                               BKE_object_free_modifiers(newob, 0);   /* after 
derivedmesh calls! */
                                ED_rigidbody_object_remove(bmain, scene, newob);
                        }
                }
@@ -1760,7 +1760,7 @@ static int convert_exec(bContext *C, wmOperator *op)
 
                        /* re-tessellation is called by DM_to_mesh */
 
-                       BKE_object_free_modifiers(newob);   /* after 
derivedmesh calls! */
+                       BKE_object_free_modifiers(newob, 0);   /* after 
derivedmesh calls! */
                }
                else if (ob->type == OB_FONT) {
                        ob->flag |= OB_DONE;
diff --git a/source/blender/modifiers/intern/MOD_displace.c 
b/source/blender/modifiers/intern/MOD_displace.c
index d2d82ca23d2..72122fae6b4 100644
--- a/source/blender/modifiers/intern/MOD_displace.c
+++ b/source/blender/modifiers/intern/MOD_displace.c
@@ -81,14 +81,6 @@ static void copyData(ModifierData *md, ModifierData *target)
        modifier_copyData_generic(md, target);
 }
 
-static void freeData(ModifierData *md)
-{
-       DisplaceModifierData *dmd = (DisplaceModifierData *) md;
-       if (dmd->texture) {
-               id_us_min(&dmd->texture->id);
-       }
-}
-
 static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
 {
        DisplaceModifierData *dmd = (DisplaceModifierData *)md;
@@ -444,7 +436,7 @@ ModifierTypeInfo modifierType_Displace = {
        /* applyModifierEM */   NULL,
        /* initData */          initData,
        /* requiredDataMask */  requiredDataMask,
-       /* freeData */          freeData,
+       /* freeData */          NULL,
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* updateDepsgraph */   updateDepsgraph,
diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.c 
b/source/blender/modifiers/intern/MOD_meshsequencecache.c
index f3038a60315..04de6fae336 100644
--- a/source/blender/modifiers/intern/MOD_meshsequencecache.c
+++ b/source/blender/modifiers/intern/MOD_meshsequencecache.c
@@ -75,10 +75,6 @@ static void freeData(ModifierData *md)
 {
        MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *) md;
 
-       if (mcmd->cache_file) {
-               id_us_min(&mcmd->cache_file->id);
-       }
-
        if (mcmd->reader) {
 #ifdef WITH_ALEMBIC
                CacheReader_free(mcmd->reader);
diff --git a/source/blender/modifiers/intern/MOD_wave.c 
b/source/blender/modifiers/intern/MOD_wave.c
index 0c3781acb19..8fe29c78486 100644
--- a/source/blender/modifiers/intern/MOD_wave.c
+++ b/source/blender/modifiers/intern/MOD_wave.c
@@ -78,14 +78,6 @@ static void initData(ModifierData *md)
        wmd->defgrp_name[0] = 0;
 }
 
-static void freeData(ModifierData *md)
-{
-       WaveModifierData *wmd = (WaveModifierData *) md;
-       if (wmd->texture) {
-               id_us_min(&wmd->texture->id);
-       }
-}
-
 static void copyData(ModifierData *md, ModifierData *target)
 {
 #if 0
@@ -383,7 +375,7 @@ ModifierTypeInfo modifierType_Wave = {
        /* applyModifierEM */   NULL,
        /* initData */          initData,
        /* requiredDataMask */  requiredDataMask,
-       /* freeData */          freeData,
+       /* freeData */          NULL,
        /* isDisabled */        NULL,
        /* updateDepgraph */    updateDepgraph,
        /* updateDepsgraph */   updateDepsgraph,
diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c 
b/source/blender/modifiers/intern/MOD_weightvgedit.c
index aeb3df42622..8d77747b45d 100644
--- a/source/blender/modifiers/intern/MOD_weightvgedit.c
+++ b/source/blender/modifiers/intern/MOD_weightvgedit.c
@@ -79,10 +79,6 @@ static void freeData(ModifierData *md)
 {
        WeightVGEditModifierData *wmd = (WeightVGEditModifierData *) md;
        curvemapping_free(wmd->cmap_curve);
-
-       if (wmd->mask_texture) {
-               id_us_min(&wmd->mask_texture->id);
-       }
 }
 
 static void copyData(ModifierData *md, ModifierData *target)
diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c 
b/source/blender/modifiers/intern/MOD_weightvgmix.c
index 032e154e096..bd1f58e7d5e 100644
--- a/source/blender/modifiers/intern/MOD_weightvgmix.c
+++ b/source/blender/modifiers/intern/MOD_weightvgmix.c
@@ -126,14 +126,6 @@ static void initData(ModifierData *md)
        wmd->mask_tex_mapping       = MOD_DISP_MAP_LOCAL;
 }
 
-static void freeData(ModifierData *md)
-{
-       WeightVGMixModifierData *wmd = (WeightVGMixModifierData *) md;
-       if (wmd->mask_texture) {
-               id_us_min(&wmd->mask_texture->id);
-       }
-}
-
 static void copyData(ModifierData *md, ModifierData *target)
 {
 #if 0
@@ -427,7 +419,7 @@ ModifierTypeInfo modifierType_WeightVGMix = {
        /* applyModifierEM */   NULL,
        /* initData */          initData,
        /* requiredDataMask */  requiredDataMask,
-       /* freeData */          freeData,
+       /* freeData */    

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to