| #include <sdeventplus/clock.hpp> |
| #include <sdeventplus/internal/cexec.hpp> |
| #include <sdeventplus/internal/sdevent.hpp> |
| #include <sdeventplus/source/time.hpp> |
| #include <sdeventplus/types.hpp> |
| |
| #include <memory> |
| #include <type_traits> |
| #include <utility> |
| |
| namespace sdeventplus |
| { |
| namespace source |
| { |
| |
| template <ClockId Id> |
| Time<Id>::Time(const Event& event, TimePoint time, Accuracy accuracy, |
| Callback&& callback) : |
| Base(event, create_source(event, time, accuracy), std::false_type()) |
| { |
| set_userdata( |
| std::make_unique<detail::TimeData<Id>>(*this, std::move(callback))); |
| } |
| |
| template <ClockId Id> |
| Time<Id>::Time(const Time<Id>& other, sdeventplus::internal::NoOwn) : |
| Base(other, sdeventplus::internal::NoOwn()) |
| {} |
| |
| template <ClockId Id> |
| void Time<Id>::set_callback(Callback&& callback) |
| { |
| get_userdata().callback = std::move(callback); |
| } |
| |
| template <ClockId Id> |
| typename Time<Id>::TimePoint Time<Id>::get_time() const |
| { |
| uint64_t usec; |
| SDEVENTPLUS_CHECK( |
| "sd_event_source_get_time", |
| event.getSdEvent()->sd_event_source_get_time(get(), &usec)); |
| return Time<Id>::TimePoint(SdEventDuration(usec)); |
| } |
| |
| template <ClockId Id> |
| void Time<Id>::set_time(TimePoint time) const |
| { |
| SDEVENTPLUS_CHECK( |
| "sd_event_source_set_time", |
| event.getSdEvent()->sd_event_source_set_time( |
| get(), SdEventDuration(time.time_since_epoch()).count())); |
| } |
| |
| template <ClockId Id> |
| typename Time<Id>::Accuracy Time<Id>::get_accuracy() const |
| { |
| uint64_t usec; |
| SDEVENTPLUS_CHECK( |
| "sd_event_source_get_time_accuracy", |
| event.getSdEvent()->sd_event_source_get_time_accuracy(get(), &usec)); |
| return SdEventDuration(usec); |
| } |
| |
| template <ClockId Id> |
| void Time<Id>::set_accuracy(Accuracy accuracy) const |
| { |
| SDEVENTPLUS_CHECK("sd_event_source_set_time_accuracy", |
| event.getSdEvent()->sd_event_source_set_time_accuracy( |
| get(), SdEventDuration(accuracy).count())); |
| } |
| |
| template <ClockId Id> |
| detail::TimeData<Id>& Time<Id>::get_userdata() const |
| { |
| return static_cast<detail::TimeData<Id>&>(Base::get_userdata()); |
| } |
| |
| template <ClockId Id> |
| typename Time<Id>::Callback& Time<Id>::get_callback() |
| { |
| return get_userdata().callback; |
| } |
| |
| template <ClockId Id> |
| sd_event_source* Time<Id>::create_source(const Event& event, TimePoint time, |
| Accuracy accuracy) |
| { |
| sd_event_source* source; |
| SDEVENTPLUS_CHECK("sd_event_add_time", |
| event.getSdEvent()->sd_event_add_time( |
| event.get(), &source, static_cast<clockid_t>(Id), |
| SdEventDuration(time.time_since_epoch()).count(), |
| SdEventDuration(accuracy).count(), timeCallback, |
| nullptr)); |
| return source; |
| } |
| |
| template <ClockId Id> |
| int Time<Id>::timeCallback(sd_event_source* source, uint64_t usec, |
| void* userdata) |
| { |
| return sourceCallback<Callback, detail::TimeData<Id>, &Time::get_callback>( |
| "timeCallback", source, userdata, TimePoint(SdEventDuration(usec))); |
| } |
| |
| template class Time<ClockId::RealTime>; |
| template class Time<ClockId::Monotonic>; |
| template class Time<ClockId::BootTime>; |
| template class Time<ClockId::RealTimeAlarm>; |
| template class Time<ClockId::BootTimeAlarm>; |
| |
| namespace detail |
| { |
| |
| template <ClockId Id> |
| TimeData<Id>::TimeData(const Time<Id>& base, |
| typename Time<Id>::Callback&& callback) : |
| Time<Id>(base, sdeventplus::internal::NoOwn()), |
| BaseData(base), callback(std::move(callback)) |
| {} |
| |
| } // namespace detail |
| |
| } // namespace source |
| } // namespace sdeventplus |