73 using HandlerFunc = std::function<void(
int)>;
75 static void registerHandler(
int signum, HandlerFunc handler) {
76 auto& vec = getHandlers()[signum];
77 vec.push_back(handler);
78 std::signal(signum, SignalHandler::dispatch);
83 static std::map<int, std::vector<HandlerFunc>>& getHandlers() {
84 static std::map<int, std::vector<HandlerFunc>> handlers;
88#if ARDUINO_EMULATOR_WINDOWS
89 static std::atomic<int>& pendingSignal() {
static std::atomic<int> value{0};
return value; }
90 static std::condition_variable& condition() {
static std::condition_variable value;
return value; }
91 static std::mutex& conditionMutex() {
static std::mutex value;
return value; }
97 static void dispatch(
int signum) {
98#if ARDUINO_EMULATOR_WINDOWS
99 pendingSignal() = signum;
100 condition().notify_one();
102 char sig = (char)signum;
103 ssize_t n = write(pipeWriteFd(), &sig, 1);
108 static int& pipeWriteFd() {
112 static int& pipeReadFd() {
119 static void ensureReaperThread() {
120 static std::once_flag started;
121 std::call_once(started, [] {
122#if ARDUINO_EMULATOR_WINDOWS
124 std::unique_lock<std::mutex> lock(conditionMutex());
125 condition().wait(lock, [] {
return pendingSignal() != 0; });
126 int signum = pendingSignal();
127 auto& handlers = getHandlers();
128 auto it = handlers.find(signum);
129 if (it != handlers.end()) {
130 for (
auto& func : it->second) func(signum);
137 pipeReadFd() = fds[0];
138 pipeWriteFd() = fds[1];
141 while (read(pipeReadFd(), &sig, 1) == 1) {
142 int signum = (int)(
unsigned char)sig;
143 auto& handlers = getHandlers();
144 auto it = handlers.find(signum);
145 if (it != handlers.end()) {
146 for (
auto& func : it->second) {