[Bf-blender-cvs] [cacdea7f4a5] master: Fix: crash when accessing attributes from multiple threads
Jacques Lucke
noreply at git.blender.org
Mon Jul 25 11:14:57 CEST 2022
Commit: cacdea7f4a5b49d4b2ea2190373c822974aad163
Author: Jacques Lucke
Date: Mon Jul 25 11:14:42 2022 +0200
Branches: master
https://developer.blender.org/rBcacdea7f4a5b49d4b2ea2190373c822974aad163
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.
===================================================================
M source/blender/blenkernel/intern/curves_geometry.cc
===================================================================
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) {
More information about the Bf-blender-cvs
mailing list