diff options
| author | William A. Kennington III <wak@google.com> | 2019-03-21 20:09:17 -0700 |
|---|---|---|
| committer | William A. Kennington III <wak@google.com> | 2019-03-29 14:18:57 -0700 |
| commit | 92f21cafaa287e19e9cc208c71713dcdd9022197 (patch) | |
| tree | 0ed234b8b98d5ddf9f115838d0c01bcf5a10b31c /src | |
| parent | b555c4e6ee0d6af411876c61931e0e5b71bc6d5a (diff) | |
| download | sdeventplus-92f21cafaa287e19e9cc208c71713dcdd9022197.tar.gz sdeventplus-92f21cafaa287e19e9cc208c71713dcdd9022197.zip | |
tree-wide: Use cexec for checking calls
This makes error handling guaranteed and slightly more compact.
Tested:
Ran through unit test suite.
Change-Id: If12cf25302390e5e5238f80b4fdb7ea577b5b5c8
Signed-off-by: William A. Kennington III <wak@google.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/sdeventplus/clock.cpp | 10 | ||||
| -rw-r--r-- | src/sdeventplus/event.cpp | 92 | ||||
| -rw-r--r-- | src/sdeventplus/internal/utils.hpp | 16 | ||||
| -rw-r--r-- | src/sdeventplus/source/base.cpp | 77 | ||||
| -rw-r--r-- | src/sdeventplus/source/child.cpp | 21 | ||||
| -rw-r--r-- | src/sdeventplus/source/event.cpp | 9 | ||||
| -rw-r--r-- | src/sdeventplus/source/io.cpp | 52 | ||||
| -rw-r--r-- | src/sdeventplus/source/signal.cpp | 21 | ||||
| -rw-r--r-- | src/sdeventplus/source/time.cpp | 47 |
9 files changed, 139 insertions, 206 deletions
diff --git a/src/sdeventplus/clock.cpp b/src/sdeventplus/clock.cpp index 37395c4..dc9eafd 100644 --- a/src/sdeventplus/clock.cpp +++ b/src/sdeventplus/clock.cpp @@ -1,5 +1,6 @@ #include <sdeventplus/clock.hpp> #include <sdeventplus/exception.hpp> +#include <sdeventplus/internal/sdevent.hpp> #include <sdeventplus/internal/utils.hpp> #include <utility> @@ -20,12 +21,9 @@ template <ClockId Id> typename Clock<Id>::time_point Clock<Id>::now() const { uint64_t now; - int r = event.getSdEvent()->sd_event_now(event.get(), - static_cast<clockid_t>(Id), &now); - if (r < 0) - { - throw SdEventError(-r, "sd_event_now"); - } + internal::callCheck("sd_event_now", &internal::SdEvent::sd_event_now, + event.getSdEvent(), event.get(), + static_cast<clockid_t>(Id), &now); return time_point(SdEventDuration(now)); } diff --git a/src/sdeventplus/event.cpp b/src/sdeventplus/event.cpp index 132dc7f..601c0df 100644 --- a/src/sdeventplus/event.cpp +++ b/src/sdeventplus/event.cpp @@ -1,7 +1,7 @@ #include <functional> #include <sdeventplus/event.hpp> -#include <sdeventplus/exception.hpp> #include <sdeventplus/internal/sdevent.hpp> +#include <sdeventplus/internal/utils.hpp> #include <systemd/sd-event.h> #include <type_traits> @@ -23,22 +23,16 @@ Event::Event(sd_event* event, std::false_type, Event Event::get_new(const internal::SdEvent* sdevent) { sd_event* event = nullptr; - int r = sdevent->sd_event_new(&event); - if (r < 0) - { - throw SdEventError(-r, "sd_event_new"); - } + internal::callCheck("sd_event_new", &internal::SdEvent::sd_event_new, + sdevent, &event); return Event(event, std::false_type(), sdevent); } Event Event::get_default(const internal::SdEvent* sdevent) { sd_event* event = nullptr; - int r = sdevent->sd_event_default(&event); - if (r < 0) - { - throw SdEventError(-r, "sd_event_default"); - } + internal::callCheck("sd_event_default", + &internal::SdEvent::sd_event_default, sdevent, &event); return Event(event, std::false_type(), sdevent); } @@ -54,96 +48,68 @@ const internal::SdEvent* Event::getSdEvent() const int Event::prepare() const { - int r = sdevent->sd_event_prepare(get()); - if (r < 0) - { - throw SdEventError(-r, "sd_event_prepare"); - } - return r; + return internal::callCheck("sd_event_prepare", + &internal::SdEvent::sd_event_prepare, sdevent, + get()); } int Event::wait(MaybeTimeout timeout) const { // An unsigned -1 timeout value means infinity in sd_event uint64_t timeout_usec = timeout ? timeout->count() : -1; - int r = sdevent->sd_event_wait(get(), timeout_usec); - if (r < 0) - { - throw SdEventError(-r, "sd_event_wait"); - } - return r; + return internal::callCheck("sd_event_wait", + &internal::SdEvent::sd_event_wait, sdevent, + get(), timeout_usec); } int Event::dispatch() const { - int r = sdevent->sd_event_dispatch(get()); - if (r < 0) - { - throw SdEventError(-r, "sd_event_dispatch"); - } - return r; + return internal::callCheck("sd_event_dispatch", + &internal::SdEvent::sd_event_dispatch, sdevent, + get()); } int Event::run(MaybeTimeout timeout) const { // An unsigned -1 timeout value means infinity in sd_event uint64_t timeout_usec = timeout ? timeout->count() : -1; - int r = sdevent->sd_event_run(get(), timeout_usec); - if (r < 0) - { - throw SdEventError(-r, "sd_event_run"); - } - return r; + return internal::callCheck("sd_event_run", &internal::SdEvent::sd_event_run, + sdevent, get(), timeout_usec); } int Event::loop() const { - int r = sdevent->sd_event_loop(get()); - if (r < 0) - { - throw SdEventError(-r, "sd_event_loop"); - } - return r; + return internal::callCheck( + "sd_event_loop", &internal::SdEvent::sd_event_loop, sdevent, get()); } void Event::exit(int code) const { - int r = sdevent->sd_event_exit(get(), code); - if (r < 0) - { - throw SdEventError(-r, "sd_event_exit"); - } + internal::callCheck("sd_event_exit", &internal::SdEvent::sd_event_exit, + sdevent, get(), code); } int Event::get_exit_code() const { int code; - int r = sdevent->sd_event_get_exit_code(get(), &code); - if (r < 0) - { - throw SdEventError(-r, "sd_event_get_exit_code"); - } + internal::callCheck("sd_event_get_exit_code", + &internal::SdEvent::sd_event_get_exit_code, sdevent, + get(), &code); return code; } bool Event::get_watchdog() const { - int r = sdevent->sd_event_get_watchdog(get()); - if (r < 0) - { - throw SdEventError(-r, "sd_event_get_watchdog"); - } - return r; + return internal::callCheck("sd_event_get_watchdog", + &internal::SdEvent::sd_event_get_watchdog, + sdevent, get()); } bool Event::set_watchdog(bool b) const { - int r = sdevent->sd_event_set_watchdog(get(), b); - if (r < 0) - { - throw SdEventError(-r, "sd_event_set_watchdog"); - } - return r; + return internal::callCheck("sd_event_set_watchdog", + &internal::SdEvent::sd_event_set_watchdog, + sdevent, get(), b); } sd_event* Event::ref(sd_event* const& event, const internal::SdEvent*& sdevent) diff --git a/src/sdeventplus/internal/utils.hpp b/src/sdeventplus/internal/utils.hpp index ce9342d..193a52c 100644 --- a/src/sdeventplus/internal/utils.hpp +++ b/src/sdeventplus/internal/utils.hpp @@ -6,6 +6,8 @@ #include <exception> #include <sdeventplus/exception.hpp> #include <stdexcept> +#include <stdplus/util/cexec.hpp> +#include <utility> namespace sdeventplus { @@ -46,5 +48,19 @@ inline int performCallback(const char* name, Func func, Args... args) } } +/** @brief Constructs an SdEventError for stdplus cexec + */ +inline SdEventError makeError(int error, const char* msg) +{ + return SdEventError(error, msg); +} + +template <typename... Args> +inline auto callCheck(const char* msg, Args&&... args) +{ + return stdplus::util::callCheckRet<makeError, Args...>( + msg, std::forward<Args>(args)...); +} + } // namespace internal } // namespace sdeventplus diff --git a/src/sdeventplus/source/base.cpp b/src/sdeventplus/source/base.cpp index 09566f8..450d9a1 100644 --- a/src/sdeventplus/source/base.cpp +++ b/src/sdeventplus/source/base.cpp @@ -1,6 +1,6 @@ #include <functional> -#include <sdeventplus/exception.hpp> #include <sdeventplus/internal/sdevent.hpp> +#include <sdeventplus/internal/utils.hpp> #include <sdeventplus/source/base.hpp> #include <type_traits> #include <utility> @@ -31,35 +31,34 @@ const Event& Base::get_event() const const char* Base::get_description() const { const char* description; - int r = event.getSdEvent()->sd_event_source_get_description(get(), - &description); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_get_description"); - } + internal::callCheck("sd_event_source_get_description", + &internal::SdEvent::sd_event_source_get_description, + event.getSdEvent(), get(), &description); return description; } void Base::set_description(const char* description) const { - int r = - event.getSdEvent()->sd_event_source_set_description(get(), description); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_set_description"); - } + internal::callCheck("sd_event_source_set_description", + &internal::SdEvent::sd_event_source_set_description, + event.getSdEvent(), get(), description); } void Base::set_prepare(Callback&& callback) { - int r = event.getSdEvent()->sd_event_source_set_prepare( - get(), callback ? prepareCallback : nullptr); - if (r < 0) + try + { + internal::callCheck("sd_event_source_set_prepare", + &internal::SdEvent::sd_event_source_set_prepare, + event.getSdEvent(), get(), + callback ? prepareCallback : nullptr); + prepare = std::move(callback); + } + catch (...) { prepare = nullptr; - throw SdEventError(-r, "sd_event_source_set_prepare"); + throw; } - prepare = std::move(callback); } const Base::Callback& Base::get_prepare() const @@ -69,53 +68,41 @@ const Base::Callback& Base::get_prepare() const bool Base::get_pending() const { - int r = event.getSdEvent()->sd_event_source_get_pending(get()); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_get_pending"); - } - return r; + return internal::callCheck("sd_event_source_get_pending", + &internal::SdEvent::sd_event_source_get_pending, + event.getSdEvent(), get()); } int64_t Base::get_priority() const { int64_t priority; - int r = event.getSdEvent()->sd_event_source_get_priority(get(), &priority); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_get_priority"); - } + internal::callCheck("sd_event_source_get_priority", + &internal::SdEvent::sd_event_source_get_priority, + event.getSdEvent(), get(), &priority); return priority; } void Base::set_priority(int64_t priority) const { - int r = event.getSdEvent()->sd_event_source_set_priority(get(), priority); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_set_priority"); - } + internal::callCheck("sd_event_source_set_priority", + &internal::SdEvent::sd_event_source_set_priority, + event.getSdEvent(), get(), priority); } Enabled Base::get_enabled() const { int enabled; - int r = event.getSdEvent()->sd_event_source_get_enabled(get(), &enabled); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_get_enabled"); - } + internal::callCheck("sd_event_source_get_enabled", + &internal::SdEvent::sd_event_source_get_enabled, + event.getSdEvent(), get(), &enabled); return static_cast<Enabled>(enabled); } void Base::set_enabled(Enabled enabled) const { - int r = event.getSdEvent()->sd_event_source_set_enabled( - get(), static_cast<int>(enabled)); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_set_enabled"); - } + internal::callCheck("sd_event_source_set_enabled", + &internal::SdEvent::sd_event_source_set_enabled, + event.getSdEvent(), get(), static_cast<int>(enabled)); } Base::Base(const Event& event, sd_event_source* source, std::false_type) : diff --git a/src/sdeventplus/source/child.cpp b/src/sdeventplus/source/child.cpp index c7b02d9..e1fe167 100644 --- a/src/sdeventplus/source/child.cpp +++ b/src/sdeventplus/source/child.cpp @@ -1,4 +1,5 @@ -#include <sdeventplus/exception.hpp> +#include <sdeventplus/internal/sdevent.hpp> +#include <sdeventplus/internal/utils.hpp> #include <sdeventplus/source/child.hpp> #include <type_traits> #include <utility> @@ -22,11 +23,9 @@ void Child::set_callback(Callback&& callback) pid_t Child::get_pid() const { pid_t pid; - int r = event.getSdEvent()->sd_event_source_get_child_pid(get(), &pid); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_get_child_pid"); - } + internal::callCheck("sd_event_source_get_child_pid", + &internal::SdEvent::sd_event_source_get_child_pid, + event.getSdEvent(), get(), &pid); return pid; } @@ -39,12 +38,10 @@ sd_event_source* Child::create_source(const Event& event, pid_t pid, int options) { sd_event_source* source; - int r = event.getSdEvent()->sd_event_add_child( - event.get(), &source, pid, options, childCallback, nullptr); - if (r < 0) - { - throw SdEventError(-r, "sd_event_add_child"); - } + internal::callCheck("sd_event_add_child", + &internal::SdEvent::sd_event_add_child, + event.getSdEvent(), event.get(), &source, pid, options, + childCallback, nullptr); return source; } diff --git a/src/sdeventplus/source/event.cpp b/src/sdeventplus/source/event.cpp index c73f16c..b64ef64 100644 --- a/src/sdeventplus/source/event.cpp +++ b/src/sdeventplus/source/event.cpp @@ -1,4 +1,5 @@ #include <sdeventplus/internal/sdevent.hpp> +#include <sdeventplus/internal/utils.hpp> #include <sdeventplus/source/event.hpp> #include <utility> @@ -28,12 +29,8 @@ sd_event_source* EventBase::create_source(const char* name, CreateFunc create, const Event& event) { sd_event_source* source; - int r = (event.getSdEvent()->*create)(event.get(), &source, eventCallback, - nullptr); - if (r < 0) - { - throw SdEventError(-r, name); - } + internal::callCheck(name, create, event.getSdEvent(), event.get(), &source, + eventCallback, nullptr); return source; } diff --git a/src/sdeventplus/source/io.cpp b/src/sdeventplus/source/io.cpp index d3aa83b..50e0bbf 100644 --- a/src/sdeventplus/source/io.cpp +++ b/src/sdeventplus/source/io.cpp @@ -1,3 +1,5 @@ +#include <sdeventplus/internal/sdevent.hpp> +#include <sdeventplus/internal/utils.hpp> #include <sdeventplus/source/io.hpp> #include <type_traits> #include <utility> @@ -20,51 +22,40 @@ void IO::set_callback(Callback&& callback) int IO::get_fd() const { - int r = event.getSdEvent()->sd_event_source_get_io_fd(get()); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_get_io_fd"); - } - return r; + return internal::callCheck("sd_event_source_get_io_fd", + &internal::SdEvent::sd_event_source_get_io_fd, + event.getSdEvent(), get()); } void IO::set_fd(int fd) const { - int r = event.getSdEvent()->sd_event_source_set_io_fd(get(), fd); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_set_io_fd"); - } + internal::callCheck("sd_event_source_set_io_fd", + &internal::SdEvent::sd_event_source_set_io_fd, + event.getSdEvent(), get(), fd); } uint32_t IO::get_events() const { uint32_t events; - int r = event.getSdEvent()->sd_event_source_get_io_events(get(), &events); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_get_io_events"); - } + internal::callCheck("sd_event_source_get_io_events", + &internal::SdEvent::sd_event_source_get_io_events, + event.getSdEvent(), get(), &events); return events; } void IO::set_events(uint32_t events) const { - int r = event.getSdEvent()->sd_event_source_set_io_events(get(), events); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_set_io_events"); - } + internal::callCheck("sd_event_source_set_io_events", + &internal::SdEvent::sd_event_source_set_io_events, + event.getSdEvent(), get(), events); } uint32_t IO::get_revents() const { uint32_t revents; - int r = event.getSdEvent()->sd_event_source_get_io_revents(get(), &revents); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_get_io_revents"); - } + internal::callCheck("sd_event_source_get_io_revents", + &internal::SdEvent::sd_event_source_get_io_revents, + event.getSdEvent(), get(), &revents); return revents; } @@ -76,12 +67,9 @@ const IO::Callback& IO::get_callback() const sd_event_source* IO::create_source(const Event& event, int fd, uint32_t events) { sd_event_source* source; - int r = event.getSdEvent()->sd_event_add_io(event.get(), &source, fd, - events, ioCallback, nullptr); - if (r < 0) - { - throw SdEventError(-r, "sd_event_add_io"); - } + internal::callCheck("sd_event_add_io", &internal::SdEvent::sd_event_add_io, + event.getSdEvent(), event.get(), &source, fd, events, + ioCallback, nullptr); return source; } diff --git a/src/sdeventplus/source/signal.cpp b/src/sdeventplus/source/signal.cpp index b47d78d..dc39023 100644 --- a/src/sdeventplus/source/signal.cpp +++ b/src/sdeventplus/source/signal.cpp @@ -1,4 +1,5 @@ -#include <sdeventplus/exception.hpp> +#include <sdeventplus/internal/sdevent.hpp> +#include <sdeventplus/internal/utils.hpp> #include <sdeventplus/source/signal.hpp> #include <type_traits> #include <utility> @@ -21,12 +22,9 @@ void Signal::set_callback(Callback&& callback) int Signal::get_signal() const { - int r = event.getSdEvent()->sd_event_source_get_signal(get()); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_get_signal"); - } - return r; + return internal::callCheck("sd_event_source_get_signal", + &internal::SdEvent::sd_event_source_get_signal, + event.getSdEvent(), get()); } const Signal::Callback& Signal::get_callback() const @@ -37,12 +35,9 @@ const Signal::Callback& Signal::get_callback() const 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"); - } + internal::callCheck( + "sd_event_add_signal", &internal::SdEvent::sd_event_add_signal, + event.getSdEvent(), event.get(), &source, sig, signalCallback, nullptr); return source; } diff --git a/src/sdeventplus/source/time.cpp b/src/sdeventplus/source/time.cpp index 9d4f9ca..856e65f 100644 --- a/src/sdeventplus/source/time.cpp +++ b/src/sdeventplus/source/time.cpp @@ -1,6 +1,6 @@ #include <cstdio> #include <sdeventplus/clock.hpp> -#include <sdeventplus/exception.hpp> +#include <sdeventplus/internal/sdevent.hpp> #include <sdeventplus/internal/utils.hpp> #include <sdeventplus/source/time.hpp> #include <type_traits> @@ -29,46 +29,38 @@ template <ClockId Id> typename Time<Id>::TimePoint Time<Id>::get_time() const { uint64_t usec; - int r = event.getSdEvent()->sd_event_source_get_time(get(), &usec); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_get_time"); - } + internal::callCheck("sd_event_source_get_time", + &internal::SdEvent::sd_event_source_get_time, + event.getSdEvent(), get(), &usec); return Time<Id>::TimePoint(SdEventDuration(usec)); } template <ClockId Id> void Time<Id>::set_time(TimePoint time) const { - int r = event.getSdEvent()->sd_event_source_set_time( - get(), SdEventDuration(time.time_since_epoch()).count()); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_set_time"); - } + internal::callCheck("sd_event_source_set_time", + &internal::SdEvent::sd_event_source_set_time, + event.getSdEvent(), get(), + SdEventDuration(time.time_since_epoch()).count()); } template <ClockId Id> typename Time<Id>::Accuracy Time<Id>::get_accuracy() const { uint64_t usec; - int r = event.getSdEvent()->sd_event_source_get_time_accuracy(get(), &usec); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_get_time_accuracy"); - } + internal::callCheck("sd_event_source_get_time_accuracy", + &internal::SdEvent::sd_event_source_get_time_accuracy, + event.getSdEvent(), get(), &usec); return SdEventDuration(usec); } template <ClockId Id> void Time<Id>::set_accuracy(Accuracy accuracy) const { - int r = event.getSdEvent()->sd_event_source_set_time_accuracy( - get(), SdEventDuration(accuracy).count()); - if (r < 0) - { - throw SdEventError(-r, "sd_event_source_set_time_accuracy"); - } + internal::callCheck("sd_event_source_set_time_accuracy", + &internal::SdEvent::sd_event_source_set_time_accuracy, + event.getSdEvent(), get(), + SdEventDuration(accuracy).count()); } template <ClockId Id> @@ -82,14 +74,11 @@ sd_event_source* Time<Id>::create_source(const Event& event, TimePoint time, Accuracy accuracy) { sd_event_source* source; - int r = event.getSdEvent()->sd_event_add_time( - event.get(), &source, static_cast<clockid_t>(Id), + internal::callCheck( + "sd_event_add_time", &internal::SdEvent::sd_event_add_time, + event.getSdEvent(), event.get(), &source, static_cast<clockid_t>(Id), SdEventDuration(time.time_since_epoch()).count(), SdEventDuration(accuracy).count(), timeCallback, nullptr); - if (r < 0) - { - throw SdEventError(-r, "sd_event_add_time"); - } return source; } |

