From 1e158e80c89cee6badea9ee2bfc1112959bbff54 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Fri, 14 Oct 2016 17:43:11 +0200 Subject: [PATCH] improvements --- src/uvw/stream.hpp | 49 ++++++++++++++++++++++++++++++++++------------ src/uvw/udp.hpp | 44 +++++++++++++++++++++++++++++++---------- 2 files changed, 70 insertions(+), 23 deletions(-) diff --git a/src/uvw/stream.hpp b/src/uvw/stream.hpp index c2674969..fd661f42 100644 --- a/src/uvw/stream.hpp +++ b/src/uvw/stream.hpp @@ -1,6 +1,7 @@ #pragma once +#include #include #include #include @@ -103,20 +104,42 @@ public: class WriteReq final: public Request { - using Request::Request; + using Deleter = void(*)(uv_buf_t *); + + template + static void deleter(uv_buf_t *bufs) { + std::for_each(bufs, bufs+N, [](uv_buf_t &buf){ delete[] buf.base; }); + delete[] bufs; + } + + template + WriteReq(std::shared_ptr loop, const uv_buf_t (&arr)[N]) + : Request{std::move(loop)}, + bufs{new uv_buf_t[N], &deleter}, + nbufs{N} + { + for(std::size_t i = 0; i < N; ++i) { + bufs[i] = arr[i]; + } + } public: - static std::shared_ptr create(std::shared_ptr loop) { - return std::shared_ptr{new WriteReq{std::move(loop)}}; + template + static std::shared_ptr create(Args&&... args) { + return std::shared_ptr{new WriteReq{std::forward(args)...}}; } - void write(uv_stream_t *handle, const uv_buf_t bufs[], unsigned int nbufs) { - invoke(&uv_write, get(), handle, bufs, nbufs, &defaultCallback); + void write(uv_stream_t *handle) { + invoke(&uv_write, get(), handle, bufs.get(), nbufs, &defaultCallback); } - void write(uv_stream_t *handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t *send) { - invoke(&uv_write2, get(), handle, bufs, nbufs, send, &defaultCallback); + void write(uv_stream_t *handle, uv_stream_t *send) { + invoke(&uv_write2, get(), handle, bufs.get(), nbufs, send, &defaultCallback); } + +private: + std::unique_ptr bufs; + std::size_t nbufs; }; @@ -253,16 +276,16 @@ public: * @param len The lenght of the submitted data. */ void write(std::unique_ptr data, ssize_t len) { - uv_buf_t bufs[] = { uv_buf_init(data.get(), len) }; + const uv_buf_t bufs[] = { uv_buf_init(data.release(), len) }; auto listener = [ptr = this->shared_from_this()](const auto &event, details::WriteReq &) { ptr->publish(event); }; - auto write = this->loop().template resource(); + auto write = this->loop().template resource(bufs); write->template once(listener); write->template once(listener); - write->write(this->template get(), bufs, 1); + write->write(this->template get()); } @@ -284,16 +307,16 @@ public: */ template void write(S &send, std::unique_ptr data, ssize_t len) { - uv_buf_t bufs[] = { uv_buf_init(data.get(), len) }; + const uv_buf_t bufs[] = { uv_buf_init(data.release(), len) }; auto listener = [ptr = this->shared_from_this()](const auto &event, details::WriteReq &) { ptr->publish(event); }; - auto write = this->loop().template resource(); + auto write = this->loop().template resource(bufs); write->template once(listener); write->template once(listener); - write->write(this->template get(), bufs, 1, send.template get()); + write->write(this->template get(), send.template get()); } /** diff --git a/src/uvw/udp.hpp b/src/uvw/udp.hpp index 0d05f3d0..30fc60c9 100644 --- a/src/uvw/udp.hpp +++ b/src/uvw/udp.hpp @@ -2,7 +2,9 @@ #include +#include #include +#include #include #include #include @@ -55,17 +57,39 @@ enum class UVMembership: std::underlying_type_t { }; -class Send final: public Request { - using Request::Request; +class SendReq final: public Request { + using Deleter = void(*)(uv_buf_t *); + + template + static void deleter(uv_buf_t *bufs) { + std::for_each(bufs, bufs+N, [](uv_buf_t &buf){ delete[] buf.base; }); + delete[] bufs; + } + + template + SendReq(std::shared_ptr loop, const uv_buf_t (&arr)[N]) + : Request{std::move(loop)}, + bufs{new uv_buf_t[N], &deleter}, + nbufs{N} + { + for(std::size_t i = 0; i < N; ++i) { + bufs[i] = arr[i]; + } + } public: - static std::shared_ptr create(std::shared_ptr loop) { - return std::shared_ptr{new Send{std::move(loop)}}; + template + static std::shared_ptr create(Args&&... args) { + return std::shared_ptr{new SendReq{std::forward(args)...}}; } - void send(uv_udp_t *handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr) { - invoke(&uv_udp_send, get(), handle, bufs, nbufs, addr, &defaultCallback); + void send(uv_udp_t *handle, const struct sockaddr* addr) { + invoke(&uv_udp_send, get(), handle, bufs.get(), nbufs, addr, &defaultCallback); } + +private: + std::unique_ptr bufs; + std::size_t nbufs; }; @@ -299,16 +323,16 @@ public: typename details::IpTraits::Type addr; details::IpTraits::addrFunc(ip.data(), port, &addr); - uv_buf_t bufs[] = { uv_buf_init(data.get(), len) }; + const uv_buf_t bufs[] = { uv_buf_init(data.release(), len) }; - auto listener = [ptr = shared_from_this()](const auto &event, details::Send &) { + auto listener = [ptr = shared_from_this()](const auto &event, details::SendReq &) { ptr->publish(event); }; - auto send = loop().resource(); + auto send = loop().resource(bufs); send->once(listener); send->once(listener); - send->send(get(), bufs, 1, reinterpret_cast(&addr)); + send->send(get(), reinterpret_cast(&addr)); } /**