| #pragma once |
| |
| #include <function2/function2.hpp> |
| #include <sdeventplus/event.hpp> |
| #include <sdeventplus/source/base.hpp> |
| #include <sdeventplus/types.hpp> |
| #include <sys/signalfd.h> |
| |
| namespace sdeventplus |
| { |
| namespace source |
| { |
| |
| namespace detail |
| { |
| class SignalData; |
| } // namespace detail |
| |
| /** @class Signal |
| * @brief A wrapper around the sd_event_source signal type |
| * See sd_event_add_signal(3) for more information |
| */ |
| class Signal : public Base |
| { |
| public: |
| /** @brief Type of the user provided callback function */ |
| using Callback = fu2::unique_function<void( |
| Signal& source, const struct signalfd_siginfo* si)>; |
| |
| /** @brief Creates a new signal event source on the provided event loop |
| * This type of source defaults to Enabled::On, executing the |
| * callback for each signal observed. You are required to block |
| * the signal in all threads prior to creating this source. |
| * |
| * @param[in] event - The event to attach the handler |
| * @param[in] sig - Signum to watch, see signal(7) |
| * @param[in] callback - The function executed on event dispatch |
| * @throws SdEventError for underlying sd_event errors |
| */ |
| Signal(const Event& event, int sig, Callback&& callback); |
| |
| /** @brief Constructs a non-owning signal source handler |
| * Does not own the passed reference to the source because |
| * this is meant to be used only as a reference inside an event |
| * source. |
| * @internal |
| * |
| * @param[in] other - The source wrapper to copy |
| * @param[in] - Signifies that this new copy is non-owning |
| * @throws SdEventError for underlying sd_event errors |
| */ |
| Signal(const Signal& other, sdeventplus::internal::NoOwn); |
| |
| /** @brief Sets the callback |
| * |
| * @param[in] callback - The function executed on event dispatch |
| */ |
| void set_callback(Callback&& callback); |
| |
| /** @brief Gets the signum watched by the source |
| * |
| * @throws SdEventError for underlying sd_event errors |
| * @return Integer signum |
| */ |
| int get_signal() const; |
| |
| private: |
| /** @brief Returns a reference to the source owned signal |
| * |
| * @return A reference to the signal |
| */ |
| detail::SignalData& get_userdata() const; |
| |
| /** @brief Returns a reference to the callback executed for this source |
| * |
| * @return A reference to the callback |
| */ |
| Callback& get_callback(); |
| |
| /** @brief Creates a new signal source attached to the Event |
| * |
| * @param[in] event - The event to attach the handler |
| * @param[in] sig - Signum to watch, see signal(7) |
| * @param[in] callback - The function executed on event dispatch |
| * @throws SdEventError for underlying sd_event errors |
| * @return A new sd_event_source |
| */ |
| static sd_event_source* create_source(const Event& event, int sig); |
| |
| /** @brief A wrapper around the callback that can be called from sd-event |
| * |
| * @param[in] source - The sd_event_source associated with the call |
| * @param[in] userdata - The provided userdata for the source |
| * @return 0 on success or a negative errno otherwise |
| */ |
| static int signalCallback(sd_event_source* source, |
| const struct signalfd_siginfo* si, |
| void* userdata); |
| }; |
| |
| namespace detail |
| { |
| |
| class SignalData : public Signal, public BaseData |
| { |
| private: |
| Signal::Callback callback; |
| |
| public: |
| SignalData(const Signal& base, Signal::Callback&& callback); |
| |
| friend Signal; |
| }; |
| |
| } // namespace detail |
| |
| } // namespace source |
| } // namespace sdeventplus |