chrono_batch_render/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
21 / 21
100.0%
Branches:
72 / 87
82.8%
Functions:
2 / 2, 5 excl
100.0%

stage/store_lock.h
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 #pragma once
3
4 #include <atomic>
5 #include <cstddef>
6 #include <cstdint>
7 #include <functional>
8 #include <mutex>
9 #include <optional>
10 #include <thread>
11 #include <vector>
12
13 #include "chrono_batch_render/export.h"
14
15 namespace chrono::batch_render {
16
17 377 class CHRONO_BATCH_RENDER_API StoreLock {
18 public:
19 class CHRONO_BATCH_RENDER_API Guard {
20 public:
21 69 Guard() = default;
22 explicit Guard(const StoreLock& lock);
23 Guard(const StoreLock& lock, std::try_to_lock_t);
24 ~Guard();
25 Guard(const Guard&) = delete;
26 Guard& operator=(const Guard&) = delete;
27 Guard(Guard&& other) noexcept;
28 Guard& operator=(Guard&& other) noexcept;
29
30 250662 bool OwnsLock() const {
31
2/2
✓ Branch 0 taken 87252 times.
✓ Branch 1 taken 163410 times.
250662 return m_lock != nullptr;
32 }
33
34 private:
35 void Enter();
36 void Leave() noexcept;
37
38 const StoreLock* m_lock = nullptr;
39 };
40
41 377 StoreLock() = default;
42 StoreLock(const StoreLock&) = delete;
43 StoreLock& operator=(const StoreLock&) = delete;
44
45 1044299 [[nodiscard]] Guard Lock() const {
46
10/13
<unknown function 21>:
✓ Branch 6 taken 22 times.
✗ Branch 9 not taken.
✗ Branch 21 not taken.
<unknown function 45>:
✗ Branch 1 not taken.
chrono::batch_render::StoreLock::StoreLock():
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 14 taken 40185 times.
✓ Branch 17 taken 1 time.
✓ Branch 20 taken 1 time.
✓ Branch 23 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 29 taken 1 time.
1044297 return Guard(*this);
47 }
48
49 [[nodiscard]] std::optional<Guard> TryLock() const;
50
51 225095 bool HeldByThisThread() const {
52 225095 return m_owner.load(std::memory_order_relaxed) == std::this_thread::get_id();
53 }
54
55 void Check(const char* what) const;
56
57 void Defer(std::function<void()> write) const;
58
59 bool CanDefer() const;
60
61 static constexpr size_t kMaxDeferred = 256;
62
63 void DropDeferred() const;
64
65 using BlockingWait = void (*)(void (*wait)(void* context), void* context);
66 static void SetBlockingWait(BlockingWait blockingWait);
67
68 private:
69 937467 bool HasDeferred() const {
70
4/4
✓ Branch 0 taken 101049 times.
✓ Branch 1 taken 418209 times.
✓ Branch 2 taken 958 times.
✓ Branch 3 taken 417251 times.
937467 return m_hasDeferred.load(std::memory_order_acquire);
71 }
72
73 void RunDeferred() const;
74
75 mutable std::recursive_mutex m_mutex;
76 mutable std::atomic<std::thread::id> m_owner{};
77 mutable uint32_t m_depth = 0;
78 mutable std::mutex m_deferredMutex;
79 mutable std::vector<std::function<void()>> m_deferred;
80 mutable std::atomic<bool> m_hasDeferred{false};
81 };
82
83 546374 [[nodiscard]] inline StoreLock::Guard LockStore(const StoreLock* lock) {
84
48/60
✓ Branch 0 taken 84682 times.
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 42 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 230 times.
✓ Branch 2 taken 82268 times.
✗ Branch 3 not taken.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 7 times.
✓ Branch 4 taken 82460 times.
✗ Branch 5 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 108 times.
✓ Branch 6 taken 15 times.
✓ Branch 7 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 35108 times.
✓ Branch 8 taken 1266 times.
✓ Branch 9 taken 11 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 530 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 417 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 300 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3964 times.
✓ Branch 17 taken 14 times.
✓ Branch 18 taken 823 times.
✓ Branch 19 taken 25 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✓ Branch 22 taken 12517 times.
✓ Branch 23 taken 142 times.
✓ Branch 24 taken 12577 times.
✓ Branch 25 taken 141 times.
✓ Branch 26 taken 110 times.
✓ Branch 27 taken 6 times.
✓ Branch 28 taken 1 time.
✓ Branch 29 taken 6 times.
✓ Branch 30 taken 2 times.
✓ Branch 31 taken 7 times.
✓ Branch 32 taken 12 times.
✓ Branch 33 taken 4 times.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✓ Branch 36 taken 9 times.
✓ Branch 37 taken 5 times.
✓ Branch 38 taken 1 time.
✓ Branch 39 taken 5 times.
✓ Branch 40 taken 62 times.
✓ Branch 41 taken 8 times.
✓ Branch 42 taken 42001 times.
✓ Branch 43 taken 50 times.
✓ Branch 44 taken 42079 times.
✓ Branch 45 taken 107 times.
✓ Branch 46 taken 12575 times.
✓ Branch 47 taken 151 times.
✓ Branch 48 taken 130988 times.
✓ Branch 49 taken 509 times.
546375 return lock ? lock->Lock() : StoreLock::Guard();
85 }
86
87 260068 inline void CheckStoreLock(const StoreLock* lock, const char* what) {
88
8/8
✓ Branch 0 taken 141723 times.
✓ Branch 1 taken 17639 times.
✓ Branch 2 taken 8834 times.
✓ Branch 3 taken 13281 times.
✓ Branch 4 taken 71885 times.
✓ Branch 5 taken 3377 times.
✓ Branch 6 taken 2648 times.
✓ Branch 7 taken 681 times.
260068 if (lock) {
89 225090 lock->Check(what);
90 }
91 }
92
93 }
94