[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