[Bf-blender-cvs] [d484eb8] master: Fix T38421: Vertex Parenting & Triangle Vertex Parenting causes segfaults.

Sergey Sharybin noreply at git.blender.org
Mon Feb 3 14:13:34 CET 2014


Commit: d484eb8c25137d7ecb9d722e593e7b70cedad458
Author: Sergey Sharybin
Date:   Mon Feb 3 19:12:04 2014 +0600
https://developer.blender.org/rBd484eb8c25137d7ecb9d722e593e7b70cedad458

Fix T38421: Vertex Parenting & Triangle Vertex Parenting causes segfaults.

Issue was caused by clearing dirty flags from element table in bmesh before
the data was fully ready.

This confused checks happening from threads and some threads did consider
element table is usable while other thread was still filling it in.

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

M	source/blender/bmesh/intern/bmesh_mesh.c

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

diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 701fdf0..175ef21 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -687,7 +687,6 @@ void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
 			bm->vtable = MEM_mallocN(sizeof(void **) * bm->totvert, "bm->vtable");
 			bm->vtable_tot = bm->totvert;
 		}
-		bm->elem_table_dirty &= ~BM_VERT;
 	}
 	if (htype_needed & BM_EDGE) {
 		if (bm->etable && bm->totedge <= bm->etable_tot && bm->totedge * 2 >= bm->etable_tot) {
@@ -699,7 +698,6 @@ void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
 			bm->etable = MEM_mallocN(sizeof(void **) * bm->totedge, "bm->etable");
 			bm->etable_tot = bm->totedge;
 		}
-		bm->elem_table_dirty &= ~BM_EDGE;
 	}
 	if (htype_needed & BM_FACE) {
 		if (bm->ftable && bm->totface <= bm->ftable_tot && bm->totface * 2 >= bm->ftable_tot) {
@@ -711,7 +709,6 @@ void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
 			bm->ftable = MEM_mallocN(sizeof(void **) * bm->totface, "bm->ftable");
 			bm->ftable_tot = bm->totface;
 		}
-		bm->elem_table_dirty &= ~BM_FACE;
 	}
 
 #pragma omp parallel sections if (bm->totvert + bm->totedge + bm->totface >= BM_OMP_LIMIT)
@@ -735,6 +732,20 @@ void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
 			}
 		}
 	}
+
+	/* Only clear dirty flags when all the pointers and data are actually valid.
+	 * This prevents possible threading issues when dirty flag check failed but
+	 * data wasn't ready still.
+	 */
+	if (htype_needed & BM_VERT) {
+		bm->elem_table_dirty &= ~BM_VERT;
+	}
+	if (htype_needed & BM_EDGE) {
+		bm->elem_table_dirty &= ~BM_EDGE;
+	}
+	if (htype_needed & BM_FACE) {
+		bm->elem_table_dirty &= ~BM_FACE;
+	}
 }
 
 /* use BM_mesh_elem_table_ensure where possible to avoid full rebuild */




More information about the Bf-blender-cvs mailing list