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