static void* __timer_thread_start(void* arg) { PosixTimer* timer = reinterpret_cast<PosixTimer*>(arg); kernel_sigset_t sigset; sigaddset(sigset.get(), TIMER_SIGNAL); while (true) { // Wait for a signal... siginfo_t si; memset(&si, 0, sizeof(si)); int rc = __rt_sigtimedwait(sigset.get(), &si, NULL, sizeof(sigset)); if (rc == -1) { continue; } if (si.si_code == SI_TIMER) { // This signal was sent because a timer fired, so call the callback. timer->callback(timer->callback_argument); } else if (si.si_code == SI_TKILL) { // This signal was sent because someone wants us to exit. free(timer); return NULL; } } }
static void* __timer_thread_start(void* arg) { PosixTimer* timer = reinterpret_cast<PosixTimer*>(arg); sigset64_t sigset = {}; sigaddset64(&sigset, TIMER_SIGNAL); while (true) { // Wait for a signal... siginfo_t si = {}; if (__rt_sigtimedwait(&sigset, &si, nullptr, sizeof(sigset)) == -1) continue; if (si.si_code == SI_TIMER) { // This signal was sent because a timer fired, so call the callback. // All events to the callback will be ignored when the timer is deleted. if (atomic_load(&timer->deleted) == true) { continue; } timer->callback(timer->callback_argument); } else if (si.si_code == SI_TKILL) { // This signal was sent because someone wants us to exit. free(timer); return nullptr; } } }