From ac2f44da3386e27c34dacbf1a5768ddbd294dc70 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 20 Oct 2021 23:24:59 -0700 Subject: [PATCH] [wpiutil] uv: use move for std::function (#3653) Also use function_ref for Loop::Walk(). --- wpiutil/src/main/native/cpp/EventLoopRunner.cpp | 4 ++-- wpiutil/src/main/native/cpp/uv/GetAddrInfo.cpp | 2 +- wpiutil/src/main/native/cpp/uv/GetNameInfo.cpp | 8 +++++--- wpiutil/src/main/native/cpp/uv/Loop.cpp | 4 ++-- wpiutil/src/main/native/cpp/uv/NetworkStream.cpp | 2 +- wpiutil/src/main/native/cpp/uv/Pipe.cpp | 4 ++-- wpiutil/src/main/native/cpp/uv/Poll.cpp | 4 ++-- wpiutil/src/main/native/cpp/uv/Stream.cpp | 7 ++++--- wpiutil/src/main/native/cpp/uv/Tcp.cpp | 8 ++++---- wpiutil/src/main/native/cpp/uv/Timer.cpp | 4 ++-- wpiutil/src/main/native/cpp/uv/Udp.cpp | 8 +++++--- wpiutil/src/main/native/cpp/uv/Work.cpp | 4 ++-- wpiutil/src/main/native/include/wpi/uv/AsyncFunction.h | 2 +- wpiutil/src/main/native/include/wpi/uv/GetAddrInfo.h | 3 ++- wpiutil/src/main/native/include/wpi/uv/GetNameInfo.h | 7 ++++--- wpiutil/src/main/native/include/wpi/uv/Handle.h | 4 ++-- wpiutil/src/main/native/include/wpi/uv/Loop.h | 3 ++- wpiutil/src/main/native/include/wpi/uv/Stream.h | 3 ++- wpiutil/src/main/native/include/wpi/uv/Tcp.h | 5 +++-- wpiutil/src/main/native/include/wpi/uv/Timer.h | 3 ++- wpiutil/src/main/native/include/wpi/uv/Udp.h | 5 +++-- wpiutil/src/main/native/include/wpi/uv/Work.h | 3 ++- 22 files changed, 55 insertions(+), 42 deletions(-) diff --git a/wpiutil/src/main/native/cpp/EventLoopRunner.cpp b/wpiutil/src/main/native/cpp/EventLoopRunner.cpp index dbf9c6baf1..c86176ef2d 100644 --- a/wpiutil/src/main/native/cpp/EventLoopRunner.cpp +++ b/wpiutil/src/main/native/cpp/EventLoopRunner.cpp @@ -65,7 +65,7 @@ void EventLoopRunner::Stop() { void EventLoopRunner::ExecAsync(LoopFunc func) { if (auto thr = m_owner.GetThread()) { if (auto doExec = thr->m_doExec.lock()) { - doExec->Call(func); + doExec->Call(std::move(func)); } } } @@ -74,7 +74,7 @@ void EventLoopRunner::ExecSync(LoopFunc func) { wpi::future f; if (auto thr = m_owner.GetThread()) { if (auto doExec = thr->m_doExec.lock()) { - f = doExec->Call(func); + f = doExec->Call(std::move(func)); } } if (f.valid()) { diff --git a/wpiutil/src/main/native/cpp/uv/GetAddrInfo.cpp b/wpiutil/src/main/native/cpp/uv/GetAddrInfo.cpp index e4f7aa4f53..2e6e38f653 100644 --- a/wpiutil/src/main/native/cpp/uv/GetAddrInfo.cpp +++ b/wpiutil/src/main/native/cpp/uv/GetAddrInfo.cpp @@ -44,7 +44,7 @@ void GetAddrInfo(Loop& loop, std::function callback, std::string_view node, std::string_view service, const addrinfo* hints) { auto req = std::make_shared(); - req->resolved.connect(callback); + req->resolved.connect(std::move(callback)); GetAddrInfo(loop, req, node, service, hints); } diff --git a/wpiutil/src/main/native/cpp/uv/GetNameInfo.cpp b/wpiutil/src/main/native/cpp/uv/GetNameInfo.cpp index 7bc412d6ff..4e662f3f35 100644 --- a/wpiutil/src/main/native/cpp/uv/GetNameInfo.cpp +++ b/wpiutil/src/main/native/cpp/uv/GetNameInfo.cpp @@ -39,7 +39,7 @@ void GetNameInfo(Loop& loop, std::function callback, const sockaddr& addr, int flags) { auto req = std::make_shared(); - req->resolved.connect(callback); + req->resolved.connect(std::move(callback)); GetNameInfo(loop, req, addr, flags); } @@ -62,7 +62,8 @@ void GetNameInfo4(Loop& loop, if (err < 0) { loop.ReportError(err); } else { - GetNameInfo(loop, callback, reinterpret_cast(addr), flags); + GetNameInfo(loop, std::move(callback), + reinterpret_cast(addr), flags); } } @@ -85,7 +86,8 @@ void GetNameInfo6(Loop& loop, if (err < 0) { loop.ReportError(err); } else { - GetNameInfo(loop, callback, reinterpret_cast(addr), flags); + GetNameInfo(loop, std::move(callback), + reinterpret_cast(addr), flags); } } diff --git a/wpiutil/src/main/native/cpp/uv/Loop.cpp b/wpiutil/src/main/native/cpp/uv/Loop.cpp index df0236d4e6..c5b716376c 100644 --- a/wpiutil/src/main/native/cpp/uv/Loop.cpp +++ b/wpiutil/src/main/native/cpp/uv/Loop.cpp @@ -51,12 +51,12 @@ void Loop::Close() { } } -void Loop::Walk(std::function callback) { +void Loop::Walk(function_ref callback) { uv_walk( m_loop, [](uv_handle_t* handle, void* func) { auto& h = *static_cast(handle->data); - auto& f = *static_cast*>(func); + auto& f = *static_cast*>(func); f(h); }, &callback); diff --git a/wpiutil/src/main/native/cpp/uv/NetworkStream.cpp b/wpiutil/src/main/native/cpp/uv/NetworkStream.cpp index 9188cbbbe2..0bc3337348 100644 --- a/wpiutil/src/main/native/cpp/uv/NetworkStream.cpp +++ b/wpiutil/src/main/native/cpp/uv/NetworkStream.cpp @@ -23,7 +23,7 @@ void NetworkStream::Listen(int backlog) { } void NetworkStream::Listen(std::function callback, int backlog) { - connection.connect(callback); + connection.connect(std::move(callback)); Listen(backlog); } diff --git a/wpiutil/src/main/native/cpp/uv/Pipe.cpp b/wpiutil/src/main/native/cpp/uv/Pipe.cpp index ae4f6ef842..b5ca673651 100644 --- a/wpiutil/src/main/native/cpp/uv/Pipe.cpp +++ b/wpiutil/src/main/native/cpp/uv/Pipe.cpp @@ -28,7 +28,7 @@ void Pipe::Reuse(std::function callback, bool ipc) { if (!m_reuseData) { m_reuseData = std::make_unique(); } - m_reuseData->callback = callback; + m_reuseData->callback = std::move(callback); m_reuseData->ipc = ipc; uv_close(GetRawHandle(), [](uv_handle_t* handle) { Pipe& h = *static_cast(handle->data); @@ -85,7 +85,7 @@ void Pipe::Connect(std::string_view name, void Pipe::Connect(std::string_view name, std::function callback) { auto req = std::make_shared(); - req->connected.connect(callback); + req->connected.connect(std::move(callback)); Connect(name, req); } diff --git a/wpiutil/src/main/native/cpp/uv/Poll.cpp b/wpiutil/src/main/native/cpp/uv/Poll.cpp index 914a6a42ec..090a40b4b1 100644 --- a/wpiutil/src/main/native/cpp/uv/Poll.cpp +++ b/wpiutil/src/main/native/cpp/uv/Poll.cpp @@ -37,7 +37,7 @@ void Poll::Reuse(int fd, std::function callback) { if (!m_reuseData) { m_reuseData = std::make_unique(); } - m_reuseData->callback = callback; + m_reuseData->callback = std::move(callback); m_reuseData->isSocket = false; m_reuseData->fd = fd; uv_close(GetRawHandle(), [](uv_handle_t* handle) { @@ -62,7 +62,7 @@ void Poll::ReuseSocket(uv_os_sock_t sock, std::function callback) { if (!m_reuseData) { m_reuseData = std::make_unique(); } - m_reuseData->callback = callback; + m_reuseData->callback = std::move(callback); m_reuseData->isSocket = true; m_reuseData->sock = sock; uv_close(GetRawHandle(), [](uv_handle_t* handle) { diff --git a/wpiutil/src/main/native/cpp/uv/Stream.cpp b/wpiutil/src/main/native/cpp/uv/Stream.cpp index eafe6372c8..a37750b102 100644 --- a/wpiutil/src/main/native/cpp/uv/Stream.cpp +++ b/wpiutil/src/main/native/cpp/uv/Stream.cpp @@ -15,7 +15,8 @@ class CallbackWriteReq : public WriteReq { CallbackWriteReq(span bufs, std::function, Error)> callback) : m_bufs{bufs.begin(), bufs.end()} { - finish.connect([=](Error err) { callback(m_bufs, err); }); + finish.connect( + [this, f = std::move(callback)](Error err) { f(m_bufs, err); }); } private: @@ -51,7 +52,7 @@ void Stream::Shutdown(const std::shared_ptr& req) { void Stream::Shutdown(std::function callback) { auto req = std::make_shared(); if (callback) { - req->complete.connect(callback); + req->complete.connect(std::move(callback)); } Shutdown(req); } @@ -93,7 +94,7 @@ void Stream::Write(span bufs, void Stream::Write(span bufs, std::function, Error)> callback) { - Write(bufs, std::make_shared(bufs, callback)); + Write(bufs, std::make_shared(bufs, std::move(callback))); } int Stream::TryWrite(span bufs) { diff --git a/wpiutil/src/main/native/cpp/uv/Tcp.cpp b/wpiutil/src/main/native/cpp/uv/Tcp.cpp index c1b3cbb120..6f92557fb9 100644 --- a/wpiutil/src/main/native/cpp/uv/Tcp.cpp +++ b/wpiutil/src/main/native/cpp/uv/Tcp.cpp @@ -28,7 +28,7 @@ void Tcp::Reuse(std::function callback, unsigned int flags) { if (!m_reuseData) { m_reuseData = std::make_unique(); } - m_reuseData->callback = callback; + m_reuseData->callback = std::move(callback); m_reuseData->flags = flags; uv_close(GetRawHandle(), [](uv_handle_t* handle) { Tcp& h = *static_cast(handle->data); @@ -119,7 +119,7 @@ void Tcp::Connect(const sockaddr& addr, void Tcp::Connect(const sockaddr& addr, std::function callback) { auto req = std::make_shared(); - req->connected.connect(callback); + req->connected.connect(std::move(callback)); Connect(addr, req); } @@ -141,7 +141,7 @@ void Tcp::Connect(std::string_view ip, unsigned int port, if (err < 0) { ReportError(err); } else { - Connect(reinterpret_cast(addr), callback); + Connect(reinterpret_cast(addr), std::move(callback)); } } @@ -163,7 +163,7 @@ void Tcp::Connect6(std::string_view ip, unsigned int port, if (err < 0) { ReportError(err); } else { - Connect(reinterpret_cast(addr), callback); + Connect(reinterpret_cast(addr), std::move(callback)); } } diff --git a/wpiutil/src/main/native/cpp/uv/Timer.cpp b/wpiutil/src/main/native/cpp/uv/Timer.cpp index c6360f2756..33fd8511fe 100644 --- a/wpiutil/src/main/native/cpp/uv/Timer.cpp +++ b/wpiutil/src/main/native/cpp/uv/Timer.cpp @@ -24,8 +24,8 @@ void Timer::SingleShot(Loop& loop, Time timeout, std::function func) { if (!h) { return; } - h->timeout.connect([theTimer = h.get(), func]() { - func(); + h->timeout.connect([theTimer = h.get(), f = std::move(func)]() { + f(); theTimer->Close(); }); h->Start(timeout); diff --git a/wpiutil/src/main/native/cpp/uv/Udp.cpp b/wpiutil/src/main/native/cpp/uv/Udp.cpp index a248d19be6..bea2b57c14 100644 --- a/wpiutil/src/main/native/cpp/uv/Udp.cpp +++ b/wpiutil/src/main/native/cpp/uv/Udp.cpp @@ -20,7 +20,8 @@ class CallbackUdpSendReq : public UdpSendReq { CallbackUdpSendReq(span bufs, std::function, Error)> callback) : m_bufs{bufs.begin(), bufs.end()} { - complete.connect([=](Error err) { callback(m_bufs, err); }); + complete.connect( + [this, f = std::move(callback)](Error err) { f(m_bufs, err); }); } private: @@ -137,7 +138,8 @@ void Udp::Send(const sockaddr& addr, span bufs, void Udp::Send(const sockaddr& addr, span bufs, std::function, Error)> callback) { - Send(addr, bufs, std::make_shared(bufs, callback)); + Send(addr, bufs, + std::make_shared(bufs, std::move(callback))); } void Udp::Send(span bufs, @@ -157,7 +159,7 @@ void Udp::Send(span bufs, void Udp::Send(span bufs, std::function, Error)> callback) { - Send(bufs, std::make_shared(bufs, callback)); + Send(bufs, std::make_shared(bufs, std::move(callback))); } void Udp::StartRecv() { diff --git a/wpiutil/src/main/native/cpp/uv/Work.cpp b/wpiutil/src/main/native/cpp/uv/Work.cpp index b6bcaa015d..0fc254e81d 100644 --- a/wpiutil/src/main/native/cpp/uv/Work.cpp +++ b/wpiutil/src/main/native/cpp/uv/Work.cpp @@ -39,10 +39,10 @@ void QueueWork(Loop& loop, std::function work, std::function afterWork) { auto req = std::make_shared(); if (work) { - req->work.connect(work); + req->work.connect(std::move(work)); } if (afterWork) { - req->afterWork.connect(afterWork); + req->afterWork.connect(std::move(afterWork)); } QueueWork(loop, req); } diff --git a/wpiutil/src/main/native/include/wpi/uv/AsyncFunction.h b/wpiutil/src/main/native/include/wpi/uv/AsyncFunction.h index 485b8b8db3..fa4eb90269 100644 --- a/wpiutil/src/main/native/include/wpi/uv/AsyncFunction.h +++ b/wpiutil/src/main/native/include/wpi/uv/AsyncFunction.h @@ -38,7 +38,7 @@ class AsyncFunction final public: AsyncFunction(const std::shared_ptr& loop, std::function, T...)> func, const private_init&) - : wakeup{func}, m_loop{loop} {} + : wakeup{std::move(func)}, m_loop{loop} {} ~AsyncFunction() noexcept override { if (auto loop = m_loop.lock()) { this->Close(); diff --git a/wpiutil/src/main/native/include/wpi/uv/GetAddrInfo.h b/wpiutil/src/main/native/include/wpi/uv/GetAddrInfo.h index 8f085099a6..18d4f32733 100644 --- a/wpiutil/src/main/native/include/wpi/uv/GetAddrInfo.h +++ b/wpiutil/src/main/native/include/wpi/uv/GetAddrInfo.h @@ -10,6 +10,7 @@ #include #include #include +#include #include "wpi/Signal.h" #include "wpi/uv/Request.h" @@ -110,7 +111,7 @@ inline void GetAddrInfo(const std::shared_ptr& loop, std::function callback, std::string_view node, std::string_view service = {}, const addrinfo* hints = nullptr) { - GetAddrInfo(*loop, callback, node, service, hints); + GetAddrInfo(*loop, std::move(callback), node, service, hints); } } // namespace wpi::uv diff --git a/wpiutil/src/main/native/include/wpi/uv/GetNameInfo.h b/wpiutil/src/main/native/include/wpi/uv/GetNameInfo.h index a014742af4..d35dd95bc6 100644 --- a/wpiutil/src/main/native/include/wpi/uv/GetNameInfo.h +++ b/wpiutil/src/main/native/include/wpi/uv/GetNameInfo.h @@ -10,6 +10,7 @@ #include #include #include +#include #include "wpi/Signal.h" #include "wpi/uv/Request.h" @@ -90,7 +91,7 @@ void GetNameInfo(Loop& loop, inline void GetNameInfo(const std::shared_ptr& loop, std::function callback, const sockaddr& addr, int flags = 0) { - GetNameInfo(*loop, callback, addr, flags); + GetNameInfo(*loop, std::move(callback), addr, flags); } /** @@ -154,7 +155,7 @@ inline void GetNameInfo4(const std::shared_ptr& loop, std::function callback, std::string_view ip, unsigned int port, int flags = 0) { - return GetNameInfo4(*loop, callback, ip, port, flags); + return GetNameInfo4(*loop, std::move(callback), ip, port, flags); } /** @@ -219,7 +220,7 @@ inline void GetNameInfo6(const std::shared_ptr& loop, std::function callback, std::string_view ip, unsigned int port, int flags = 0) { - return GetNameInfo6(*loop, callback, ip, port, flags); + return GetNameInfo6(*loop, std::move(callback), ip, port, flags); } } // namespace wpi::uv diff --git a/wpiutil/src/main/native/include/wpi/uv/Handle.h b/wpiutil/src/main/native/include/wpi/uv/Handle.h index 8dc02f2d80..b61cd81a87 100644 --- a/wpiutil/src/main/native/include/wpi/uv/Handle.h +++ b/wpiutil/src/main/native/include/wpi/uv/Handle.h @@ -191,8 +191,8 @@ class Handle : public std::enable_shared_from_this { */ void SetBufferAllocator(std::function alloc, std::function dealloc) { - m_allocBuf = alloc; - m_freeBuf = dealloc; + m_allocBuf = std::move(alloc); + m_freeBuf = std::move(dealloc); } /** diff --git a/wpiutil/src/main/native/include/wpi/uv/Loop.h b/wpiutil/src/main/native/include/wpi/uv/Loop.h index 5058c56792..9693053789 100644 --- a/wpiutil/src/main/native/include/wpi/uv/Loop.h +++ b/wpiutil/src/main/native/include/wpi/uv/Loop.h @@ -15,6 +15,7 @@ #include #include "wpi/Signal.h" +#include "wpi/function_ref.h" #include "wpi/uv/Error.h" namespace wpi::uv { @@ -171,7 +172,7 @@ class Loop final : public std::enable_shared_from_this { * * @param callback A function to be invoked once for each active handle. */ - void Walk(std::function callback); + void Walk(function_ref callback); /** * Reinitialize any kernel state necessary in the child process after diff --git a/wpiutil/src/main/native/include/wpi/uv/Stream.h b/wpiutil/src/main/native/include/wpi/uv/Stream.h index 31128f2607..0ade972d6b 100644 --- a/wpiutil/src/main/native/include/wpi/uv/Stream.h +++ b/wpiutil/src/main/native/include/wpi/uv/Stream.h @@ -11,6 +11,7 @@ #include #include #include +#include #include "wpi/Signal.h" #include "wpi/span.h" @@ -180,7 +181,7 @@ class Stream : public Handle { */ void Write(std::initializer_list bufs, std::function, Error)> callback) { - Write({bufs.begin(), bufs.end()}, callback); + Write({bufs.begin(), bufs.end()}, std::move(callback)); } /** diff --git a/wpiutil/src/main/native/include/wpi/uv/Tcp.h b/wpiutil/src/main/native/include/wpi/uv/Tcp.h index e99e47036c..c712f0b48f 100644 --- a/wpiutil/src/main/native/include/wpi/uv/Tcp.h +++ b/wpiutil/src/main/native/include/wpi/uv/Tcp.h @@ -11,6 +11,7 @@ #include #include #include +#include #include "wpi/uv/NetworkStream.h" @@ -258,11 +259,11 @@ class Tcp final : public NetworkStreamImpl { void Connect(const sockaddr& addr, std::function callback); void Connect(const sockaddr_in& addr, std::function callback) { - Connect(reinterpret_cast(addr), callback); + Connect(reinterpret_cast(addr), std::move(callback)); } void Connect(const sockaddr_in6& addr, std::function callback) { - Connect(reinterpret_cast(addr), callback); + Connect(reinterpret_cast(addr), std::move(callback)); } /** diff --git a/wpiutil/src/main/native/include/wpi/uv/Timer.h b/wpiutil/src/main/native/include/wpi/uv/Timer.h index e555a35478..00363a57f9 100644 --- a/wpiutil/src/main/native/include/wpi/uv/Timer.h +++ b/wpiutil/src/main/native/include/wpi/uv/Timer.h @@ -10,6 +10,7 @@ #include #include #include +#include #include "wpi/Signal.h" #include "wpi/uv/Handle.h" @@ -65,7 +66,7 @@ class Timer final : public HandleImpl { */ static void SingleShot(const std::shared_ptr& loop, Time timeout, std::function func) { - return SingleShot(*loop, timeout, func); + return SingleShot(*loop, timeout, std::move(func)); } /** diff --git a/wpiutil/src/main/native/include/wpi/uv/Udp.h b/wpiutil/src/main/native/include/wpi/uv/Udp.h index 083af1af9c..71fab13c86 100644 --- a/wpiutil/src/main/native/include/wpi/uv/Udp.h +++ b/wpiutil/src/main/native/include/wpi/uv/Udp.h @@ -10,6 +10,7 @@ #include #include #include +#include #include "wpi/Signal.h" #include "wpi/span.h" @@ -274,12 +275,12 @@ class Udp final : public HandleImpl { void Send(const sockaddr_in& addr, span bufs, std::function, Error)> callback) { - Send(reinterpret_cast(addr), bufs, callback); + Send(reinterpret_cast(addr), bufs, std::move(callback)); } void Send(const sockaddr_in6& addr, span bufs, std::function, Error)> callback) { - Send(reinterpret_cast(addr), bufs, callback); + Send(reinterpret_cast(addr), bufs, std::move(callback)); } /** diff --git a/wpiutil/src/main/native/include/wpi/uv/Work.h b/wpiutil/src/main/native/include/wpi/uv/Work.h index a80a0fa39a..5a3a5d2ecc 100644 --- a/wpiutil/src/main/native/include/wpi/uv/Work.h +++ b/wpiutil/src/main/native/include/wpi/uv/Work.h @@ -9,6 +9,7 @@ #include #include +#include #include "wpi/Signal.h" #include "wpi/uv/Request.h" @@ -84,7 +85,7 @@ void QueueWork(Loop& loop, std::function work, inline void QueueWork(const std::shared_ptr& loop, std::function work, std::function afterWork) { - QueueWork(*loop, work, afterWork); + QueueWork(*loop, std::move(work), std::move(afterWork)); } } // namespace wpi::uv