[Bf-blender-cvs] [7c57f980f8c] cycles-x: Ensure unique names of tile buffer files in Cycles X

Sergey Sharybin noreply at git.blender.org
Wed Sep 15 19:35:10 CEST 2021


Commit: 7c57f980f8ceea5ba5b6a52644b595929094c53f
Author: Sergey Sharybin
Date:   Wed Sep 15 16:04:35 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB7c57f980f8ceea5ba5b6a52644b595929094c53f

Ensure unique names of tile buffer files in Cycles X

It is possible that processing and deletion of tile buffer from disk
will happen after tile manager was re-allocated. This happens, for
example, when rendering multiple view layers in Blender: each view
layer will reset session (which re-creates the tile manager).

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

M	intern/cycles/render/tile.cpp

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

diff --git a/intern/cycles/render/tile.cpp b/intern/cycles/render/tile.cpp
index 079dd745a0b..15117873099 100644
--- a/intern/cycles/render/tile.cpp
+++ b/intern/cycles/render/tile.cpp
@@ -16,6 +16,8 @@
 
 #include "render/tile.h"
 
+#include <atomic>
+
 #include "graph/node.h"
 #include "render/pass.h"
 #include "util/util_algorithm.h"
@@ -37,6 +39,9 @@ static const char *ATTR_BUFFER_FULL_Y = "cycles.buffer.full_y";
 static const char *ATTR_BUFFER_FULL_WIDTH = "cycles.buffer.full_width";
 static const char *ATTR_BUFFER_FULL_HEIGHT = "cycles.buffer.full_height";
 
+/* Global counter of ToleManager object instances. */
+static std::atomic<uint64_t> g_instance_index = 0;
+
 /* Construct names of EXR channels which will ensure order of all channels to match exact offsets
  * in render buffers corresponding to the given passes.
  *
@@ -346,11 +351,17 @@ static bool configure_buffer_from_image_spec(BufferParams *buffer_params,
 TileManager::TileManager()
 {
   /* Append an unique part to the file name, so that if the temp directory is not set to be a
-   * process-specific there is no conflit between different Cycles process instances. Use process
-   * ID to separate different processes, and address of the tile manager to identify different
-   * Cycles sessions within the same process. */
+   * process-specific there is no conflit between different Cycles process instances.
+   *
+   * Use process ID to separate different processes.
+   * To ensure uniqueness from within a process use combination of object address and instance
+   * index. This solves problem of possible object re-allocation at the same time, and solves
+   * possible conflict when the counter overflows while there are still active instances of the
+   * class. */
+  const int tile_manager_id = g_instance_index.fetch_add(1, std::memory_order_relaxed);
   const string unique_part = to_string(system_self_process_id()) + "-" +
-                             to_string(reinterpret_cast<uintptr_t>(this));
+                             to_string(reinterpret_cast<uintptr_t>(this)) + "-" +
+                             to_string(tile_manager_id);
   tile_filepath_ = path_temp_get("cycles-tile-buffer-" + unique_part + ".exr");
 }



More information about the Bf-blender-cvs mailing list