[Bf-blender-cvs] [467b0aa227d] master: Fix T68320: measure tool memoryleak

mano-wii noreply at git.blender.org
Tue Aug 6 17:50:26 CEST 2019


Commit: 467b0aa227d454f714e43d2421a86c4dfac92d1e
Author: mano-wii
Date:   Tue Aug 6 12:50:08 2019 -0300
Branches: master
https://developer.blender.org/rB467b0aa227d454f714e43d2421a86c4dfac92d1e

Fix T68320: measure tool memoryleak

It was a stupid mistake with the wrong pointer being referenced.
It was a serious problem because the memory leak was considerable.

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

M	source/blender/blenkernel/intern/bvhutils.c
M	source/blender/editors/transform/transform_snap_object.c

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

diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index e51d15ee152..8c125d1609b 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -553,6 +553,7 @@ BVHTree *bvhtree_from_editmesh_verts(BVHTreeFromEditMesh *data,
         /* Save on cache for later use */
         /* printf("BVHTree built and saved on cache\n"); */
         bvhcache_insert(bvh_cache, data->tree, BVHTREE_FROM_EM_VERTS);
+        data->cached = true;
       }
       BLI_rw_mutex_unlock(&cache_rwlock);
     }
@@ -743,6 +744,7 @@ BVHTree *bvhtree_from_editmesh_edges(BVHTreeFromEditMesh *data,
         /* Save on cache for later use */
         /* printf("BVHTree built and saved on cache\n"); */
         bvhcache_insert(bvh_cache, data->tree, BVHTREE_FROM_EM_EDGES);
+        data->cached = true;
       }
       BLI_rw_mutex_unlock(&cache_rwlock);
     }
diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index 3f17be605b2..67bd107ab49 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -573,11 +573,11 @@ static bool raycastEditMesh(SnapObjectContext *sctx,
 
   BVHTreeFromEditMesh *treedata = sod->bvh_trees[2];
 
-  BVHCache *em_bvh_cache = ((Mesh *)em->ob->data)->runtime.bvh_cache;
+  BVHCache **em_bvh_cache = &((Mesh *)em->ob->data)->runtime.bvh_cache;
 
   if (sctx->callbacks.edit_mesh.test_face_fn == NULL) {
     /* The tree is owned by the Mesh and may have been freed since we last used! */
-    if (!bvhcache_has_tree(em_bvh_cache, treedata->tree)) {
+    if (treedata->tree && !bvhcache_has_tree(*em_bvh_cache, treedata->tree)) {
       free_bvhtree_from_editmesh(treedata);
     }
   }
@@ -605,7 +605,7 @@ static bool raycastEditMesh(SnapObjectContext *sctx,
     else {
       /* Only cache if bvhtree is created without a mask.
        * This helps keep a standardized bvhtree in cache. */
-      bvh_cache = &em_bvh_cache;
+      bvh_cache = em_bvh_cache;
     }
 
     bvhtree_from_editmesh_looptri_ex(
@@ -2195,7 +2195,7 @@ static short snapEditMesh(SnapObjectContext *sctx,
     return 0;
   }
 
-  BVHCache *em_bvh_cache = ((Mesh *)em->ob->data)->runtime.bvh_cache;
+  BVHCache **em_bvh_cache = &((Mesh *)em->ob->data)->runtime.bvh_cache;
 
   if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) {
     if (sod->bvh_trees[0] == NULL) {
@@ -2205,7 +2205,7 @@ static short snapEditMesh(SnapObjectContext *sctx,
 
     if (sctx->callbacks.edit_mesh.test_vert_fn == NULL) {
       /* The tree is owned by the Mesh and may have been freed since we last used! */
-      if (!bvhcache_has_tree(em_bvh_cache, treedata_vert->tree)) {
+      if (treedata_vert->tree && !bvhcache_has_tree(*em_bvh_cache, treedata_vert->tree)) {
         free_bvhtree_from_editmesh(treedata_vert);
       }
     }
@@ -2227,7 +2227,7 @@ static short snapEditMesh(SnapObjectContext *sctx,
         MEM_freeN(verts_mask);
       }
       else {
-        bvhtree_from_editmesh_verts(treedata_vert, em, 0.0f, 2, 6, &em_bvh_cache);
+        bvhtree_from_editmesh_verts(treedata_vert, em, 0.0f, 2, 6, em_bvh_cache);
       }
     }
   }
@@ -2240,7 +2240,7 @@ static short snapEditMesh(SnapObjectContext *sctx,
 
     if (sctx->callbacks.edit_mesh.test_edge_fn == NULL) {
       /* The tree is owned by the Mesh and may have been freed since we last used! */
-      if (!bvhcache_has_tree(em_bvh_cache, treedata_edge->tree)) {
+      if (treedata_edge->tree && !bvhcache_has_tree(*em_bvh_cache, treedata_edge->tree)) {
         free_bvhtree_from_editmesh(treedata_edge);
       }
     }
@@ -2262,7 +2262,7 @@ static short snapEditMesh(SnapObjectContext *sctx,
         MEM_freeN(edges_mask);
       }
       else {
-        bvhtree_from_editmesh_edges(treedata_edge, em, 0.0f, 2, 6, &em_bvh_cache);
+        bvhtree_from_editmesh_edges(treedata_edge, em, 0.0f, 2, 6, em_bvh_cache);
       }
     }
   }



More information about the Bf-blender-cvs mailing list