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:
authorJacques Lucke <jacques@blender.org>2022-07-25 12:14:42 +0300
committerJacques Lucke <jacques@blender.org>2022-07-25 12:14:42 +0300
commitcacdea7f4a5b49d4b2ea2190373c822974aad163 (patch)
tree2ef3c0594e789e11af4caa82d20b97053628bf18 /source/blender/blenkernel/intern/curves_geometry.cc
parent44258b5ad0737140d7d1026cc540e3f94ea05566 (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/blenkernel/intern/curves_geometry.cc')
-rw-r--r--source/blender/blenkernel/intern/curves_geometry.cc17
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) {