1 #include <sdeventplus/internal/cexec.hpp>
2 #include <sdeventplus/internal/sdevent.hpp>
3 #include <sdeventplus/source/io.hpp>
4 #include <sdeventplus/types.hpp>
5 
6 #include <type_traits>
7 #include <utility>
8 
9 namespace sdeventplus
10 {
11 namespace source
12 {
13 
IO(const Event & event,int fd,uint32_t events,Callback && callback)14 IO::IO(const Event& event, int fd, uint32_t events, Callback&& callback) :
15     Base(event, create_source(event, fd, events), std::false_type())
16 {
17     set_userdata(std::make_unique<detail::IOData>(*this, std::move(callback)));
18 }
19 
IO(const IO & other,sdeventplus::internal::NoOwn)20 IO::IO(const IO& other, sdeventplus::internal::NoOwn) :
21     Base(other, sdeventplus::internal::NoOwn())
22 {}
23 
set_callback(Callback && callback)24 void IO::set_callback(Callback&& callback)
25 {
26     get_userdata().callback = std::move(callback);
27 }
28 
get_fd() const29 int IO::get_fd() const
30 {
31     return SDEVENTPLUS_CHECK(
32         "sd_event_source_get_io_fd",
33         event.getSdEvent()->sd_event_source_get_io_fd(get()));
34 }
35 
set_fd(int fd) const36 void IO::set_fd(int fd) const
37 {
38     SDEVENTPLUS_CHECK("sd_event_source_set_io_fd",
39                       event.getSdEvent()->sd_event_source_set_io_fd(get(), fd));
40 }
41 
get_events() const42 uint32_t IO::get_events() const
43 {
44     uint32_t events;
45     SDEVENTPLUS_CHECK(
46         "sd_event_source_get_io_events",
47         event.getSdEvent()->sd_event_source_get_io_events(get(), &events));
48     return events;
49 }
50 
set_events(uint32_t events) const51 void IO::set_events(uint32_t events) const
52 {
53     SDEVENTPLUS_CHECK(
54         "sd_event_source_set_io_events",
55         event.getSdEvent()->sd_event_source_set_io_events(get(), events));
56 }
57 
get_revents() const58 uint32_t IO::get_revents() const
59 {
60     uint32_t revents;
61     SDEVENTPLUS_CHECK(
62         "sd_event_source_get_io_revents",
63         event.getSdEvent()->sd_event_source_get_io_revents(get(), &revents));
64     return revents;
65 }
66 
get_userdata() const67 detail::IOData& IO::get_userdata() const
68 {
69     return static_cast<detail::IOData&>(Base::get_userdata());
70 }
71 
get_callback()72 IO::Callback& IO::get_callback()
73 {
74     return get_userdata().callback;
75 }
76 
create_source(const Event & event,int fd,uint32_t events)77 sd_event_source* IO::create_source(const Event& event, int fd, uint32_t events)
78 {
79     sd_event_source* source;
80     SDEVENTPLUS_CHECK("sd_event_add_io", event.getSdEvent()->sd_event_add_io(
81                                              event.get(), &source, fd, events,
82                                              ioCallback, nullptr));
83     return source;
84 }
85 
ioCallback(sd_event_source * source,int fd,uint32_t revents,void * userdata)86 int IO::ioCallback(sd_event_source* source, int fd, uint32_t revents,
87                    void* userdata)
88 {
89     return sourceCallback<Callback, detail::IOData, &IO::get_callback>(
90         "ioCallback", source, userdata, fd, revents);
91 }
92 
93 namespace detail
94 {
95 
IOData(const IO & base,IO::Callback && callback)96 IOData::IOData(const IO& base, IO::Callback&& callback) :
97     IO(base, sdeventplus::internal::NoOwn()), BaseData(base),
98     callback(std::move(callback))
99 {}
100 
101 } // namespace detail
102 
103 } // namespace source
104 } // namespace sdeventplus
105