diff options
| author | William A. Kennington III <wak@google.com> | 2018-07-17 14:40:14 -0700 |
|---|---|---|
| committer | William A. Kennington III <wak@google.com> | 2018-07-17 14:40:14 -0700 |
| commit | 0a816c5d8054dfe3867423aa4303c5cf7b4a92e9 (patch) | |
| tree | 03e102d017105a0a8c98f2a72f413aff79a90af3 /src | |
| parent | 154a2b3ab755e700a0290307c09b16d68dd52565 (diff) | |
| download | sdeventplus-0a816c5d8054dfe3867423aa4303c5cf7b4a92e9.tar.gz sdeventplus-0a816c5d8054dfe3867423aa4303c5cf7b4a92e9.zip | |
Large refactoring
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile.am | 7 | ||||
| -rw-r--r-- | src/sdeventplus/event.cpp | 33 | ||||
| -rw-r--r-- | src/sdeventplus/event.hpp | 14 | ||||
| -rw-r--r-- | src/sdeventplus/exception.cpp | 2 | ||||
| -rw-r--r-- | src/sdeventplus/exception.hpp | 2 | ||||
| -rw-r--r-- | src/sdeventplus/internal/sdevent.cpp | 7 | ||||
| -rw-r--r-- | src/sdeventplus/internal/sdevent.hpp | 51 | ||||
| -rw-r--r-- | src/sdeventplus/internal/sdref.cpp | 79 | ||||
| -rw-r--r-- | src/sdeventplus/internal/sdref.hpp | 75 | ||||
| -rw-r--r-- | src/sdeventplus/source.cpp | 21 | ||||
| -rw-r--r-- | src/sdeventplus/source.hpp | 22 | ||||
| -rw-r--r-- | src/sdeventplus/source/base.cpp | 26 | ||||
| -rw-r--r-- | src/sdeventplus/source/base.hpp | 34 | ||||
| -rw-r--r-- | src/sdeventplus/test/sdevent.hpp | 24 |
14 files changed, 228 insertions, 169 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index f006891..2943a2c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -10,12 +10,13 @@ libsdeventplus_la_SOURCES += sdeventplus/event.cpp nobase_include_HEADERS += sdeventplus/exception.hpp libsdeventplus_la_SOURCES += sdeventplus/exception.cpp -nobase_include_HEADERS += sdeventplus/source.hpp -libsdeventplus_la_SOURCES += sdeventplus/source.cpp - nobase_include_HEADERS += sdeventplus/internal/sdevent.hpp libsdeventplus_la_SOURCES += sdeventplus/internal/sdevent.cpp nobase_include_HEADERS += sdeventplus/internal/sdref.hpp +libsdeventplus_la_SOURCES += sdeventplus/internal/sdref.cpp + +nobase_include_HEADERS += sdeventplus/source/base.hpp +libsdeventplus_la_SOURCES += sdeventplus/source/base.cpp nobase_include_HEADERS += sdeventplus/test/sdevent.hpp diff --git a/src/sdeventplus/event.cpp b/src/sdeventplus/event.cpp index b472602..897f549 100644 --- a/src/sdeventplus/event.cpp +++ b/src/sdeventplus/event.cpp @@ -1,49 +1,50 @@ #include <functional> #include <sdeventplus/event.hpp> #include <sdeventplus/exception.hpp> +#include <sdeventplus/internal/sdevent.hpp> #include <systemd/sd-event.h> namespace sdeventplus { -Event::Event(sd_event* event, SdEventInterface* intf) : - intf(intf), event(event, &SdEventInterface::sd_event_ref, - &SdEventInterface::sd_event_unref, intf) +Event::Event(sd_event* event, internal::SdEvent* sdevent) : + sdevent(sdevent), event(event, &internal::SdEvent::sd_event_ref, + &internal::SdEvent::sd_event_unref, sdevent) { } -Event::Event(sd_event* event, std::false_type, SdEventInterface* intf) : - intf(intf), - event(event, &SdEventInterface::sd_event_ref, - &SdEventInterface::sd_event_unref, std::false_type(), intf) +Event::Event(sd_event* event, std::false_type, internal::SdEvent* sdevent) : + sdevent(sdevent), + event(event, &internal::SdEvent::sd_event_ref, + &internal::SdEvent::sd_event_unref, std::false_type(), sdevent) { } -Event Event::get_new(SdEventInterface* intf) +Event Event::get_new(internal::SdEvent* sdevent) { sd_event* event = nullptr; - int r = intf->sd_event_new(&event); + int r = sdevent->sd_event_new(&event); if (r < 0) { throw SdEventError(-r, "sd_event_new"); } - return Event(event, std::false_type(), intf); + return Event(event, std::false_type(), sdevent); } -Event Event::get_default(SdEventInterface* intf) +Event Event::get_default(internal::SdEvent* sdevent) { sd_event* event = nullptr; - int r = intf->sd_event_default(&event); + int r = sdevent->sd_event_default(&event); if (r < 0) { throw SdEventError(-r, "sd_event_default"); } - return Event(event, std::false_type(), intf); + return Event(event, std::false_type(), sdevent); } int Event::loop() { - int r = intf->sd_event_loop(event.get()); + int r = sdevent->sd_event_loop(event.get()); if (r < 0) { throw SdEventError(-r, "sd_event_loop"); @@ -53,7 +54,7 @@ int Event::loop() int Event::get_watchdog() { - int r = intf->sd_event_get_watchdog(event.get()); + int r = sdevent->sd_event_get_watchdog(event.get()); if (r < 0) { throw SdEventError(-r, "sd_event_get_watchdog"); @@ -63,7 +64,7 @@ int Event::get_watchdog() int Event::set_watchdog(int b) { - int r = intf->sd_event_set_watchdog(event.get(), b); + int r = sdevent->sd_event_set_watchdog(event.get(), b); if (r < 0) { throw SdEventError(-r, "sd_event_set_watchdog"); diff --git a/src/sdeventplus/event.hpp b/src/sdeventplus/event.hpp index 9206ee9..f55e9fa 100644 --- a/src/sdeventplus/event.hpp +++ b/src/sdeventplus/event.hpp @@ -10,19 +10,21 @@ namespace sdeventplus class Event { public: - Event(sd_event* event, SdEventInterface* intf = &sdevent_impl); + Event(sd_event* event, + internal::SdEvent* sdevent = &internal::sdevent_impl); Event(sd_event* event, std::false_type, - SdEventInterface* intf = &sdevent_impl); - static Event get_new(SdEventInterface* intf = &sdevent_impl); - static Event get_default(SdEventInterface* intf = &sdevent_impl); + internal::SdEvent* sdevent = &internal::sdevent_impl); + static Event get_new(internal::SdEvent* sdevent = &internal::sdevent_impl); + static Event + get_default(internal::SdEvent* sdevent = &internal::sdevent_impl); int loop(); int get_watchdog(); int set_watchdog(int b); private: - SdEventInterface* intf; - SdRef<sd_event> event; + internal::SdEvent* sdevent; + internal::SdRef<sd_event> event; }; } // namespace sdeventplus diff --git a/src/sdeventplus/exception.cpp b/src/sdeventplus/exception.cpp index 1cfba4f..9e8b7de 100644 --- a/src/sdeventplus/exception.cpp +++ b/src/sdeventplus/exception.cpp @@ -4,7 +4,7 @@ namespace sdeventplus { -SdEventError::SdEventError(int r, const char *prefix) : +SdEventError::SdEventError(int r, const char* prefix) : std::system_error(r, std::generic_category(), prefix) { } diff --git a/src/sdeventplus/exception.hpp b/src/sdeventplus/exception.hpp index eb88649..5412d70 100644 --- a/src/sdeventplus/exception.hpp +++ b/src/sdeventplus/exception.hpp @@ -8,7 +8,7 @@ namespace sdeventplus class SdEventError final : public std::system_error { public: - SdEventError(int r, const char *prefix); + SdEventError(int r, const char* prefix); }; } // namespace sdeventplus diff --git a/src/sdeventplus/internal/sdevent.cpp b/src/sdeventplus/internal/sdevent.cpp index cf992ef..af729b2 100644 --- a/src/sdeventplus/internal/sdevent.cpp +++ b/src/sdeventplus/internal/sdevent.cpp @@ -2,5 +2,10 @@ namespace sdeventplus { +namespace internal +{ + SdEventImpl sdevent_impl; -} + +} // namespace internal +} // namespace sdeventplus diff --git a/src/sdeventplus/internal/sdevent.hpp b/src/sdeventplus/internal/sdevent.hpp index 670d46a..7603a3d 100644 --- a/src/sdeventplus/internal/sdevent.hpp +++ b/src/sdeventplus/internal/sdevent.hpp @@ -4,71 +4,73 @@ namespace sdeventplus { +namespace internal +{ -class SdEventInterface +class SdEvent { public: - virtual ~SdEventInterface() = default; + virtual ~SdEvent() = default; - virtual int sd_event_default(sd_event **event) const = 0; - virtual int sd_event_new(sd_event **event) const = 0; - virtual sd_event *sd_event_ref(sd_event *event) const = 0; - virtual sd_event *sd_event_unref(sd_event *event) const = 0; + virtual int sd_event_default(sd_event** event) const = 0; + virtual int sd_event_new(sd_event** event) const = 0; + virtual sd_event* sd_event_ref(sd_event* event) const = 0; + virtual sd_event* sd_event_unref(sd_event* event) const = 0; - virtual int sd_event_loop(sd_event *event) const = 0; - virtual int sd_event_get_watchdog(sd_event *event) const = 0; - virtual int sd_event_set_watchdog(sd_event *event, int b) const = 0; + virtual int sd_event_loop(sd_event* event) const = 0; + virtual int sd_event_get_watchdog(sd_event* event) const = 0; + virtual int sd_event_set_watchdog(sd_event* event, int b) const = 0; - virtual sd_event_source * - sd_event_source_ref(sd_event_source *source) const = 0; - virtual sd_event_source * - sd_event_source_unref(sd_event_source *source) const = 0; + virtual sd_event_source* + sd_event_source_ref(sd_event_source* source) const = 0; + virtual sd_event_source* + sd_event_source_unref(sd_event_source* source) const = 0; }; -class SdEventImpl : public SdEventInterface +class SdEventImpl : public SdEvent { public: - int sd_event_default(sd_event **event) const override + int sd_event_default(sd_event** event) const override { return ::sd_event_default(event); } - int sd_event_new(sd_event **event) const override + int sd_event_new(sd_event** event) const override { return ::sd_event_default(event); } - sd_event *sd_event_ref(sd_event *event) const override + sd_event* sd_event_ref(sd_event* event) const override { return ::sd_event_ref(event); } - sd_event *sd_event_unref(sd_event *event) const override + sd_event* sd_event_unref(sd_event* event) const override { return ::sd_event_unref(event); } - int sd_event_loop(sd_event *event) const override + int sd_event_loop(sd_event* event) const override { return ::sd_event_loop(event); } - int sd_event_get_watchdog(sd_event *event) const override + int sd_event_get_watchdog(sd_event* event) const override { return ::sd_event_get_watchdog(event); } - int sd_event_set_watchdog(sd_event *event, int b) const override + int sd_event_set_watchdog(sd_event* event, int b) const override { return ::sd_event_set_watchdog(event, b); } - sd_event_source *sd_event_source_ref(sd_event_source *source) const override + sd_event_source* sd_event_source_ref(sd_event_source* source) const override { return ::sd_event_source_ref(source); } - sd_event_source * - sd_event_source_unref(sd_event_source *source) const override + sd_event_source* + sd_event_source_unref(sd_event_source* source) const override { return ::sd_event_source_unref(source); } @@ -76,4 +78,5 @@ class SdEventImpl : public SdEventInterface extern SdEventImpl sdevent_impl; +} // namespace internal } // namespace sdeventplus diff --git a/src/sdeventplus/internal/sdref.cpp b/src/sdeventplus/internal/sdref.cpp new file mode 100644 index 0000000..44e38d6 --- /dev/null +++ b/src/sdeventplus/internal/sdref.cpp @@ -0,0 +1,79 @@ +#include <sdeventplus/internal/sdref.hpp> +#include <type_traits> +#include <utility> + +namespace sdeventplus +{ +namespace internal +{ + +template <typename T> +SdRef<T>::SdRef(T* ref, Func take_ref, Func release_ref, SdEvent* sdevent) : + SdRef(take_ref(sdevent, ref), take_ref, release_ref, std::false_type(), + sdevent) +{ +} + +template <typename T> +SdRef<T>::SdRef(T* ref, Func take_ref, Func release_ref, std::false_type, + SdEvent* sdevent) : + sdevent(sdevent), + take_ref(take_ref), release_ref(release_ref), ref(ref) +{ +} + +template <typename T> +SdRef<T>::SdRef(const SdRef& other) : + SdRef(other.ref, other.take_ref, other.release_ref, other.sdevent) +{ +} + +template <typename T> SdRef<T>& SdRef<T>::operator=(const SdRef& other) +{ + if (this != &other) + { + // release_ref will be invalid if moved + if (release_ref) + release_ref(sdevent, ref); + + sdevent = other.sdevent; + take_ref = other.take_ref; + release_ref = other.release_ref; + ref = take_ref(sdevent, other.ref); + } + return *this; +} + +template <typename T> SdRef<T>& SdRef<T>::operator=(SdRef&& other) +{ + if (this != &other) + { + // release_ref will be invalid if move + if (release_ref) + release_ref(sdevent, ref); + + sdevent = std::move(other.sdevent); + take_ref = std::move(other.take_ref); + release_ref = std::move(other.release_ref); + ref = std::move(other.ref); + } + return *this; +} + +template <typename T> SdRef<T>::~SdRef() +{ + // release_ref will be invalid after a move + if (release_ref) + release_ref(sdevent, ref); +} + +template <typename T> T* SdRef<T>::get() const +{ + return ref; +} + +template class SdRef<sd_event>; +template class SdRef<sd_event_source>; + +} // namespace internal +} // namespace sdeventplus diff --git a/src/sdeventplus/internal/sdref.hpp b/src/sdeventplus/internal/sdref.hpp index b6e2ba2..bd220dd 100644 --- a/src/sdeventplus/internal/sdref.hpp +++ b/src/sdeventplus/internal/sdref.hpp @@ -1,89 +1,38 @@ #pragma once #include <functional> -#include <memory> #include <sdeventplus/internal/sdevent.hpp> #include <type_traits> namespace sdeventplus { +namespace internal +{ template <typename T> class SdRef { public: - using Func = std::function<T*(SdEventInterface*, T*)>; + using Func = std::function<T*(SdEvent*, T*)>; SdRef(T* ref, Func take_ref, Func release_ref, - SdEventInterface* intf = sdevent_impl) : - SdRef(take_ref(intf, ref), take_ref, release_ref, std::false_type(), - intf) - { - } - + SdEvent* sdevent = &sdevent_impl); SdRef(T* ref, Func take_ref, Func release_ref, std::false_type, - SdEventInterface* intf = sdevent_impl) : - intf(intf), - take_ref(take_ref), release_ref(release_ref), ref(ref) - { - } - - SdRef(const SdRef& other) : - intf(other.intf), take_ref(other.take_ref), - release_ref(other.release_ref), ref(take_ref(intf, other.ref)) - { - } - - SdRef& operator=(const SdRef& other) - { - if (this != &other) - { - // release_ref will be invalid if moved - if (release_ref) - release_ref(intf, ref); - - intf = other.intf; - take_ref = other.take_ref; - release_ref = other.release_ref; - ref = take_ref(intf, other.ref); - } - return *this; - } + SdEvent* sdevent = &sdevent_impl); + virtual ~SdRef(); + SdRef(const SdRef& other); + SdRef& operator=(const SdRef& other); SdRef(SdRef&& other) = default; + SdRef& operator=(SdRef&& other); - SdRef& operator=(SdRef&& other) - { - if (this != &other) - { - // release_ref will be invalid if move - if (release_ref) - release_ref(intf, ref); - - intf = std::move(other.intf); - take_ref = std::move(other.take_ref); - release_ref = std::move(other.release_ref); - ref = std::move(other.ref); - } - return *this; - } - - virtual ~SdRef() - { - // release_ref will be invalid after a move - if (release_ref) - release_ref(intf, ref); - } - - T* get() const - { - return ref; - } + T* get() const; private: - SdEventInterface* intf; + SdEvent* sdevent; Func take_ref; Func release_ref; T* ref; }; +} // namespace internal } // namespace sdeventplus diff --git a/src/sdeventplus/source.cpp b/src/sdeventplus/source.cpp deleted file mode 100644 index eb3c903..0000000 --- a/src/sdeventplus/source.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include <sdeventplus/source.hpp> -#include <type_traits> - -namespace sdeventplus -{ - -Source::Source(sd_event_source* source, SdEventInterface* intf) : - intf(intf), source(source, &SdEventInterface::sd_event_source_ref, - &SdEventInterface::sd_event_source_unref, intf) -{ -} - -Source::Source(sd_event_source* source, std::false_type, - SdEventInterface* intf) : - intf(intf), - source(source, &SdEventInterface::sd_event_source_ref, - &SdEventInterface::sd_event_source_unref, std::false_type(), intf) -{ -} - -} // namespace sdeventplus diff --git a/src/sdeventplus/source.hpp b/src/sdeventplus/source.hpp deleted file mode 100644 index 9921a88..0000000 --- a/src/sdeventplus/source.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include <sdeventplus/internal/sdevent.hpp> -#include <sdeventplus/internal/sdref.hpp> -#include <type_traits> - -namespace sdeventplus -{ - -class Source -{ - public: - Source(sd_event_source* source, SdEventInterface* intf = &sdevent_impl); - Source(sd_event_source* source, std::false_type, - SdEventInterface* intf = &sdevent_impl); - - private: - SdEventInterface* intf; - SdRef<sd_event_source> source; -}; - -} // namespace sdeventplus diff --git a/src/sdeventplus/source/base.cpp b/src/sdeventplus/source/base.cpp new file mode 100644 index 0000000..fd9b45f --- /dev/null +++ b/src/sdeventplus/source/base.cpp @@ -0,0 +1,26 @@ +#include <sdeventplus/internal/sdevent.hpp> +#include <sdeventplus/source/base.hpp> +#include <type_traits> + +namespace sdeventplus +{ +namespace source +{ + +Base::Base(sd_event_source* source, internal::SdEvent* sdevent) : + sdevent(sdevent), source(source, &internal::SdEvent::sd_event_source_ref, + &internal::SdEvent::sd_event_source_unref, sdevent) +{ +} + +Base::Base(sd_event_source* source, std::false_type, + internal::SdEvent* sdevent) : + sdevent(sdevent), + source(source, &internal::SdEvent::sd_event_source_ref, + &internal::SdEvent::sd_event_source_unref, std::false_type(), + sdevent) +{ +} + +} // namespace source +} // namespace sdeventplus diff --git a/src/sdeventplus/source/base.hpp b/src/sdeventplus/source/base.hpp new file mode 100644 index 0000000..88a17f0 --- /dev/null +++ b/src/sdeventplus/source/base.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include <sdeventplus/internal/sdevent.hpp> +#include <sdeventplus/internal/sdref.hpp> +#include <systemd/sd-bus.h> +#include <type_traits> + +namespace sdeventplus +{ +namespace source +{ + +class Base +{ + public: + // We don't want to allow any kind of slicing. + Base(const Base& source) = delete; + Base& operator=(const Base& source) = delete; + Base(Base&& source) = delete; + Base& operator=(Base&& source) = delete; + + protected: + internal::SdEvent* sdevent; + internal::SdRef<sd_event_source> source; + + // Base sources cannot be directly constructed. + Base(sd_event_source* source, + internal::SdEvent* sdevent = &internal::sdevent_impl); + Base(sd_event_source* source, std::false_type, + internal::SdEvent* sdevent = &internal::sdevent_impl); +}; + +} // namespace source +} // namespace sdeventplus diff --git a/src/sdeventplus/test/sdevent.hpp b/src/sdeventplus/test/sdevent.hpp index e85b13e..982e4e7 100644 --- a/src/sdeventplus/test/sdevent.hpp +++ b/src/sdeventplus/test/sdevent.hpp @@ -6,23 +6,25 @@ namespace sdeventplus { +namespace test +{ -class SdEventMock : public SdEventInterface +class SdEventMock : public internal::SdEvent { public: - MOCK_CONST_METHOD1(sd_event_default, int(sd_event **)); - MOCK_CONST_METHOD1(sd_event_new, int(sd_event **)); - MOCK_CONST_METHOD1(sd_event_ref, sd_event *(sd_event *)); - MOCK_CONST_METHOD1(sd_event_unref, sd_event *(sd_event *)); + MOCK_CONST_METHOD1(sd_event_default, int(sd_event**)); + MOCK_CONST_METHOD1(sd_event_new, int(sd_event**)); + MOCK_CONST_METHOD1(sd_event_ref, sd_event*(sd_event*)); + MOCK_CONST_METHOD1(sd_event_unref, sd_event*(sd_event*)); - MOCK_CONST_METHOD1(sd_event_loop, int(sd_event *)); - MOCK_CONST_METHOD1(sd_event_get_watchdog, int(sd_event *)); - MOCK_CONST_METHOD2(sd_event_set_watchdog, int(sd_event *, int b)); + MOCK_CONST_METHOD1(sd_event_loop, int(sd_event*)); + MOCK_CONST_METHOD1(sd_event_get_watchdog, int(sd_event*)); + MOCK_CONST_METHOD2(sd_event_set_watchdog, int(sd_event*, int b)); - MOCK_CONST_METHOD1(sd_event_source_ref, - sd_event_source *(sd_event_source *)); + MOCK_CONST_METHOD1(sd_event_source_ref, sd_event_source*(sd_event_source*)); MOCK_CONST_METHOD1(sd_event_source_unref, - sd_event_source *(sd_event_source *)); + sd_event_source*(sd_event_source*)); }; +} // namespace test } // namespace sdeventplus |

