xref: /openbmc/sdeventplus/src/sdeventplus/event.cpp (revision 18db9a3e47e7ebdedae5b698bfb1068366ff6824)
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