xref: /openbmc/sdeventplus/src/sdeventplus/source/signal.cpp (revision a8c11e3ca342b090aec615c832b85686bd4655f6)
1 #include <sdeventplus/internal/cexec.hpp>
2 #include <sdeventplus/internal/sdevent.hpp>
3 #include <sdeventplus/source/signal.hpp>
4 #include <sdeventplus/types.hpp>
5 
6 #include <memory>
7 #include <type_traits>
8 #include <utility>
9 
10 namespace sdeventplus
11 {
12 namespace source
13 {
14 
Signal(const Event & event,int sig,Callback && callback)15 Signal::Signal(const Event& event, int sig, Callback&& callback) :
16     Base(event, create_source(event, sig), std::false_type())
17 {
18     set_userdata(
19         std::make_unique<detail::SignalData>(*this, std::move(callback)));
20 }
21 
Signal(const Signal & other,sdeventplus::internal::NoOwn)22 Signal::Signal(const Signal& other, sdeventplus::internal::NoOwn) :
23     Base(other, sdeventplus::internal::NoOwn())
24 {}
25 
set_callback(Callback && callback)26 void Signal::set_callback(Callback&& callback)
27 {
28     get_userdata().callback = std::move(callback);
29 }
30 
get_signal() const31 int Signal::get_signal() const
32 {
33     return SDEVENTPLUS_CHECK(
34         "sd_event_source_get_signal",
35         event.getSdEvent()->sd_event_source_get_signal(get()));
36 }
37 
get_userdata() const38 detail::SignalData& Signal::get_userdata() const
39 {
40     return static_cast<detail::SignalData&>(Base::get_userdata());
41 }
42 
get_callback()43 Signal::Callback& Signal::get_callback()
44 {
45     return get_userdata().callback;
46 }
47 
create_source(const Event & event,int sig)48 sd_event_source* Signal::create_source(const Event& event, int sig)
49 {
50     sd_event_source* source;
51     SDEVENTPLUS_CHECK("sd_event_add_signal",
52                       event.getSdEvent()->sd_event_add_signal(
53                           event.get(), &source, sig, signalCallback, nullptr));
54     return source;
55 }
56 
signalCallback(sd_event_source * source,const struct signalfd_siginfo * si,void * userdata)57 int Signal::signalCallback(sd_event_source* source,
58                            const struct signalfd_siginfo* si, void* userdata)
59 {
60     return sourceCallback<Callback, detail::SignalData, &Signal::get_callback>(
61         "signalCallback", source, userdata, si);
62 }
63 
64 namespace detail
65 {
66 
SignalData(const Signal & base,Signal::Callback && callback)67 SignalData::SignalData(const Signal& base, Signal::Callback&& callback) :
68     Signal(base, sdeventplus::internal::NoOwn()), BaseData(base),
69     callback(std::move(callback))
70 {}
71 
72 } // namespace detail
73 
74 } // namespace source
75 } // namespace sdeventplus
76