[Bf-blender-cvs] [91b455c00f2] blender-v2.83-release: Fix memory leak calculating deform modifiers in edit-mode

Campbell Barton noreply at git.blender.org
Thu Jul 2 09:33:36 CEST 2020


Commit: 91b455c00f2830601c3216e7b41974f739d1541f
Author: Campbell Barton
Date:   Wed Jun 24 22:09:40 2020 +1000
Branches: blender-v2.83-release
https://developer.blender.org/rB91b455c00f2830601c3216e7b41974f739d1541f

Fix memory leak calculating deform modifiers in edit-mode

This bug goes back to 2.80 but doesn't seem to have been reported.

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

M	source/blender/blenkernel/BKE_mesh_runtime.h
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenkernel/intern/mesh_runtime.c

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

diff --git a/source/blender/blenkernel/BKE_mesh_runtime.h b/source/blender/blenkernel/BKE_mesh_runtime.h
index fdddafcc71f..468ec6a44cd 100644
--- a/source/blender/blenkernel/BKE_mesh_runtime.h
+++ b/source/blender/blenkernel/BKE_mesh_runtime.h
@@ -49,6 +49,7 @@ void BKE_mesh_runtime_looptri_recalc(struct Mesh *mesh);
 const struct MLoopTri *BKE_mesh_runtime_looptri_ensure(struct Mesh *mesh);
 bool BKE_mesh_runtime_ensure_edit_data(struct Mesh *mesh);
 bool BKE_mesh_runtime_clear_edit_data(struct Mesh *mesh);
+bool BKE_mesh_runtime_reset_edit_data(struct Mesh *mesh);
 void BKE_mesh_runtime_clear_geometry(struct Mesh *mesh);
 void BKE_mesh_runtime_clear_cache(struct Mesh *mesh);
 
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index baef2b2290e..f3d34b3d272 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1654,7 +1654,9 @@ static void editbmesh_calc_modifiers(struct Depsgraph *depsgraph,
       else {
         Mesh *me_orig = mesh_input;
         if (me_orig->id.tag & LIB_TAG_COPIED_ON_WRITE) {
-          BKE_mesh_runtime_ensure_edit_data(me_orig);
+          if (!BKE_mesh_runtime_ensure_edit_data(me_orig)) {
+            BKE_mesh_runtime_reset_edit_data(me_orig);
+          }
           me_orig->runtime.edit_data->vertexCos = MEM_dupallocN(deformed_verts);
         }
         mesh_cage = BKE_mesh_from_editmesh_with_coords_thin_wrap(
diff --git a/source/blender/blenkernel/intern/mesh_runtime.c b/source/blender/blenkernel/intern/mesh_runtime.c
index aa3586d1e3d..cfe9bf0a766 100644
--- a/source/blender/blenkernel/intern/mesh_runtime.c
+++ b/source/blender/blenkernel/intern/mesh_runtime.c
@@ -202,26 +202,31 @@ bool BKE_mesh_runtime_ensure_edit_data(struct Mesh *mesh)
   return true;
 }
 
+bool BKE_mesh_runtime_reset_edit_data(Mesh *mesh)
+{
+  EditMeshData *edit_data = mesh->runtime.edit_data;
+  if (edit_data == NULL) {
+    return false;
+  }
+
+  MEM_SAFE_FREE(edit_data->polyCos);
+  MEM_SAFE_FREE(edit_data->polyNos);
+  MEM_SAFE_FREE(edit_data->vertexCos);
+  MEM_SAFE_FREE(edit_data->vertexNos);
+
+  return true;
+}
+
 bool BKE_mesh_runtime_clear_edit_data(Mesh *mesh)
 {
   if (mesh->runtime.edit_data == NULL) {
     return false;
   }
+  BKE_mesh_runtime_reset_edit_data(mesh);
 
-  if (mesh->runtime.edit_data->polyCos != NULL) {
-    MEM_freeN((void *)mesh->runtime.edit_data->polyCos);
-  }
-  if (mesh->runtime.edit_data->polyNos != NULL) {
-    MEM_freeN((void *)mesh->runtime.edit_data->polyNos);
-  }
-  if (mesh->runtime.edit_data->vertexCos != NULL) {
-    MEM_freeN((void *)mesh->runtime.edit_data->vertexCos);
-  }
-  if (mesh->runtime.edit_data->vertexNos != NULL) {
-    MEM_freeN((void *)mesh->runtime.edit_data->vertexNos);
-  }
+  MEM_freeN(mesh->runtime.edit_data);
+  mesh->runtime.edit_data = NULL;
 
-  MEM_SAFE_FREE(mesh->runtime.edit_data);
   return true;
 }



More information about the Bf-blender-cvs mailing list