X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FTimerSource.cc;h=fe6b7d1a380932e13fbb5764dd2870a65a14a3c0;hb=81f84badf27b66dbadec9890646ca1193e998505;hp=ac1baa387fb6dad22a5dcb9b81bfdd051ff1ae19;hpb=556aea04a82b3e2e5cdfe28a0abd3b275c7decf9;p=senf.git diff --git a/Scheduler/TimerSource.cc b/Scheduler/TimerSource.cc index ac1baa3..fe6b7d1 100644 --- a/Scheduler/TimerSource.cc +++ b/Scheduler/TimerSource.cc @@ -217,6 +217,35 @@ prefix_ void senf::scheduler::detail::TimerFDTimerSource::enable() prefix_ void senf::scheduler::detail::TimerFDTimerSource::disable() {} +namespace { + + struct TimerFdCheck + { + TimerFdCheck(); + bool timerFdOk; + }; + + TimerFdCheck::TimerFdCheck() + : timerFdOk (false) + { + int fd (timerfd_create(CLOCK_MONOTONIC, 0)); + if (fd == -1) { + if (errno != EINVAL) + SENF_THROW_SYSTEM_EXCEPTION("timerfd_create()"); + } + else { + timerFdOk = true; + close(fd); + } + } + +} +prefix_ bool senf::scheduler::detail::TimerFDTimerSource::haveTimerFD() +{ + static TimerFdCheck check; + return check.timerFdOk; +} + prefix_ void senf::scheduler::detail::TimerFDTimerSource::signal(int events) { uint64_t expirations (0);