diff options
author | Jacques Lucke <jacques@blender.org> | 2022-07-25 12:14:42 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2022-07-25 12:14:42 +0300 |
commit | cacdea7f4a5b49d4b2ea2190373c822974aad163 (patch) | |
tree | 2ef3c0594e789e11af4caa82d20b97053628bf18 /source/blender | |
parent | 44258b5ad0737140d7d1026cc540e3f94ea05566 (diff) |
Fix: crash when accessing attributes from multiple threads
Calling two non-const methods on a `MutableAttributeAccessor`
at the same time in multiple threads is not safe.
While I don't know what caused the crash here exactly, I do know
that it happens while looking up the attribute for writing, which
may modify the unterlying geometry. I couldn't reproduce the
bug with a debug build or without threading.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/curves_geometry.cc | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/source/blender/blenkernel/intern/curves_geometry.cc b/source/blender/blenkernel/intern/curves_geometry.cc index f5c040a6fee..227ebc73c89 100644 --- a/source/blender/blenkernel/intern/curves_geometry.cc +++ b/source/blender/blenkernel/intern/curves_geometry.cc @@ -1163,8 +1163,8 @@ static CurvesGeometry copy_with_removed_points(const CurvesGeometry &curves, threading::parallel_invoke( /* Initialize curve offsets. */ [&]() { new_curves.offsets_for_write().copy_from(new_curve_offsets); }, - /* Copy over point attributes. */ [&]() { + /* Copy over point attributes. */ for (auto &attribute : bke::retrieve_attributes_for_transfer( curves.attributes(), new_curves.attributes_for_write(), ATTR_DOMAIN_MASK_POINT)) { threading::parallel_for(copy_point_ranges.index_range(), 128, [&](IndexRange range) { @@ -1179,11 +1179,10 @@ static CurvesGeometry copy_with_removed_points(const CurvesGeometry &curves, }); attribute.dst.finish(); } - }, - /* Copy over curve attributes. - * In some cases points are just dissolved, so the the number of - * curves will be the same. That could be optimized in the future. */ - [&]() { + + /* Copy over curve attributes. + * In some cases points are just dissolved, so the the number of + * curves will be the same. That could be optimized in the future. */ for (auto &attribute : bke::retrieve_attributes_for_transfer( curves.attributes(), new_curves.attributes_for_write(), ATTR_DOMAIN_MASK_CURVE)) { if (new_curves.curves_num() == curves.curves_num()) { @@ -1260,8 +1259,8 @@ static CurvesGeometry copy_with_removed_curves(const CurvesGeometry &curves, } }); }, - /* Copy over point attributes. */ [&]() { + /* Copy over point attributes. */ for (auto &attribute : bke::retrieve_attributes_for_transfer( curves.attributes(), new_curves.attributes_for_write(), ATTR_DOMAIN_MASK_POINT)) { threading::parallel_for(old_curve_ranges.index_range(), 128, [&](IndexRange range) { @@ -1275,9 +1274,7 @@ static CurvesGeometry copy_with_removed_curves(const CurvesGeometry &curves, }); attribute.dst.finish(); } - }, - /* Copy over curve attributes. */ - [&]() { + /* Copy over curve attributes. */ for (auto &attribute : bke::retrieve_attributes_for_transfer( curves.attributes(), new_curves.attributes_for_write(), ATTR_DOMAIN_MASK_CURVE)) { threading::parallel_for(old_curve_ranges.index_range(), 128, [&](IndexRange range) { |