From feef68f751e09d8d5a4f2bf2f2f4cab27de1b73e Mon Sep 17 00:00:00 2001 From: "William A. Kennington III" Date: Tue, 17 Jul 2018 14:40:14 -0700 Subject: source/base: Refactor out callback routine The callback mechanism will be used by other callback methods in the same fashion, so we can template and re-use this functionality --- src/sdeventplus/internal/utils.hpp | 35 +++++++++++++++++++++++++++++++++++ src/sdeventplus/source/base.cpp | 31 ++++--------------------------- src/sdeventplus/source/base.hpp | 2 -- 3 files changed, 39 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/sdeventplus/internal/utils.hpp b/src/sdeventplus/internal/utils.hpp index 253e10d..c0b0e68 100644 --- a/src/sdeventplus/internal/utils.hpp +++ b/src/sdeventplus/internal/utils.hpp @@ -1,6 +1,11 @@ #pragma once +#include #include +#include +#include +#include +#include namespace sdeventplus { @@ -9,4 +14,34 @@ namespace sdeventplus using SdEventDuration = std::chrono::duration; +namespace internal +{ + +// Helpers for sd_event callbacks to handle exceptions gracefully +template +static int performCallback(Func func, Args... args) +{ + try + { + func(args...); + return 0; + } + catch (const std::system_error& e) + { + fprintf(stderr, "sdeventplus: callback: %s\n", e.what()); + return -e.code().value(); + } + catch (const std::exception& e) + { + fprintf(stderr, "sdeventplus: callback: %s\n", e.what()); + return -ENOSYS; + } + catch (...) + { + fprintf(stderr, "sdeventplus: callback: Unknown error\n"); + return -ENOSYS; + } +} + +} // namespace internal } // namespace sdeventplus diff --git a/src/sdeventplus/source/base.cpp b/src/sdeventplus/source/base.cpp index 83908d1..5f202db 100644 --- a/src/sdeventplus/source/base.cpp +++ b/src/sdeventplus/source/base.cpp @@ -1,10 +1,10 @@ #include #include -#include +#include #include #include +#include #include -#include #include #include @@ -21,30 +21,6 @@ Base::~Base() } } -int Base::prepareCallback() -{ - try - { - prepare(*this); - return 0; - } - catch (const std::system_error& e) - { - fprintf(stderr, "sdeventplus: prepareCallback: %s\n", e.what()); - return -e.code().value(); - } - catch (const std::exception& e) - { - fprintf(stderr, "sdeventplus: prepareCallback: %s\n", e.what()); - return -ENOSYS; - } - catch (...) - { - fprintf(stderr, "sdeventplus: prepareCallback: Unknown error\n"); - return -ENOSYS; - } -} - sd_event_source* Base::get() const { return source.get(); @@ -84,7 +60,8 @@ static int prepare_callback(sd_event_source*, void* userdata) fprintf(stderr, "sdeventplus: prepare_callback: Missing userdata\n"); return -EINVAL; } - return reinterpret_cast(userdata)->prepareCallback(); + Base* base = reinterpret_cast(userdata); + return internal::performCallback(base->get_prepare(), std::ref(*base)); } void Base::set_prepare(Callback&& callback) diff --git a/src/sdeventplus/source/base.hpp b/src/sdeventplus/source/base.hpp index ed30016..9253b71 100644 --- a/src/sdeventplus/source/base.hpp +++ b/src/sdeventplus/source/base.hpp @@ -19,8 +19,6 @@ class Base virtual ~Base(); - int prepareCallback(); - sd_event_source* get() const; const Event& get_event() const; -- cgit v1.2.3