12 #include <unordered_set>
16 #include "Mu2e-STMDAQ/config/config.hh"
42 void pin_thread_to_core(
size_t core_id,
const std::string& name);
51 size_t starting_core_id;
57 std::atomic<size_t> next_core_id;
60 std::mutex tracking_mutex;
63 std::unordered_set<size_t> used_cores;
70 std::vector<int> allowed_cores;
74 std::shared_ptr<AsyncLogger> logger;
75 std::vector<std::pair<std::string,int>> pending_logs;
78 static std::shared_ptr<cpu_utils> instance;
81 static std::once_flag init_flag;
84 static const std::vector<int> socket0_cores;
87 static const std::vector<int> socket1_cores;
89 void log(
const std::string& msg,
int level);
100 static std::shared_ptr<cpu_utils> getInstance(
const Config& cfg, CpuRole role);
103 size_t get_next_core(
const std::string& name);
105 void set_logger(std::shared_ptr<AsyncLogger> l);
108 void clear_logger() {
109 std::lock_guard<std::mutex> lock(log_mutex);
111 pending_logs.clear();
115 size_t checkpoint() {
116 return next_core_id.load();
120 void reset_to(
size_t checkpoint) {
121 std::lock_guard<std::mutex> lock(tracking_mutex);
122 size_t current = next_core_id.load();
123 for (
size_t i = checkpoint; i < current; i++) {
124 size_t logical_core = (starting_core_id + i) % allowed_cores.size();
125 size_t core_id = allowed_cores[logical_core];
126 used_cores.erase(core_id);
128 next_core_id.store(checkpoint);
133 log(
"CPU utils shutting down. Cores assigned: " +
134 std::to_string(next_core_id.load()) +
135 ", unique cores used: " +
136 std::to_string(used_cores.size()),1);