[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