[Bf-blender-cvs] [56dae06] free-refcount-ids: Cleanup of free/unlink/release of ID: mesh/curve/mball.

Bastien Montagne noreply at git.blender.org
Thu Sep 24 20:46:36 CEST 2015


Commit: 56dae06c56ac869a777cdb49ccf4d446fc18d4e2
Author: Bastien Montagne
Date:   Thu Sep 24 19:53:38 2015 +0200
Branches: free-refcount-ids
https://developer.blender.org/rB56dae06c56ac869a777cdb49ccf4d446fc18d4e2

Cleanup of free/unlink/release of ID: mesh/curve/mball.

Renamed their `_unlink()` functions to `_release_datablocks()`, since they do not
unlink anything (not in the sense `BKE_object_unklink()` does, at least)!

Also, added a `const bool do_id_user` to their `_free()`, for consistency, now
relevant `_release_datablocks()` func only gets called when this option is set.

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

M	source/blender/blenkernel/BKE_curve.h
M	source/blender/blenkernel/BKE_mball.h
M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/curve.c
M	source/blender/blenkernel/intern/library.c
M	source/blender/blenkernel/intern/mball.c
M	source/blender/blenkernel/intern/mesh.c
M	source/blender/blenkernel/intern/object.c

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

diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index a03dd28..b1f7903 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -66,8 +66,8 @@ typedef struct CurveCache {
 #define CU_DO_2DFILL(cu)  ((((cu)->flag & CU_3D) == 0) && (((cu)->flag & (CU_FRONT | CU_BACK)) != 0))
 
 /* ** Curve ** */
-void BKE_curve_unlink(struct Curve *cu);
-void BKE_curve_free(struct Curve *cu);
+void BKE_curve_release_datablocks(struct Curve *cu);
+void BKE_curve_free(struct Curve *cu, const bool do_id_user);
 void BKE_curve_editfont_free(struct Curve *cu);
 struct Curve *BKE_curve_add(struct Main *bmain, const char *name, int type);
 struct Curve *BKE_curve_copy(struct Curve *cu);
diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h
index 62cd500..d2b9e2d 100644
--- a/source/blender/blenkernel/BKE_mball.h
+++ b/source/blender/blenkernel/BKE_mball.h
@@ -38,8 +38,8 @@ struct Object;
 struct Scene;
 struct MetaElem;
 
-void BKE_mball_unlink(struct MetaBall *mb);
-void BKE_mball_free(struct MetaBall *mb);
+void BKE_mball_release_datablocks(struct MetaBall *mb);
+void BKE_mball_free(struct MetaBall *mb, const bool do_id_user);
 struct MetaBall *BKE_mball_add(struct Main *bmain, const char *name);
 struct MetaBall *BKE_mball_copy(struct MetaBall *mb);
 
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index a27688c..7c6ea95 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -80,8 +80,8 @@ int poly_get_adj_loops_from_vert(
 
 int BKE_mesh_edge_other_vert(const struct MEdge *e, int v);
 
-void BKE_mesh_unlink(struct Mesh *me);
-void BKE_mesh_free(struct Mesh *me, int unlink);
+void BKE_mesh_release_datablocks(struct Mesh *me);
+void BKE_mesh_free(struct Mesh *me, const bool do_id_user);
 struct Mesh *BKE_mesh_add(struct Main *bmain, const char *name);
 struct Mesh *BKE_mesh_copy_ex(struct Main *bmain, struct Mesh *me);
 struct Mesh *BKE_mesh_copy(struct Mesh *me);
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 8d7d62b..8428ae4 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -69,33 +69,41 @@ static int cu_isectLL(const float v1[3], const float v2[3], const float v3[3], c
                       short cox, short coy,
                       float *lambda, float *mu, float vec[3]);
 
-void BKE_curve_unlink(Curve *cu)
+/**
+ * Release all datablocks (ID) used by this curve (datablocks are never freed, they are just unreferenced).
+ *
+ * @param cu The curve which has to release its data.
+ */
+void BKE_curve_release_datablocks(Curve *cu)
 {
 	int a;
 
 	for (a = 0; a < cu->totcol; a++) {
-		if (cu->mat[a]) cu->mat[a]->id.us--;
-		cu->mat[a] = NULL;
+		if (cu->mat[a]) {
+			cu->mat[a]->id.us--;
+			cu->mat[a] = NULL;
+		}
 	}
-	if (cu->vfont)
+	if (cu->vfont) {
 		cu->vfont->id.us--;
-	cu->vfont = NULL;
-
-	if (cu->vfontb)
+		cu->vfont = NULL;
+	}
+	if (cu->vfontb) {
 		cu->vfontb->id.us--;
-	cu->vfontb = NULL;
-
-	if (cu->vfonti)
+		cu->vfontb = NULL;
+	}
+	if (cu->vfonti) {
 		cu->vfonti->id.us--;
-	cu->vfonti = NULL;
-
-	if (cu->vfontbi)
+		cu->vfonti = NULL;
+	}
+	if (cu->vfontbi) {
 		cu->vfontbi->id.us--;
-	cu->vfontbi = NULL;
-
-	if (cu->key)
+		cu->vfontbi = NULL;
+	}
+	if (cu->key) {
 		cu->key->id.us--;
-	cu->key = NULL;
+		cu->key = NULL;
+	}
 }
 
 /* frees editcurve entirely */
@@ -139,14 +147,24 @@ void BKE_curve_editNurb_free(Curve *cu)
 	}
 }
 
-/* don't free curve itself */
-void BKE_curve_free(Curve *cu)
+/**
+ * Free (or release) any data used by this curve (does not free the curve itself).
+ *
+ * \param cu The curve to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this curve are 'released'
+ *                   (their user count is decreased).
+ */
+void BKE_curve_free(Curve *cu, const bool do_id_user)
 {
 	BKE_nurbList_free(&cu->nurb);
 	BKE_curve_editfont_free(cu);
 
 	BKE_curve_editNurb_free(cu);
-	BKE_curve_unlink(cu);
+
+	if (do_id_user) {
+		BKE_curve_release_datablocks(cu);
+	}
+
 	BKE_animdata_free((ID *)cu);
 
 	if (cu->mat)
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 9fb0cb4..11abd2c 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -949,13 +949,13 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool do_id_user)
 			BKE_object_free_ex((Object *)id, do_id_user);
 			break;
 		case ID_ME:
-			BKE_mesh_free((Mesh *)id, 1);
+			BKE_mesh_free((Mesh *)id, do_id_user);
 			break;
 		case ID_CU:
-			BKE_curve_free((Curve *)id);
+			BKE_curve_free((Curve *)id, do_id_user);
 			break;
 		case ID_MB:
-			BKE_mball_free((MetaBall *)id);
+			BKE_mball_free((MetaBall *)id, do_id_user);
 			break;
 		case ID_MA:
 			BKE_material_free((Material *)id);
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index c09cd1a..33e0933 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -66,21 +66,36 @@
 
 /* Functions */
 
-void BKE_mball_unlink(MetaBall *mb)
+/**
+ * Release all datablocks (ID) used by this mball (datablocks are never freed, they are just unreferenced).
+ *
+ * @param mb The mball which has to release its data.
+ */
+void BKE_mball_release_datablocks(MetaBall *mb)
 {
 	int a;
 	
 	for (a = 0; a < mb->totcol; a++) {
-		if (mb->mat[a]) mb->mat[a]->id.us--;
-		mb->mat[a] = NULL;
+		if (mb->mat[a]) {
+			mb->mat[a]->id.us--;
+			mb->mat[a] = NULL;
+		}
 	}
 }
 
 
-/* do not free mball itself */
-void BKE_mball_free(MetaBall *mb)
+/**
+ * Free (or release) any data used by this mball (does not free the mball itself).
+ *
+ * \param mb The mball to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this mball are 'released'
+ *                   (their user count is decreased).
+ */
+void BKE_mball_free(MetaBall *mb, const bool do_id_user)
 {
-	BKE_mball_unlink(mb);
+	if (do_id_user) {
+		BKE_mball_release_datablocks(mb);
+	}
 	
 	if (mb->adt) {
 		BKE_animdata_free((ID *)mb);
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 8c89a72..f0da793 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -430,32 +430,50 @@ bool BKE_mesh_has_custom_loop_normals(Mesh *me)
  * we need a more generic method, like the expand() functions in
  * readfile.c */
 
-void BKE_mesh_unlink(Mesh *me)
+
+/**
+ * Release all datablocks (ID) used by this mesh (datablocks are never freed, they are just unreferenced).
+ *
+ * \param me The mesh which has to release its data.
+ */
+void BKE_mesh_release_datablocks(Mesh *me)
 {
 	int a;
 	
-	if (me == NULL) return;
+	if (me == NULL)
+		return;
 
 	if (me->mat) {
 		for (a = 0; a < me->totcol; a++) {
-			if (me->mat[a]) me->mat[a]->id.us--;
-			me->mat[a] = NULL;
+			if (me->mat[a]) {
+				me->mat[a]->id.us--;
+				me->mat[a] = NULL;
+			}
 		}
 	}
 
 	if (me->key) {
 		me->key->id.us--;
+		me->key = NULL;
 	}
-	me->key = NULL;
 	
-	if (me->texcomesh) me->texcomesh = NULL;
+	if (me->texcomesh) {
+		me->texcomesh = NULL;  /* No user refcount handling here??? */
+	}
 }
 
-/* do not free mesh itself */
-void BKE_mesh_free(Mesh *me, int unlink)
+/**
+ * Free (or release) any data used by this mesh (does not free the mesh itself).
+ *
+ * \param me The mesh to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this mesh are 'released'
+ *                   (their user count is decreased).
+ */
+void BKE_mesh_free(Mesh *me, const bool do_id_user)
 {
-	if (unlink)
-		BKE_mesh_unlink(me);
+	if (do_id_user) {
+		BKE_mesh_release_datablocks(me);
+	}
 
 	CustomData_free(&me->vdata, me->totvert);
 	CustomData_free(&me->edata, me->totedge);
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 526a71b..7231ca7 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -393,13 +393,13 @@ void BKE_object_free_ex(Object *ob, bool do_id_user)
 		if (id->us == 0 && id->lib == NULL) {
 			switch (ob->type) {
 				case OB_MESH:
-					BKE_mesh_unlink((Mesh *)id);
+					BKE_mesh_release_datablocks((Mesh *)id);
 					break;
 				case OB_CURVE:
-					BKE_curve_unlink((Curve *)id);
+					BKE_curve_release_datablocks((Curve *)id);
 					break;
 				case OB_MBALL:
-					BKE_mball_unlink((MetaBall *)id);
+					BKE_mball_release_datablocks((MetaBall *)id);
 					break;
 			}
 		}




More information about the Bf-blender-cvs mailing list