diff options
| author | William A. Kennington III <wak@google.com> | 2018-07-22 18:15:59 -0700 |
|---|---|---|
| committer | William A. Kennington III <wak@google.com> | 2018-07-22 18:32:56 -0700 |
| commit | a3a38504c75fd72233f20a42065184d3727ac6c8 (patch) | |
| tree | 4a486c5c269873ca28dc902dd9d8da02e2afc537 /src | |
| parent | ce80c3ff01ef7c4086108cacbf61da5255248884 (diff) | |
| download | sdeventplus-a3a38504c75fd72233f20a42065184d3727ac6c8.tar.gz sdeventplus-a3a38504c75fd72233f20a42065184d3727ac6c8.zip | |
source/signal: Implement
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile.am | 3 | ||||
| -rw-r--r-- | src/sdeventplus/internal/sdevent.cpp | 5 | ||||
| -rw-r--r-- | src/sdeventplus/internal/sdevent.hpp | 13 | ||||
| -rw-r--r-- | src/sdeventplus/source/signal.cpp | 52 | ||||
| -rw-r--r-- | src/sdeventplus/source/signal.hpp | 35 | ||||
| -rw-r--r-- | src/sdeventplus/test/sdevent.hpp | 4 |
6 files changed, 112 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 74f01f5..236e347 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -30,6 +30,9 @@ libsdeventplus_la_SOURCES += sdeventplus/source/event.cpp nobase_include_HEADERS += sdeventplus/source/io.hpp libsdeventplus_la_SOURCES += sdeventplus/source/io.cpp +nobase_include_HEADERS += sdeventplus/source/signal.hpp +libsdeventplus_la_SOURCES += sdeventplus/source/signal.cpp + nobase_include_HEADERS += sdeventplus/source/time.hpp libsdeventplus_la_SOURCES += sdeventplus/source/time.cpp diff --git a/src/sdeventplus/internal/sdevent.cpp b/src/sdeventplus/internal/sdevent.cpp index 467a3c3..ad5114c 100644 --- a/src/sdeventplus/internal/sdevent.cpp +++ b/src/sdeventplus/internal/sdevent.cpp @@ -244,6 +244,11 @@ int SdEventImpl::sd_event_source_set_time_accuracy(sd_event_source* source, return ::sd_event_source_set_time_accuracy(source, usec); } +int SdEventImpl::sd_event_source_get_signal(sd_event_source* source) const +{ + return ::sd_event_source_get_signal(source); +} + SdEventImpl sdevent_impl; } // namespace internal diff --git a/src/sdeventplus/internal/sdevent.hpp b/src/sdeventplus/internal/sdevent.hpp index 62acbbe..42427eb 100644 --- a/src/sdeventplus/internal/sdevent.hpp +++ b/src/sdeventplus/internal/sdevent.hpp @@ -25,6 +25,9 @@ class SdEvent uint64_t accuracy, sd_event_time_handler_t callback, void* userdata) const = 0; + virtual int sd_event_add_signal(sd_event* event, sd_event_source** source, + int sig, sd_event_signal_handler_t callback, + void* userdata) const = 0; virtual int sd_event_add_defer(sd_event* event, sd_event_source** source, sd_event_handler_t callback, void* userdata) const = 0; @@ -96,6 +99,7 @@ class SdEvent uint64_t* usec) const = 0; virtual int sd_event_source_set_time_accuracy(sd_event_source* source, uint64_t usec) const = 0; + virtual int sd_event_source_get_signal(sd_event_source*) const = 0; }; class SdEventImpl : public SdEvent @@ -113,6 +117,14 @@ class SdEventImpl : public SdEvent clockid_t clock, uint64_t usec, uint64_t accuracy, sd_event_time_handler_t callback, void* userdata) const override; + + int sd_event_add_signal(sd_event* event, sd_event_source** source, int sig, + sd_event_signal_handler_t callback, + void* userdata) const override + { + return ::sd_event_add_signal(event, source, sig, callback, userdata); + } + int sd_event_add_defer(sd_event* event, sd_event_source** source, sd_event_handler_t callback, void* userdata) const override; @@ -180,6 +192,7 @@ class SdEventImpl : public SdEvent uint64_t* usec) const override; int sd_event_source_set_time_accuracy(sd_event_source* source, uint64_t usec) const override; + int sd_event_source_get_signal(sd_event_source*) const override; }; extern SdEventImpl sdevent_impl; diff --git a/src/sdeventplus/source/signal.cpp b/src/sdeventplus/source/signal.cpp new file mode 100644 index 0000000..1df3a29 --- /dev/null +++ b/src/sdeventplus/source/signal.cpp @@ -0,0 +1,52 @@ +#include <sdeventplus/exception.hpp> +#include <sdeventplus/source/signal.hpp> +#include <type_traits> +#include <utility> + +namespace sdeventplus +{ +namespace source +{ + +Signal::Signal(const Event& event, int sig, Callback&& callback) : + Base(event, create_source(event, sig), std::false_type()), + callback(std::move(callback)) +{ +} + +int Signal::get_signal() const +{ + int r = event.getSdEvent()->sd_event_source_get_signal(source.get()); + if (r < 0) + { + throw SdEventError(-r, "sd_event_source_get_signal"); + } + return r; +} + +const Signal::Callback& Signal::get_callback() const +{ + return callback; +} + +sd_event_source* Signal::create_source(const Event& event, int sig) +{ + sd_event_source* source; + int r = event.getSdEvent()->sd_event_add_signal(event.get(), &source, sig, + signalCallback, nullptr); + if (r < 0) + { + throw SdEventError(-r, "sd_event_add_signal"); + } + return source; +} + +int Signal::signalCallback(sd_event_source* source, + const struct signalfd_siginfo* si, void* userdata) +{ + return sourceCallback<Callback, Signal, &Signal::get_callback>( + "signalCallback", source, userdata, si); +} + +} // namespace source +} // namespace sdeventplus diff --git a/src/sdeventplus/source/signal.hpp b/src/sdeventplus/source/signal.hpp new file mode 100644 index 0000000..ec8d227 --- /dev/null +++ b/src/sdeventplus/source/signal.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include <functional> +#include <sdeventplus/source/base.hpp> +#include <sys/signalfd.h> + +namespace sdeventplus +{ +namespace source +{ + +class Signal : public Base +{ + public: + using Callback = + std::function<void(Signal& source, const struct signalfd_siginfo* si)>; + + Signal(const Event& event, int sig, Callback&& callback); + + int get_signal() const; + + private: + Callback callback; + + const Callback& get_callback() const; + + static sd_event_source* create_source(const Event& event, int sig); + + static int signalCallback(sd_event_source* source, + const struct signalfd_siginfo* si, + void* userdata); +}; + +} // namespace source +} // namespace sdeventplus diff --git a/src/sdeventplus/test/sdevent.hpp b/src/sdeventplus/test/sdevent.hpp index 28c484d..37b4464 100644 --- a/src/sdeventplus/test/sdevent.hpp +++ b/src/sdeventplus/test/sdevent.hpp @@ -23,6 +23,9 @@ class SdEventMock : public internal::SdEvent MOCK_CONST_METHOD7(sd_event_add_time, int(sd_event*, sd_event_source**, clockid_t, uint64_t, uint64_t, sd_event_time_handler_t, void*)); + MOCK_CONST_METHOD5(sd_event_add_signal, + int(sd_event*, sd_event_source**, int, + sd_event_signal_handler_t, void*)); MOCK_CONST_METHOD4(sd_event_add_defer, int(sd_event*, sd_event_source**, sd_event_handler_t, void*)); MOCK_CONST_METHOD4(sd_event_add_post, int(sd_event*, sd_event_source**, @@ -83,6 +86,7 @@ class SdEventMock : public internal::SdEvent int(sd_event_source*, uint64_t*)); MOCK_CONST_METHOD2(sd_event_source_set_time_accuracy, int(sd_event_source*, uint64_t)); + MOCK_CONST_METHOD1(sd_event_source_get_signal, int(sd_event_source*)); }; } // namespace test |

