[Bf-blender-cvs] [68e77e6f80d] gpencil-new-data-proposal: Add mutex to cached frame index masks

Falk David noreply at git.blender.org
Tue May 10 18:42:38 CEST 2022


Commit: 68e77e6f80dde470cf7d06978bf3370bcc2adf73
Author: Falk David
Date:   Tue May 10 18:42:31 2022 +0200
Branches: gpencil-new-data-proposal
https://developer.blender.org/rB68e77e6f80dde470cf7d06978bf3370bcc2adf73

Add mutex to cached frame index masks

===================================================================

M	source/blender/blenkernel/intern/gpencil_new_proposal_test.cc

===================================================================

diff --git a/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc b/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
index 13ea1252fb7..a5d770f659f 100644
--- a/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
+++ b/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
@@ -43,11 +43,12 @@ class GPDataRuntime {
   /**
    * Cache that maps the index of a layer to the index mask of the frames in that layer.
    */
-  mutable Map<int, Vector<int64_t>> cached_frame_index_masks;
+  mutable Map<int, Vector<int64_t>> frame_index_masks_cache;
+  mutable std::mutex frame_index_masks_cache_mutex;
 
   IndexMask get_cached_frame_index_mask(int layer_index)
   {
-    return cached_frame_index_masks.lookup(layer_index).as_span();
+    return frame_index_masks_cache.lookup(layer_index).as_span();
   }
 };
 
@@ -276,7 +277,13 @@ class GPData : public ::GPData {
     }
 
     /* If the indices are cached for this layer, use the cache. */
-    if (this->runtime->cached_frame_index_masks.contains(layer_index)) {
+    if (this->runtime->frame_index_masks_cache.contains(layer_index)) {
+      return this->runtime->get_cached_frame_index_mask(layer_index);
+    }
+
+    /* A double checked lock. */
+    std::scoped_lock{this->runtime->frame_index_masks_cache_mutex};
+    if (this->runtime->frame_index_masks_cache.contains(layer_index)) {
       return this->runtime->get_cached_frame_index_mask(layer_index);
     }
 
@@ -287,7 +294,7 @@ class GPData : public ::GPData {
         });
 
     /* Cache the resulting index mask. */
-    this->runtime->cached_frame_index_masks.add(layer_index, std::move(indices));
+    this->runtime->frame_index_masks_cache.add(layer_index, std::move(indices));
     return mask;
   }
 
@@ -441,7 +448,7 @@ class GPData : public ::GPData {
     std::sort(this->frames_for_write().begin(), this->frames_for_write().end());
 
     /* Clear the cached indices since they are probably no longer valid. */
-    this->runtime->cached_frame_index_masks = {};
+    this->runtime->frame_index_masks_cache.clear();
   }
 };
 
@@ -593,13 +600,13 @@ TEST(gpencil_proposal, IterateOverFramesOnLayer)
   }
 
   IndexMask indices_frames_layer1 = data.frames_on_layer(layer1_idx);
-  EXPECT_TRUE(data.runtime->cached_frame_index_masks.contains(0));
+  EXPECT_TRUE(data.runtime->frame_index_masks_cache.contains(layer1_idx));
   for (const int i : indices_frames_layer1.index_range()) {
     EXPECT_EQ(data.frames()[indices_frames_layer1[i]].start, frame_numbers_sorted1[i]);
   }
 
   IndexMask indices_frames_layer2 = data.frames_on_layer(layer2_idx);
-  EXPECT_TRUE(data.runtime->cached_frame_index_masks.contains(1));
+  EXPECT_TRUE(data.runtime->frame_index_masks_cache.contains(layer2_idx));
   for (const int i : indices_frames_layer2.index_range()) {
     EXPECT_EQ(data.frames()[indices_frames_layer2[i]].start, frame_numbers_sorted2[i]);
   }



More information about the Bf-blender-cvs mailing list