diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-02-03 17:12:04 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-02-03 17:13:25 +0400 |
commit | d484eb8c25137d7ecb9d722e593e7b70cedad458 (patch) | |
tree | db8cc8b923a1a3d35991bae20ef2975074b11fc4 /source/blender | |
parent | 89a846df51224ff829b8683dad93024e0b230319 (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')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mesh.c | 17 |
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 */ |