1 #include <sdeventplus/internal/cexec.hpp>
2 #include <sdeventplus/internal/sdevent.hpp>
3 #include <sdeventplus/source/event.hpp>
4 #include <sdeventplus/types.hpp>
5
6 #include <memory>
7 #include <utility>
8
9 namespace sdeventplus
10 {
11 namespace source
12 {
13
set_callback(Callback && callback)14 void EventBase::set_callback(Callback&& callback)
15 {
16 get_userdata().callback = std::move(callback);
17 }
18
EventBase(const EventBase & other,sdeventplus::internal::NoOwn)19 EventBase::EventBase(const EventBase& other, sdeventplus::internal::NoOwn) :
20 Base(other, sdeventplus::internal::NoOwn())
21 {}
22
EventBase(const char * name,CreateFunc create,const Event & event,Callback && callback)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
get_userdata() const31 detail::EventBaseData& EventBase::get_userdata() const
32 {
33 return static_cast<detail::EventBaseData&>(Base::get_userdata());
34 }
35
get_callback()36 EventBase::Callback& EventBase::get_callback()
37 {
38 return get_userdata().callback;
39 }
40
create_source(const char * name,CreateFunc create,const Event & event)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
eventCallback(sd_event_source * source,void * userdata)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
EventBaseData(const EventBase & base,EventBase::Callback && callback)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 } // namespace detail
67
Defer(const Event & event,Callback && callback)68 Defer::Defer(const Event& event, Callback&& callback) :
69 EventBase("sd_event_add_defer", &internal::SdEvent::sd_event_add_defer,
70 event, std::move(callback))
71 {}
72
Post(const Event & event,Callback && callback)73 Post::Post(const Event& event, Callback&& callback) :
74 EventBase("sd_event_add_post", &internal::SdEvent::sd_event_add_post, event,
75 std::move(callback))
76 {}
77
Exit(const Event & event,Callback && callback)78 Exit::Exit(const Event& event, Callback&& callback) :
79 EventBase("sd_event_add_exit", &internal::SdEvent::sd_event_add_exit, event,
80 std::move(callback))
81 {}
82
83 } // namespace source
84 } // namespace sdeventplus
85