1 #include <memory>
2 #include <sdeventplus/internal/cexec.hpp>
3 #include <sdeventplus/internal/sdevent.hpp>
4 #include <sdeventplus/source/event.hpp>
5 #include <sdeventplus/types.hpp>
6 #include <utility>
7 
8 namespace sdeventplus
9 {
10 namespace source
11 {
12 
13 void EventBase::set_callback(Callback&& callback)
14 {
15     get_userdata().callback = std::move(callback);
16 }
17 
18 EventBase::EventBase(const EventBase& other, sdeventplus::internal::NoOwn) :
19     Base(other, sdeventplus::internal::NoOwn())
20 {
21 }
22 
23 EventBase::EventBase(const char* name, CreateFunc create, const Event& event,
24                      Callback&& callback) :
25     Base(event, create_source(name, create, event), std::false_type())
26 {
27     set_userdata(
28         std::make_unique<detail::EventBaseData>(*this, std::move(callback)));
29 }
30 
31 detail::EventBaseData& EventBase::get_userdata() const
32 {
33     return static_cast<detail::EventBaseData&>(Base::get_userdata());
34 }
35 
36 EventBase::Callback& EventBase::get_callback()
37 {
38     return get_userdata().callback;
39 }
40 
41 sd_event_source* EventBase::create_source(const char* name, CreateFunc create,
42                                           const Event& event)
43 {
44     sd_event_source* source;
45     SDEVENTPLUS_CHECK(name, std::invoke(create, event.getSdEvent(), event.get(),
46                                         &source, eventCallback, nullptr));
47     return source;
48 }
49 
50 int EventBase::eventCallback(sd_event_source* source, void* userdata)
51 {
52     return sourceCallback<Callback, detail::EventBaseData,
53                           &EventBase::get_callback>("eventCallback", source,
54                                                     userdata);
55 }
56 
57 namespace detail
58 {
59 
60 EventBaseData::EventBaseData(const EventBase& base,
61                              EventBase::Callback&& callback) :
62     EventBase(base, sdeventplus::internal::NoOwn()),
63     BaseData(base), callback(std::move(callback))
64 {
65 }
66 
67 } // namespace detail
68 
69 Defer::Defer(const Event& event, Callback&& callback) :
70     EventBase("sd_event_add_defer", &internal::SdEvent::sd_event_add_defer,
71               event, std::move(callback))
72 {
73 }
74 
75 Post::Post(const Event& event, Callback&& callback) :
76     EventBase("sd_event_add_post", &internal::SdEvent::sd_event_add_post, event,
77               std::move(callback))
78 {
79 }
80 
81 Exit::Exit(const Event& event, Callback&& callback) :
82     EventBase("sd_event_add_exit", &internal::SdEvent::sd_event_add_exit, event,
83               std::move(callback))
84 {
85 }
86 
87 } // namespace source
88 } // namespace sdeventplus
89