42 template <
typename Predicate>
44 : config_(cfg), stop_(
false), worker_([
this, pred]() { run_loop(pred); })
51 if (worker_.joinable())
55 ChaosController(ChaosController
const&) =
delete;
56 auto operator=(ChaosController
const&) -> ChaosController& =
delete;
59 template <
typename Predicate>
60 void run_loop(Predicate pred)
62 std::mt19937 rng(std::random_device{}());
66 auto blk = registry().get(info.tid);
71 if (config_.shuffle_affinity)
77 static_cast<int>(idx % (topo.numa_nodes > 0 ? topo.numa_nodes : 1)),
static_cast<int>(idx));
78 (void)registry().set_affinity(info.tid, aff);
84 if (config_.priority_jitter != 0)
86 std::uniform_int_distribution<int> dist(-config_.priority_jitter, config_.priority_jitter);
88 int delta = dist(rng);
91 (void)registry().set_priority(info.tid,
ThreadPriority{prio.value() + delta});
95 std::this_thread::sleep_for(config_.interval);
100 std::atomic<bool> stop_;