diff options
author | Jacques Lucke <jacques@blender.org> | 2022-11-08 17:50:49 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2022-11-08 17:50:49 +0300 |
commit | c73ae711bf403585de403bcfeb7519dd989d4c15 (patch) | |
tree | 06bf03e41b3e0476bf21e01a245f035ee227c720 /source/blender/blenlib/intern/cache_mutex.cc | |
parent | 1d71f82033f1ec3ad51195cfa64c59fcf0cd6ccc (diff) |
BLI: new basic CacheMutex
This patch introduces a new `CacheMutex` which makes it easy to implement
lazily computed caches in e.g. `Curves`. For more details see `BLI_cache_mutex.hh`.
Differential Revision: https://developer.blender.org/D16419
Diffstat (limited to 'source/blender/blenlib/intern/cache_mutex.cc')
-rw-r--r-- | source/blender/blenlib/intern/cache_mutex.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/source/blender/blenlib/intern/cache_mutex.cc b/source/blender/blenlib/intern/cache_mutex.cc new file mode 100644 index 00000000000..db474b1ef87 --- /dev/null +++ b/source/blender/blenlib/intern/cache_mutex.cc @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "BLI_cache_mutex.hh" +#include "BLI_task.hh" + +namespace blender { + +void CacheMutex::ensure(const FunctionRef<void()> compute_cache) +{ + if (cache_valid_.load(std::memory_order_acquire)) { + return; + } + std::scoped_lock lock{mutex_}; + /* Double checked lock. */ + if (cache_valid_.load(std::memory_order_relaxed)) { + return; + } + /* Use task isolation because a mutex is locked and the cache computation might use + * multi-threading. */ + threading::isolate_task(compute_cache); + + cache_valid_.store(true, std::memory_order_release); +} + +} // namespace blender |