Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-02-03 17:12:04 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2014-02-03 17:13:25 +0400
commitd484eb8c25137d7ecb9d722e593e7b70cedad458 (patch)
treedb8cc8b923a1a3d35991bae20ef2975074b11fc4 /source/blender/bmesh
parent89a846df51224ff829b8683dad93024e0b230319 (diff)
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.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 701fdf07710..175ef21953d 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 */