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