1 #include <sdeventplus/internal/sdevent.hpp>
2 #include <sdeventplus/internal/utils.hpp>
3 #include <sdeventplus/source/signal.hpp>
4 #include <type_traits>
5 #include <utility>
6 
7 namespace sdeventplus
8 {
9 namespace source
10 {
11 
12 Signal::Signal(const Event& event, int sig, Callback&& callback) :
13     Base(event, create_source(event, sig), std::false_type()),
14     callback(std::move(callback))
15 {
16 }
17 
18 void Signal::set_callback(Callback&& callback)
19 {
20     this->callback = std::move(callback);
21 }
22 
23 int Signal::get_signal() const
24 {
25     return internal::callCheck("sd_event_source_get_signal",
26                                &internal::SdEvent::sd_event_source_get_signal,
27                                event.getSdEvent(), get());
28 }
29 
30 const Signal::Callback& Signal::get_callback() const
31 {
32     return callback;
33 }
34 
35 sd_event_source* Signal::create_source(const Event& event, int sig)
36 {
37     sd_event_source* source;
38     internal::callCheck(
39         "sd_event_add_signal", &internal::SdEvent::sd_event_add_signal,
40         event.getSdEvent(), event.get(), &source, sig, signalCallback, nullptr);
41     return source;
42 }
43 
44 int Signal::signalCallback(sd_event_source* source,
45                            const struct signalfd_siginfo* si, void* userdata)
46 {
47     return sourceCallback<Callback, Signal, &Signal::get_callback>(
48         "signalCallback", source, userdata, si);
49 }
50 
51 } // namespace source
52 } // namespace sdeventplus
53