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), event(std::move(event), sdevent, true)
21 {}
22
Event(const Event & other,sdeventplus::internal::NoOwn)23 Event::Event(const Event& other, sdeventplus::internal::NoOwn) :
24 sdevent(other.sdevent), event(other.get(), other.getSdEvent(), false)
25 {}
26
get_new(const internal::SdEvent * sdevent)27 Event Event::get_new(const internal::SdEvent* sdevent)
28 {
29 sd_event* event = nullptr;
30 SDEVENTPLUS_CHECK("sd_event_new", sdevent->sd_event_new(&event));
31 return Event(event, std::false_type(), sdevent);
32 }
33
get_default(const internal::SdEvent * sdevent)34 Event Event::get_default(const internal::SdEvent* sdevent)
35 {
36 sd_event* event = nullptr;
37 SDEVENTPLUS_CHECK("sd_event_default", sdevent->sd_event_default(&event));
38 return Event(event, std::false_type(), sdevent);
39 }
40
get() const41 sd_event* Event::get() const
42 {
43 return event.value();
44 }
45
getSdEvent() const46 const internal::SdEvent* Event::getSdEvent() const
47 {
48 return sdevent;
49 }
50
prepare() const51 int Event::prepare() const
52 {
53 return SDEVENTPLUS_CHECK("sd_event_prepare",
54 sdevent->sd_event_prepare(get()));
55 }
56
wait(MaybeTimeout timeout) const57 int Event::wait(MaybeTimeout timeout) const
58 {
59 // An unsigned -1 timeout value means infinity in sd_event
60 uint64_t timeout_usec = timeout ? timeout->count() : -1;
61 return SDEVENTPLUS_CHECK("sd_event_wait",
62 sdevent->sd_event_wait(get(), timeout_usec));
63 }
64
dispatch() const65 int Event::dispatch() const
66 {
67 return SDEVENTPLUS_CHECK("sd_event_dispatch",
68 sdevent->sd_event_dispatch(get()));
69 }
70
run(MaybeTimeout timeout) const71 int Event::run(MaybeTimeout timeout) const
72 {
73 // An unsigned -1 timeout value means infinity in sd_event
74 uint64_t timeout_usec = timeout ? timeout->count() : -1;
75 return SDEVENTPLUS_CHECK("sd_event_run",
76 sdevent->sd_event_run(get(), timeout_usec));
77 }
78
loop() const79 int Event::loop() const
80 {
81 return SDEVENTPLUS_CHECK("sd_event_loop", sdevent->sd_event_loop(get()));
82 }
83
exit(int code) const84 void Event::exit(int code) const
85 {
86 SDEVENTPLUS_CHECK("sd_event_exit", sdevent->sd_event_exit(get(), code));
87 }
88
get_exit_code() const89 int Event::get_exit_code() const
90 {
91 int code;
92 SDEVENTPLUS_CHECK("sd_event_get_exit_code",
93 sdevent->sd_event_get_exit_code(get(), &code));
94 return code;
95 }
96
get_watchdog() const97 bool Event::get_watchdog() const
98 {
99 return SDEVENTPLUS_CHECK("sd_event_get_watchdog",
100 sdevent->sd_event_get_watchdog(get()));
101 }
102
set_watchdog(bool b) const103 bool Event::set_watchdog(bool b) const
104 {
105 return SDEVENTPLUS_CHECK("sd_event_set_watchdog",
106 sdevent->sd_event_set_watchdog(get(), b));
107 }
108
ref(sd_event * const & event,const internal::SdEvent * & sdevent,bool & owned)109 sd_event* Event::ref(sd_event* const& event, const internal::SdEvent*& sdevent,
110 bool& owned)
111 {
112 owned = true;
113 return sdevent->sd_event_ref(event);
114 }
115
drop(sd_event * && event,const internal::SdEvent * & sdevent,bool & owned)116 void Event::drop(sd_event*&& event, const internal::SdEvent*& sdevent,
117 bool& owned)
118 {
119 if (owned)
120 {
121 sdevent->sd_event_unref(event);
122 }
123 }
124
125 } // namespace sdeventplus
126