GCC Code Coverage Report


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 78.2% 104 / 0 / 133
Functions: 100.0% 16 / 0 / 16
Branches: 52.3% 56 / 0 / 107

src/fork_join.hpp
Line Branch Exec Source
1 #ifndef DETOURMODKIT_SRC_FORK_JOIN_HPP
2 #define DETOURMODKIT_SRC_FORK_JOIN_HPP
3
4 /**
5 * @file fork_join.hpp
6 * @brief Internal fork-join driver shared by the opt-in parallel batch resolvers.
7 * @details One generic work-stealing primitive, @ref DetourModKit::detail::run_fork_join, backs every setup-time batch
8 * API in the library: the parallel pattern scanners (scan_regions_batch / scan_module_batch), the parallel
9 * cascade resolver (resolve_cascade_batch), and the parallel anchor-table resolvers (resolve_all_parallel /
10 * resolve_all_with_profile_parallel). It adds no scan or resolve logic of its own -- each batch item is handed
11 * to a caller-supplied resolve_one callable that invokes the existing serial primitive, and the results are
12 * gathered in input order. Centralizing the threading means the immutable-input sharing contract, the
13 * fail-closed result handling, and the join-before-read ordering are written and reviewed in one place.
14 */
15
16 #include <algorithm>
17 #include <atomic>
18 #include <cstddef>
19 #include <span>
20 #include <thread>
21 #include <type_traits>
22 #include <vector>
23
24 namespace DetourModKit
25 {
26 namespace detail
27 {
28 /// Worker count when the host cannot report hardware_concurrency(); still clamped to the item count below.
29 constexpr std::size_t FORK_JOIN_DEFAULT_WORKERS = 4;
30
31 /**
32 * @brief Resolves the effective worker count for a batch.
33 * @details A @p max_workers of 0 selects std::thread::hardware_concurrency() (or @ref FORK_JOIN_DEFAULT_WORKERS
34 * when the host cannot report it), then clamps the result to @p item_count so a batch never spawns
35 * more workers than it has work. Returns 0 for an empty batch.
36 * @param item_count Number of items in the batch.
37 * @param max_workers Caller's upper bound on workers, or 0 to auto-select.
38 * @return 0 for an empty batch, otherwise a worker count in [1, item_count].
39 */
40 24 [[nodiscard]] inline std::size_t fork_join_worker_count(std::size_t item_count,
41 std::size_t max_workers) noexcept
42 {
43
2/2
✓ Branch 2 → 3 taken 2 times.
✓ Branch 2 → 4 taken 22 times.
24 if (item_count == 0)
44 {
45 2 return 0;
46 }
47
48 22 std::size_t count = max_workers;
49
2/2
✓ Branch 4 → 5 taken 12 times.
✓ Branch 4 → 10 taken 10 times.
22 if (count == 0)
50 {
51 12 const unsigned int hardware = std::thread::hardware_concurrency();
52
1/2
✓ Branch 6 → 7 taken 12 times.
✗ Branch 6 → 8 not taken.
12 count = (hardware == 0) ? FORK_JOIN_DEFAULT_WORKERS : static_cast<std::size_t>(hardware);
53 }
54 22 return std::min(count, item_count);
55 }
56
57 /**
58 * @brief Resolves a batch of items concurrently, gathering one result per item in input order.
59 * @details Allocates the result vector up front and seeds every slot with @p fail_one, so the batch stays
60 * fail-closed even if a slot were never reached. Work is then distributed through an atomic cursor:
61 * each index is claimed by exactly one worker via a fetch_add, so every result slot is written once
62 * (no result race) and the scan path performs no allocation. The calling thread participates as one
63 * worker, so at most @ref fork_join_worker_count() threads run at once; the std::jthread workers
64 * RAII-join before the result vector is returned, and that join is the happens-before that lets the
65 * caller observe every worker's write. A single-share batch (empty, or one worker) runs serially on
66 * the calling thread with no thread creation.
67 * @tparam Item The batch element type (a plain-data request).
68 * @tparam Result The per-item result type. Must be nothrow-move-assignable: a worker assigns into a result slot
69 * from inside a noexcept body, so a throwing move would terminate the host.
70 * @tparam ResolveOne Callable (const Item&) -> Result, invoked once per item on a worker thread. It MAY throw;
71 * a throw fails only that item closed (its slot keeps the @p fail_one value) and never
72 * escapes the worker. It runs concurrently on every worker, so it must be reentrant and
73 * share no mutable state (the serial primitives it wraps already satisfy this).
74 * @tparam FailOne Callable (const Item&) -> Result giving the fail-closed result for an item. Must be noexcept:
75 * it runs in the noexcept worker body, both as the up-front seed and on the catch path.
76 * @param items The batch to resolve. An empty span returns an empty vector.
77 * @param max_workers Upper bound on worker threads (0 = auto; see @ref fork_join_worker_count).
78 * @param resolve_one Per-item resolver.
79 * @param fail_one Per-item fail-closed result factory.
80 * @return One @p Result per input item, in input order.
81 */
82 template <typename Item, typename Result, typename ResolveOne, typename FailOne>
83 24 [[nodiscard]] std::vector<Result> run_fork_join(std::span<const Item> items, std::size_t max_workers,
84 ResolveOne resolve_one, FailOne fail_one)
85 {
86 static_assert(std::is_nothrow_move_assignable_v<Result>,
87 "Result is assigned into a slot inside a noexcept worker body and must not throw on move.");
88 static_assert(std::is_nothrow_invocable_r_v<Result, FailOne, const Item &>,
89 "fail_one runs in the noexcept worker body; it must be noexcept and return Result.");
90
91
5/10
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 36 not taken.
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 36 not taken.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 35 not taken.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 5 → 6 taken 13 times.
✗ Branch 5 → 36 not taken.
std::vector<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, std::allocator<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError> > > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::CascadeRequest, std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}>(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}):
✓ Branch 5 → 6 taken 7 times.
✗ Branch 5 → 38 not taken.
24 std::vector<Result> results(items.size());
92
10/10
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✓ Branch 13 → 8 taken 5 times.
✓ Branch 13 → 14 taken 1 time.
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✓ Branch 13 → 8 taken 3 times.
✓ Branch 13 → 14 taken 1 time.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 13 → 8 taken 10 times.
✓ Branch 13 → 14 taken 2 times.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 13 → 8 taken 79 times.
✓ Branch 13 → 14 taken 13 times.
std::vector<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, std::allocator<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError> > > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::CascadeRequest, std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}>(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}):
✓ Branch 14 → 8 taken 70 times.
✓ Branch 14 → 15 taken 7 times.
191 for (std::size_t i = 0; i < items.size(); ++i)
93 {
94 167 results[i] = fail_one(items[i]);
95 }
96
97 24 const std::size_t worker_count = fork_join_worker_count(items.size(), max_workers);
98
7/10
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 26 taken 1 time.
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 26 taken 1 time.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 25 taken 2 times.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 16 → 17 taken 4 times.
✓ Branch 16 → 26 taken 9 times.
std::vector<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, std::allocator<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError> > > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::CascadeRequest, std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}>(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}):
✓ Branch 17 → 18 taken 3 times.
✓ Branch 17 → 28 taken 4 times.
24 if (worker_count <= 1)
99 {
100
4/10
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✗ Branch 24 → 18 not taken.
✗ Branch 24 → 25 not taken.
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✗ Branch 24 → 18 not taken.
✗ Branch 24 → 25 not taken.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✗ Branch 23 → 18 not taken.
✗ Branch 23 → 24 not taken.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 24 → 18 taken 18 times.
✓ Branch 24 → 25 taken 4 times.
std::vector<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, std::allocator<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError> > > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::CascadeRequest, std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}>(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}):
✓ Branch 26 → 19 taken 17 times.
✓ Branch 26 → 27 taken 3 times.
42 for (std::size_t i = 0; i < items.size(); ++i)
101 {
102 try
103 {
104
2/8
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 39 not taken.
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 39 not taken.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 19 → 20 taken 18 times.
✗ Branch 19 → 39 not taken.
std::vector<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, std::allocator<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError> > > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::CascadeRequest, std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}>(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}):
✓ Branch 20 → 21 taken 17 times.
✗ Branch 20 → 41 not taken.
35 results[i] = resolve_one(items[i]);
105 }
106 catch (...)
107 {
108 results[i] = fail_one(items[i]);
109 }
110 }
111 7 return results;
112 }
113
114 17 std::atomic<std::size_t> cursor{0};
115 166 auto run = [&]() noexcept
116 {
117 121 for (;;)
118 {
119 209 const std::size_t index = cursor.fetch_add(1, std::memory_order_relaxed);
120
2/2
✓ Branch 6 → 7 taken 77 times.
✓ Branch 6 → 8 taken 132 times.
209 if (index >= items.size())
121 {
122 77 break;
123 }
124
125 try
126 {
127
1/3
✓ Branch 9 → 10 taken 122 times.
✗ Branch 9 → 14 not taken.
✗ Branch 9 → 15 not taken.
132 results[index] = resolve_one(items[index]);
128 }
129 catch (...)
130 {
131 results[index] = fail_one(items[index]);
132 }
133 }
134 };
135
136 {
137 17 std::vector<std::jthread> workers;
138 try
139 {
140
5/10
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✓ Branch 26 → 27 taken 1 time.
✗ Branch 26 → 46 not taken.
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✓ Branch 26 → 27 taken 1 time.
✗ Branch 26 → 46 not taken.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 39 not taken.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 26 → 27 taken 9 times.
✗ Branch 26 → 46 not taken.
std::vector<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, std::allocator<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError> > > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::CascadeRequest, std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}>(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}):
✓ Branch 28 → 29 taken 4 times.
✗ Branch 28 → 50 not taken.
17 workers.reserve(worker_count - 1);
141
10/10
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✓ Branch 30 → 28 taken 3 times.
✓ Branch 30 → 31 taken 1 time.
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✓ Branch 30 → 28 taken 2 times.
✓ Branch 30 → 31 taken 1 time.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 29 → 27 taken 4 times.
✓ Branch 29 → 30 taken 2 times.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 30 → 28 taken 28 times.
✓ Branch 30 → 31 taken 9 times.
std::vector<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, std::allocator<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError> > > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::CascadeRequest, std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}>(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}):
✓ Branch 32 → 30 taken 24 times.
✓ Branch 32 → 33 taken 4 times.
78 for (std::size_t i = 0; i + 1 < worker_count; ++i)
142 {
143
5/10
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✓ Branch 28 → 29 taken 3 times.
✗ Branch 28 → 45 not taken.
std::vector<DetourModKit::Anchors::ResolvedAnchor, std::allocator<DetourModKit::Anchors::ResolvedAnchor> > DetourModKit::detail::run_fork_join<DetourModKit::Anchors::Anchor, DetourModKit::Anchors::ResolvedAnchor, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}>(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, unsigned long long, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#1}, DetourModKit::Anchors::resolve_all_with_profile_parallel(std::span<DetourModKit::Anchors::Anchor const, 18446744073709551615ull>, std::span<DetourModKit::Anchors::ResolvedAnchor, 18446744073709551615ull>, DetourModKit::ScanProfile const&, DetourModKit::Memory::ModuleRange, unsigned long long)::{lambda(DetourModKit::Anchors::Anchor const&)#2}):
✓ Branch 28 → 29 taken 2 times.
✗ Branch 28 → 45 not taken.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_module_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Memory::ModuleRange, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 27 → 28 taken 4 times.
✗ Branch 27 → 38 not taken.
std::vector<std::byte const*, std::allocator<std::byte const*> > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::BatchScanItem, std::byte const*, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}>(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#1}, DetourModKit::Scanner::scan_regions_batch(std::span<DetourModKit::Scanner::BatchScanItem const, 18446744073709551615ull>, DetourModKit::Scanner::ScannerKind, unsigned long long)::{lambda(DetourModKit::Scanner::BatchScanItem const&)#2}):
✓ Branch 28 → 29 taken 28 times.
✗ Branch 28 → 45 not taken.
std::vector<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, std::allocator<std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError> > > DetourModKit::detail::run_fork_join<DetourModKit::Scanner::CascadeRequest, std::expected<DetourModKit::Scanner::ResolveHit, DetourModKit::Scanner::ResolveError>, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}>(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#1}, DetourModKit::Scanner::resolve_cascade_batch(std::span<DetourModKit::Scanner::CascadeRequest const, 18446744073709551615ull>, unsigned long long)::{lambda(DetourModKit::Scanner::CascadeRequest const&)#2}):
✓ Branch 30 → 31 taken 24 times.
✗ Branch 30 → 49 not taken.
122 workers.emplace_back([&run]() noexcept { run(); });
144 }
145 }
146 catch (...)
147 {
148 // Thread creation hit a resource limit after starting zero or more workers. The calling thread
149 // still drains the shared cursor below, so the batch completes on fewer workers.
150 }
151 17 run();
152 17 }
153
154 17 return results;
155 }
156 } // namespace detail
157 } // namespace DetourModKit
158
159 #endif // DETOURMODKIT_SRC_FORK_JOIN_HPP
160