[Bf-blender-cvs] [8b87fc1c77f] master: BLI: add initial wrapper for tbb::enumerable_thread_specific

Jacques Lucke noreply at git.blender.org
Thu May 13 13:20:43 CEST 2021


Commit: 8b87fc1c77f7f87434c226d3931635f5896d0c93
Author: Jacques Lucke
Date:   Thu May 13 13:20:16 2021 +0200
Branches: master
https://developer.blender.org/rB8b87fc1c77f7f87434c226d3931635f5896d0c93

BLI: add initial wrapper for tbb::enumerable_thread_specific

The wrapper is necessary to support building without TBB.
This class is used by the upcoming new evaluator for
geometry nodes.

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

A	source/blender/blenlib/BLI_enumerable_thread_specific.hh
M	source/blender/blenlib/CMakeLists.txt

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

diff --git a/source/blender/blenlib/BLI_enumerable_thread_specific.hh b/source/blender/blenlib/BLI_enumerable_thread_specific.hh
new file mode 100644
index 00000000000..89be4cad848
--- /dev/null
+++ b/source/blender/blenlib/BLI_enumerable_thread_specific.hh
@@ -0,0 +1,73 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software  Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#pragma once
+
+#ifdef WITH_TBB
+#  include <tbb/enumerable_thread_specific.h>
+#endif
+
+#include <atomic>
+#include <mutex>
+
+#include "BLI_map.hh"
+#include "BLI_utility_mixins.hh"
+
+namespace blender {
+
+namespace enumerable_thread_specific_utils {
+inline std::atomic<int> next_id = 0;
+inline thread_local int thread_id = next_id.fetch_add(1, std::memory_order_relaxed);
+}  // namespace enumerable_thread_specific_utils
+
+/**
+ * This is mainly a wrapper for `tbb::enumerable_thread_specific`. The wrapper is needed because we
+ * want to be able to build without tbb.
+ *
+ * More features of the tbb version can be wrapped when they are used.
+ */
+template<typename T> class EnumerableThreadSpecific : NonCopyable, NonMovable {
+#ifdef WITH_TBB
+
+ private:
+  tbb::enumerable_thread_specific<T> values_;
+
+ public:
+  T &local()
+  {
+    return values_.local();
+  }
+
+#else /* WITH_TBB */
+
+ private:
+  std::mutex mutex_;
+  /* Maps thread ids to their corresponding values. The values are not embedded in the map, so that
+   * their addresses do not change when the map grows. */
+  Map<int, std::unique_ptr<T>> values_;
+
+ public:
+  T &local()
+  {
+    const int thread_id = enumerable_thread_specific_utils::thread_id;
+    std::lock_guard lock{mutex_};
+    return *values_.lookup_or_add_cb(thread_id, []() { return std::make_unique<T>(); });
+  }
+
+#endif /* WITH_TBB */
+};
+
+}  // namespace blender
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index e66049c9bd6..ce3515ac153 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -185,6 +185,7 @@ set(SRC
   BLI_edgehash.h
   BLI_endian_switch.h
   BLI_endian_switch_inline.h
+  BLI_enumerable_thread_specific.hh
   BLI_expr_pylike_eval.h
   BLI_fileops.h
   BLI_fileops_types.h



More information about the Bf-blender-cvs mailing list