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