diff options
author | Richard Yao <richard.yao@alumni.stonybrook.edu> | 2024-01-11 06:43:42 +0300 |
---|---|---|
committer | Philip Rebohle <25567304+doitsujin@users.noreply.github.com> | 2024-01-15 14:42:19 +0300 |
commit | 14560600a9ad770a20c3e02e687fd6ff78d4f1b6 (patch) | |
tree | 78aceef9c6ce18cf81cb1244f83bc3d36daf4d04 | |
parent | 854e06d3f04e9d00df0a55a9fe4bbacf6a302189 (diff) |
Micro-optimize locking in fences
When a fence has been missed, we can avoid locking *most* of the time
via the double-checked locking pattern. We still lock before a second
check in case the scheduler caused us to miss the fence. If the
scheduler did cause us to miss the fence, we can drop the lock prior to
executing the callback function, as a second micro-optimization.
Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
-rw-r--r-- | src/util/sync/sync_signal.h | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/util/sync/sync_signal.h b/src/util/sync/sync_signal.h index cdbcae82..44f99eec 100644 --- a/src/util/sync/sync_signal.h +++ b/src/util/sync/sync_signal.h @@ -137,14 +137,22 @@ namespace dxvk::sync { template<typename Fn> void setCallback(uint64_t value, Fn&& proc) { + if (value <= this->value()) { + proc(); + return; + } + std::unique_lock<dxvk::mutex> lock(m_mutex); + // Verify value is still in the future upon lock. if (value > this->value()) m_callbacks.emplace_back(std::piecewise_construct, std::make_tuple(value), std::make_tuple(proc)); - else + else { + lock.unlock(); proc(); + } } private: |