X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FTimerSource.cc;h=df05438a7ff1e83a3ade6486c22903cf17771c28;hb=6b43243d9b1a3b9720efdacc6f02364877ebe2aa;hp=ac1baa387fb6dad22a5dcb9b81bfdd051ff1ae19;hpb=556aea04a82b3e2e5cdfe28a0abd3b275c7decf9;p=senf.git diff --git a/Scheduler/TimerSource.cc b/Scheduler/TimerSource.cc index ac1baa3..df05438 100644 --- a/Scheduler/TimerSource.cc +++ b/Scheduler/TimerSource.cc @@ -27,7 +27,7 @@ //#include "TimerSource.ih" // Custom includes -#include "FdEvent.hh" +#include "IdleEvent.hh" #ifdef HAVE_TIMERFD #include #endif @@ -157,12 +157,12 @@ prefix_ void senf::scheduler::detail::PollTimerSource::timeout(ClockService::clo { ClockService::clock_type now (ClockService::now()); int delay (ClockService::in_milliseconds(timeout-now)+1); - FileDispatcher::instance().timeout(delay<0?0:delay); + IdleEventDispatcher::instance().timeout(delay<0?0:delay); } prefix_ void senf::scheduler::detail::PollTimerSource::notimeout() { - FileDispatcher::instance().timeout(-1); + IdleEventDispatcher::instance().timeout(-1); } prefix_ void senf::scheduler::detail::PollTimerSource::enable() @@ -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); @@ -232,7 +261,7 @@ prefix_ void senf::scheduler::detail::TimerFDTimerSource::reschedule() timer.it_value.tv_nsec = ClockService::in_nanoseconds( timeout_ - ClockService::seconds(timer.it_value.tv_sec)); } - if (timerfd_settime(timerfd_, TIMER_ABSTIME, &timer, 0)<0) + if (timerfd_settime(timerfd_, TFD_TIMER_ABSTIME, &timer, 0)<0) SENF_THROW_SYSTEM_EXCEPTION("timerfd_settime()"); } #endif