1 #include <systemd/sd-event.h>
2
3 #include <sdeventplus/event.hpp>
4 #include <sdeventplus/internal/cexec.hpp>
5 #include <sdeventplus/internal/sdevent.hpp>
6
7 #include <functional>
8 #include <type_traits>
9 #include <utility>
10
11 namespace sdeventplus
12 {
13
Event(sd_event * event,const internal::SdEvent * sdevent)14 Event::Event(sd_event* event, const internal::SdEvent* sdevent) :
15 sdevent(sdevent), event(event, sdevent, true)
16 {}
17
Event(sd_event * event,std::false_type,const internal::SdEvent * sdevent)18 Event::Event(sd_event* event, std::false_type,
19 const internal::SdEvent* sdevent) :
20 sdevent(sdevent),
21 event(std::move(event), sdevent, true)
22 {}
23
Event(const Event & other,sdeventplus::internal::NoOwn)24 Event::Event(const Event& other, sdeventplus::internal::NoOwn) :
25 sdevent(other.sdevent), event(other.get(), other.getSdEvent(), false)
26 {}
27
get_new(const internal::SdEvent * sdevent)28 Event Event::get_new(const internal::SdEvent* sdevent)
29 {
30 sd_event* event = nullptr;
31 SDEVENTPLUS_CHECK("sd_event_new", sdevent->sd_event_new(&event));
32 return Event(event, std::false_type(), sdevent);
33 }
34
get_default(const internal::SdEvent * sdevent)35 Event Event::get_default(const internal::SdEvent* sdevent)
36 {
37 sd_event* event = nullptr;
38 SDEVENTPLUS_CHECK("sd_event_default", sdevent->sd_event_default(&event));
39 return Event(event, std::false_type(), sdevent);
40 }
41
get() const42 sd_event* Event::get() const
43 {
44 return event.value();
45 }
46
getSdEvent() const47 const internal::SdEvent* Event::getSdEvent() const
48 {
49 return sdevent;
50 }
51
prepare() const52 int Event::prepare() const
53 {
54 return SDEVENTPLUS_CHECK("sd_event_prepare",
55 sdevent->sd_event_prepare(get()));
56 }
57
wait(MaybeTimeout timeout) const58 int Event::wait(MaybeTimeout timeout) const
59 {
60 // An unsigned -1 timeout value means infinity in sd_event
61 uint64_t timeout_usec = timeout ? timeout->count() : -1;
62 return SDEVENTPLUS_CHECK("sd_event_wait",
63 sdevent->sd_event_wait(get(), timeout_usec));
64 }
65
dispatch() const66 int Event::dispatch() const
67 {
68 return SDEVENTPLUS_CHECK("sd_event_dispatch",
69 sdevent->sd_event_dispatch(get()));
70 }
71
run(MaybeTimeout timeout) const72 int Event::run(MaybeTimeout timeout) const
73 {
74 // An unsigned -1 timeout value means infinity in sd_event
75 uint64_t timeout_usec = timeout ? timeout->count() : -1;
76 return SDEVENTPLUS_CHECK("sd_event_run",
77 sdevent->sd_event_run(get(), timeout_usec));
78 }
79
loop() const80 int Event::loop() const
81 {
82 return SDEVENTPLUS_CHECK("sd_event_loop", sdevent->sd_event_loop(get()));
83 }
84
exit(int code) const85 void Event::exit(int code) const
86 {
87 SDEVENTPLUS_CHECK("sd_event_exit", sdevent->sd_event_exit(get(), code));
88 }
89
get_exit_code() const90 int Event::get_exit_code() const
91 {
92 int code;
93 SDEVENTPLUS_CHECK("sd_event_get_exit_code",
94 sdevent->sd_event_get_exit_code(get(), &code));
95 return code;
96 }
97
get_watchdog() const98 bool Event::get_watchdog() const
99 {
100 return SDEVENTPLUS_CHECK("sd_event_get_watchdog",
101 sdevent->sd_event_get_watchdog(get()));
102 }
103
set_watchdog(bool b) const104 bool Event::set_watchdog(bool b) const
105 {
106 return SDEVENTPLUS_CHECK("sd_event_set_watchdog",
107 sdevent->sd_event_set_watchdog(get(), b));
108 }
109
ref(sd_event * const & event,const internal::SdEvent * & sdevent,bool & owned)110 sd_event* Event::ref(sd_event* const& event, const internal::SdEvent*& sdevent,
111 bool& owned)
112 {
113 owned = true;
114 return sdevent->sd_event_ref(event);
115 }
116
drop(sd_event * && event,const internal::SdEvent * & sdevent,bool & owned)117 void Event::drop(sd_event*&& event, const internal::SdEvent*& sdevent,
118 bool& owned)
119 {
120 if (owned)
121 {
122 sdevent->sd_event_unref(event);
123 }
124 }
125
126 } // namespace sdeventplus
127