GCC Code Coverage Report


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 88.4% 38 / 0 / 43
Functions: 100.0% 6 / 0 / 6
Branches: 61.4% 27 / 0 / 44

src/worker.cpp
Line Branch Exec Source
1 #include "DetourModKit/worker.hpp"
2 #include "DetourModKit/logger.hpp"
3 #include "platform.hpp"
4
5 #include <utility>
6
7 namespace DetourModKit
8 {
9 135 StoppableWorker::StoppableWorker(std::string_view name,
10 135 std::function<void(std::stop_token)> body)
11
1/2
✓ Branch 4 → 5 taken 135 times.
✗ Branch 4 → 28 not taken.
405 : name_(name)
12 {
13
2/2
✓ Branch 9 → 10 taken 1 time.
✓ Branch 9 → 14 taken 134 times.
135 if (!body)
14 {
15
1/2
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 40 not taken.
1 Logger::get_instance().error(
16
1/2
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 31 not taken.
1 "StoppableWorker '{}': empty body; no thread started.", name_);
17 1 joined_.store(true, std::memory_order_release);
18 1 return;
19 }
20
21 134 thread_ = std::jthread(
22
2/6
✓ Branch 17 → 18 taken 134 times.
✗ Branch 17 → 34 not taken.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 134 times.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 36 not taken.
268 [fn = std::move(body), label = name_](std::stop_token st)
23 {
24 try
25 {
26
2/2
✓ Branch 3 → 4 taken 132 times.
✓ Branch 3 → 7 taken 2 times.
136 fn(st);
27 }
28
2/2
✓ Branch 10 → 11 taken 1 time.
✓ Branch 10 → 16 taken 1 time.
2 catch (const std::exception &e)
29 {
30
1/2
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 22 not taken.
1 Logger::get_instance().error(
31
1/2
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 20 not taken.
1 "StoppableWorker '{}': unhandled exception: {}", label, e.what());
32 1 }
33 1 catch (...)
34 {
35
1/2
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 25 not taken.
1 Logger::get_instance().error(
36
1/2
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 24 not taken.
1 "StoppableWorker '{}': unknown exception escaped body.", label);
37 1 }
38
1/2
✓ Branch 18 → 19 taken 134 times.
✗ Branch 18 → 32 not taken.
268 });
39
40
2/4
✓ Branch 24 → 25 taken 134 times.
✗ Branch 24 → 40 not taken.
✓ Branch 25 → 26 taken 134 times.
✗ Branch 25 → 39 not taken.
134 Logger::get_instance().debug("StoppableWorker '{}' started.", name_);
41 }
42
43 131 StoppableWorker::~StoppableWorker() noexcept
44 {
45 131 shutdown();
46 131 }
47
48 6 void StoppableWorker::request_stop() noexcept
49 {
50
2/2
✓ Branch 3 → 4 taken 4 times.
✓ Branch 3 → 5 taken 2 times.
6 if (thread_.joinable())
51 {
52 4 thread_.request_stop();
53 }
54 6 }
55
56 21 bool StoppableWorker::is_running() const noexcept
57 {
58
3/4
✓ Branch 3 → 4 taken 18 times.
✓ Branch 3 → 7 taken 3 times.
✓ Branch 5 → 6 taken 18 times.
✗ Branch 5 → 7 not taken.
21 return thread_.joinable() && !joined_.load(std::memory_order_acquire);
59 }
60
61 258 void StoppableWorker::shutdown() noexcept
62 {
63 258 bool expected = false;
64
2/2
✓ Branch 3 → 4 taken 124 times.
✓ Branch 3 → 5 taken 134 times.
258 if (!joined_.compare_exchange_strong(expected, true,
65 std::memory_order_acq_rel))
66 {
67 124 return;
68 }
69
70
1/2
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 134 times.
134 if (!thread_.joinable())
71 {
72 return;
73 }
74
75 134 thread_.request_stop();
76
77
1/2
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 14 taken 134 times.
134 if (detail::is_loader_lock_held())
78 {
79 detail::pin_current_module();
80 thread_.detach();
81 return;
82 }
83
84 134 thread_.join();
85 }
86 } // namespace DetourModKit
87