From ed9f83e64c74e79e038366c1718ea86b83ca714a Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Mon, 4 Jul 2016 18:11:44 +0200 Subject: [PATCH] added Signal handle --- src/uvw.hpp | 1 + src/uvw/event.hpp | 16 ++++++++++++++++ src/uvw/signal.hpp | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 src/uvw/signal.hpp diff --git a/src/uvw.hpp b/src/uvw.hpp index 8458c501..d1b61699 100644 --- a/src/uvw.hpp +++ b/src/uvw.hpp @@ -6,6 +6,7 @@ #include "uvw/loop.hpp" #include "uvw/prepare.hpp" #include "uvw/request.hpp" +#include "uvw/signal.hpp" #include "uvw/stream.hpp" #include "uvw/tcp.hpp" #include "uvw/timer.hpp" diff --git a/src/uvw/event.hpp b/src/uvw/event.hpp index 7f7e26bd..91c288d2 100644 --- a/src/uvw/event.hpp +++ b/src/uvw/event.hpp @@ -34,6 +34,7 @@ struct CheckEvent: Event { }; struct CloseEvent: Event { }; struct ConnectEvent: Event { }; + struct DataEvent: Event { explicit DataEvent(std::unique_ptr ptr, ssize_t l) : dt{std::move(ptr)}, len{l} @@ -47,8 +48,10 @@ private: ssize_t len; }; + struct EndEvent: Event { }; + struct ErrorEvent: Event { explicit ErrorEvent(int code = 0): ec(code) { } @@ -59,10 +62,23 @@ private: int ec; }; + struct IdleEvent: Event { }; struct ListenEvent: Event { }; struct PrepareEvent: Event { }; struct ShutdownEvent: Event { }; + + +struct SignalEvent: Event { + explicit SignalEvent(int sig): signum(sig) { } + + operator int() const noexcept { return signum; } + +private: + int signum; +}; + + struct TimerEvent: Event { }; struct UninitializedEvent: Event { }; struct WriteEvent: Event { }; diff --git a/src/uvw/signal.hpp b/src/uvw/signal.hpp new file mode 100644 index 00000000..a1308e1c --- /dev/null +++ b/src/uvw/signal.hpp @@ -0,0 +1,36 @@ +#pragma once + + +#include +#include +#include +#include "event.hpp" +#include "handle.hpp" +#include "util.hpp" + + +namespace uvw { + + +class Signal final: public Handle { + static void startCallback(uv_signal_t *handle, int signum) { + Signal &signal = *(static_cast(handle->data)); + signal.publish(SignalEvent{signum}); + } + + using Handle::Handle; + +public: + template + static std::shared_ptr create(Args&&... args) { + return std::shared_ptr{new Signal{std::forward(args)...}}; + } + + bool init() { return initialize(&uv_signal_init); } + + void start(int signum) { invoke(uv_signal_start, get(), &startCallback, signum); } + void stop() { invoke(&uv_signal_stop, get()); } +}; + + +}