diff --git a/README.md b/README.md index 9ba8c663..9b5883c7 100644 --- a/README.md +++ b/README.md @@ -329,10 +329,10 @@ No need to keep track of them. ## The event-based approach -`uvw` offers an event-based approach, so resources are small event emitters -to which listeners can be attached.
-Attaching a listener to a resource is the recommended way to be notified about -changes.
+`uvw` offers an event-based approach where resources are small event emitters to +which listeners are attached.
+Attaching listeners to resources is the recommended way to receive notifications +about their operations.
Listeners are callable objects of type `void(event_type &, resource_type &)`, where: @@ -346,24 +346,18 @@ It means that the following function types are all valid: * `void(event_type &, const resource_type &)` * `void(const event_type &, const resource_type &)` -Please note that there is no need to keep around references to the resources: -they will pass themselves as an argument whenever an event is published. +Please note that there is no need to keep around references to the resources, +since they pass themselves as an argument whenever an event is published.
+The `on` member function is the way to go to register long-running listeners: -There exist two methods to attach a listener to a resource: +```cpp +resource.on(listener) +``` -* `resource.once(listener)`: the listener will be automatically - removed after the first event of the given type. -* `resource.on(listener)`: to be used for long-running listeners. - -Both of them return an object of type `resource_type::connection` (as an -example, `tcp_handle::connection`).
-A connection object can be used later as an argument to the `erase` member -function of the resource to remove the listener.
-There exists also the `clear` member function to drop all the listeners at once. -Note that `clear` should only be invoked on non-active handles. The handles -exploit the same event mechanism made available to users to satisfy pending -requests. Invoking `clear` on an active handle, for example with requests still -in progress, risks leading to memory leaks or unexpected behavior. +To know if a listener exists for a given type, the class offers a `has` function +template. Similarly, the `reset` function template is be used to reset and thus +disconnect listeners, if any. A non-template version of `reset` also exists to +clear an emitter as a whole. Almost all the resources emit `error_event` in case of errors.
All the other events are specific for the given resource and documented in the @@ -379,7 +373,7 @@ tcp->on([](const uvw::error_event &, uvw::tcp_handle &) { /* s tcp->on([](const uvw::listen_event &, uvw::tcp_handle &srv) { std::shared_ptr client = srv.parent().resource(); - client->once([](const uvw::end_event &, uvw::tcp_handle &client) { client.close(); }); + client->on([](const uvw::end_event &, uvw::tcp_handle &client) { client.close(); }); client->on([](const uvw::data_event &, uvw::tcp_handle &) { /* data received */ }); srv.accept(*client); client->read(); diff --git a/src/uvw/emitter.h b/src/uvw/emitter.h index 9bbf5b96..e3ef826f 100644 --- a/src/uvw/emitter.h +++ b/src/uvw/emitter.h @@ -83,91 +83,32 @@ template class emitter { struct base_handler { virtual ~base_handler() UVW_NOEXCEPT = default; - virtual bool empty() const UVW_NOEXCEPT = 0; - virtual void clear() UVW_NOEXCEPT = 0; + virtual bool has() const UVW_NOEXCEPT = 0; + virtual void reset() UVW_NOEXCEPT = 0; }; template struct event_handler final: base_handler { - using listener = std::function; - using listener_list = std::list>; - using connection = typename listener_list::iterator; - - bool empty() const UVW_NOEXCEPT override { - for(auto &&curr: once_list) { - if(!curr.first) { - return false; - } - } - - for(auto &&curr: on_list) { - if(!curr.first) { - return false; - } - } - return true; + bool has() const UVW_NOEXCEPT override { + return static_cast(listener); } - void clear() UVW_NOEXCEPT override { - if(publishing) { - for(auto &&curr: once_list) { - curr.first = true; - } - - for(auto &&curr: on_list) { - curr.first = true; - } - } else { - once_list.clear(); - on_list.clear(); - } + void reset() UVW_NOEXCEPT override { + listener = nullptr; } - connection once(listener f) { - return once_list.emplace(once_list.cend(), false, std::move(f)); - } - - connection on(listener f) { - return on_list.emplace(on_list.cend(), false, std::move(f)); - } - - void erase(connection conn) UVW_NOEXCEPT { - conn->first = true; - - if(!publishing) { - auto pred = [](auto &&elem) { return elem.first; }; - once_list.remove_if(pred); - on_list.remove_if(pred); - } + void on(std::function func) { + listener = std::move(func); } void publish(E event, T &ref) { - listener_list curr; - once_list.swap(curr); - - publishing = true; - - for(auto first = on_list.rbegin(), last = on_list.rend(); first != last; ++first) { - if(!first->first) { - first->second(event, ref); - } + if(listener) { + listener(event, ref); } - - for(auto first = curr.rbegin(), last = curr.rend(); first != last; ++first) { - if(!first->first) { - first->second(event, ref); - } - } - - publishing = false; - - on_list.remove_if([](auto &&elem) { return elem.first; }); } private: - bool publishing{false}; - listener_list once_list{}; - listener_list on_list{}; + std::function listener; }; template @@ -188,32 +129,6 @@ protected: } public: - template - using listener = typename event_handler::listener; - - /** - * @brief Connection type for a given event type. - * - * Given an event type `E`, `connection` is the type of the connection - * object returned by the event emitter whenever a listener for the given - * type is registered. - */ - template - struct connection: private event_handler::connection { - template - friend class emitter; - - connection() = default; - connection(const connection &) = default; - connection(connection &&) = default; - - connection(typename event_handler::connection conn) - : event_handler::connection{std::move(conn)} {} - - connection &operator=(const connection &) = default; - connection &operator=(connection &&) = default; - }; - virtual ~emitter() UVW_NOEXCEPT { static_assert(std::is_base_of_v, T>); } @@ -221,93 +136,44 @@ public: /** * @brief Registers a long-lived listener with the event emitter. * - * This method can be used to register a listener that is meant to be - * invoked more than once for the given event type.
- * The connection object returned by the method can be freely discarded. It - * can be used later to disconnect the listener, if needed. - * + * This method is used to register a listener with the emitter.
* A listener is usually defined as a callable object assignable to a * `std::function - connection on(listener f) { + void on(std::function f) { return handler().on(std::move(f)); } /** - * @brief Registers a short-lived listener with the event emitter. - * - * This method can be used to register a listener that is meant to be - * invoked only once for the given event type.
- * The connection object returned by the method can be freely discarded. It - * can be used later to disconnect the listener, if needed. - * - * a listener is usually defined as a callable object assignable to a - * `std::function - connection once(listener f) { - return handler().once(std::move(f)); + void reset() UVW_NOEXCEPT { + handler().reset(); } /** - * @brief Disconnects a listener from the event emitter. - * @param conn A valid connection object + * @brief Disconnects all listeners. */ - template - void erase(connection conn) UVW_NOEXCEPT { - handler().erase(std::move(conn)); - } - - /** - * @brief Disconnects all the listeners for the given event type. - */ - template - void clear() UVW_NOEXCEPT { - handler().clear(); - } - - /** - * @brief Disconnects all the listeners. - */ - void clear() UVW_NOEXCEPT { + void reset() UVW_NOEXCEPT { for(auto &&curr: handlers) { - curr.second->clear(); + curr.second->reset(); } } /** - * @brief Checks if there are listeners registered for the specific event. - * @return True if there are no listeners registered for the specific event, + * @brief Checks if there is a listener registered for the specific event. + * @return True if there is a listener registered for the specific event, * false otherwise. */ template - bool empty() const UVW_NOEXCEPT { + bool has() const UVW_NOEXCEPT { const auto id = type(); - return (!handlers.count(id) || static_cast &>(*handlers.at(id)).empty()); - } - - /** - * @brief Checks if there are listeners registered with the event emitter. - * @return True if there are no listeners registered with the event emitter, - * false otherwise. - */ - bool empty() const UVW_NOEXCEPT { - for(auto &&curr: handlers) { - if(!curr.second->empty()) { - return false; - } - } - - return true; + return (handlers.count(id) && static_cast &>(*handlers.at(id)).has()); } private: diff --git a/src/uvw/pipe.cpp b/src/uvw/pipe.cpp index f2aa8fe8..89060c33 100644 --- a/src/uvw/pipe.cpp +++ b/src/uvw/pipe.cpp @@ -32,8 +32,8 @@ UVW_INLINE void pipe_handle::connect(const std::string &name) { }; auto connect = parent().resource(); - connect->once(listener); - connect->once(listener); + connect->on(listener); + connect->on(listener); connect->connect(&uv_pipe_connect, raw(), name.data()); } diff --git a/src/uvw/stream.h b/src/uvw/stream.h index 6e30f127..f7cc157a 100644 --- a/src/uvw/stream.h +++ b/src/uvw/stream.h @@ -175,8 +175,8 @@ public: }; auto shutdown = this->parent().template resource(); - shutdown->template once(listener); - shutdown->template once(listener); + shutdown->template on(listener); + shutdown->template on(listener); shutdown->shutdown(as_uv_stream()); } @@ -265,8 +265,8 @@ public: ptr->publish(event); }; - req->template once(listener); - req->template once(listener); + req->template on(listener); + req->template on(listener); req->write(as_uv_stream()); } @@ -288,8 +288,8 @@ public: ptr->publish(event); }; - req->template once(listener); - req->template once(listener); + req->template on(listener); + req->template on(listener); req->write(as_uv_stream()); } @@ -319,8 +319,8 @@ public: ptr->publish(event); }; - req->template once(listener); - req->template once(listener); + req->template on(listener); + req->template on(listener); req->write(as_uv_stream(), send.as_uv_stream()); } @@ -350,8 +350,8 @@ public: ptr->publish(event); }; - req->template once(listener); - req->template once(listener); + req->template on(listener); + req->template on(listener); req->write(as_uv_stream(), send.as_uv_stream()); } diff --git a/src/uvw/tcp.cpp b/src/uvw/tcp.cpp index d0dd2cdd..8fd3db2b 100644 --- a/src/uvw/tcp.cpp +++ b/src/uvw/tcp.cpp @@ -77,8 +77,8 @@ UVW_INLINE void tcp_handle::connect(const sockaddr &addr) { }; auto req = parent().resource(); - req->once(listener); - req->once(listener); + req->on(listener); + req->on(listener); req->connect(&uv_tcp_connect, raw(), &addr); } diff --git a/src/uvw/udp.cpp b/src/uvw/udp.cpp index c32cdb11..f3b905f3 100644 --- a/src/uvw/udp.cpp +++ b/src/uvw/udp.cpp @@ -146,8 +146,8 @@ UVW_INLINE void udp_handle::send(const sockaddr &addr, std::unique_ptr d ptr->publish(event); }; - req->once(listener); - req->once(listener); + req->on(listener); + req->on(listener); req->send(raw(), &addr); } @@ -166,8 +166,8 @@ UVW_INLINE void udp_handle::send(const sockaddr &addr, char *data, unsigned int ptr->publish(event); }; - req->once(listener); - req->once(listener); + req->on(listener); + req->on(listener); req->send(raw(), &addr); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 09c5bdd5..afd02749 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -62,7 +62,7 @@ function(ADD_UVW_TEST TEST_NAME TEST_SOURCE) ${TEST_NAME} PRIVATE $<$>:-Wall> - $<$:/EHsc> + $<$:/EHsc -ftime-trace> ) target_compile_definitions(${TEST_NAME} PRIVATE $<$>:UVW_AS_LIB>) diff --git a/test/main.cpp b/test/main.cpp index c80ee0ba..383d3e08 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -8,7 +8,7 @@ void listen(uvw::loop &loop) { std::shared_ptr tcp = loop.resource(); tcp->on([](const uvw::error_event &, uvw::tcp_handle &) { assert(false); }); - tcp->once([](const uvw::listen_event &, uvw::tcp_handle &srv) { + tcp->on([](const uvw::listen_event &, uvw::tcp_handle &srv) { std::cout << "listen" << std::endl; std::shared_ptr client = srv.parent().resource(); @@ -43,7 +43,7 @@ void listen(uvw::loop &loop) { client->read(); }); - tcp->once([](const uvw::close_event &, uvw::tcp_handle &) { + tcp->on([](const uvw::close_event &, uvw::tcp_handle &) { std::cout << "close" << std::endl; }); @@ -55,12 +55,12 @@ void conn(uvw::loop &loop) { auto tcp = loop.resource(); tcp->on([](const uvw::error_event &, uvw::tcp_handle &) { assert(false); }); - tcp->once([](const uvw::write_event &, uvw::tcp_handle &handle) { + tcp->on([](const uvw::write_event &, uvw::tcp_handle &handle) { std::cout << "write" << std::endl; handle.close(); }); - tcp->once([](const uvw::connect_event &, uvw::tcp_handle &handle) { + tcp->on([](const uvw::connect_event &, uvw::tcp_handle &handle) { std::cout << "connect" << std::endl; auto dataTryWrite = std::unique_ptr(new char[1]{'a'}); @@ -71,7 +71,7 @@ void conn(uvw::loop &loop) { handle.write(std::move(dataWrite), 2); }); - tcp->once([](const uvw::close_event &, uvw::tcp_handle &) { + tcp->on([](const uvw::close_event &, uvw::tcp_handle &) { std::cout << "close" << std::endl; }); diff --git a/test/uvw/emitter.cpp b/test/uvw/emitter.cpp index 8227f718..c39c0dde 100644 --- a/test/uvw/emitter.cpp +++ b/test/uvw/emitter.cpp @@ -24,125 +24,40 @@ TEST(ErrorEvent, Functionalities) { ASSERT_TRUE(static_cast(uvw::error_event{ecode})); } -TEST(Emitter, EmptyAndClear) { +TEST(Emitter, Functionalities) { TestEmitter emitter{}; - ASSERT_TRUE(emitter.empty()); - emitter.on([](const auto &, auto &) {}); - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); - ASSERT_TRUE(emitter.empty()); + ASSERT_TRUE(emitter.has()); + ASSERT_FALSE(emitter.has()); - emitter.clear(); + emitter.reset(); - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); - ASSERT_TRUE(emitter.empty()); + ASSERT_TRUE(emitter.has()); + ASSERT_FALSE(emitter.has()); - emitter.clear(); + emitter.reset(); - ASSERT_TRUE(emitter.empty()); - ASSERT_TRUE(emitter.empty()); - ASSERT_TRUE(emitter.empty()); + ASSERT_FALSE(emitter.has()); + ASSERT_FALSE(emitter.has()); + bool sentinel = false; emitter.on([](const auto &, auto &) {}); - emitter.on([](const auto &, auto &) {}); + emitter.on([&](const auto &, auto &) { sentinel = true; }); - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); - - emitter.clear(); - - ASSERT_TRUE(emitter.empty()); - ASSERT_TRUE(emitter.empty()); - ASSERT_TRUE(emitter.empty()); -} - -TEST(Emitter, On) { - TestEmitter emitter{}; - - emitter.on([](const auto &, auto &) {}); - - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); + ASSERT_FALSE(sentinel); + ASSERT_TRUE(emitter.has()); + ASSERT_TRUE(emitter.has()); emitter.emit(); - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); -} - -TEST(Emitter, Once) { - TestEmitter emitter{}; - - emitter.once([](const auto &, auto &) {}); - - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); - - emitter.emit(); - - ASSERT_TRUE(emitter.empty()); - ASSERT_TRUE(emitter.empty()); -} - -TEST(Emitter, OnceAndErase) { - TestEmitter emitter{}; - - auto conn = emitter.once([](const auto &, auto &) {}); - - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); - - emitter.erase(conn); - - ASSERT_TRUE(emitter.empty()); - ASSERT_TRUE(emitter.empty()); -} - -TEST(Emitter, OnAndErase) { - TestEmitter emitter{}; - - auto conn = emitter.on([](const auto &, auto &) {}); - - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); - - emitter.erase(conn); - - ASSERT_TRUE(emitter.empty()); - ASSERT_TRUE(emitter.empty()); -} - -TEST(Emitter, CallbackClear) { - TestEmitter emitter{}; - - emitter.on([](const auto &, auto &ref) { - ref.template on([](const auto &, auto &) {}); - ref.clear(); - }); - - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); - - emitter.emit(); - - ASSERT_TRUE(emitter.empty()); - ASSERT_TRUE(emitter.empty()); - - emitter.on([](const auto &, auto &ref) { - ref.clear(); - ref.template on([](const auto &, auto &) {}); - }); - - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); - - emitter.emit(); - - ASSERT_FALSE(emitter.empty()); - ASSERT_FALSE(emitter.empty()); + ASSERT_TRUE(sentinel); + ASSERT_TRUE(emitter.has()); + ASSERT_TRUE(emitter.has()); + + emitter.reset(); + + ASSERT_FALSE(emitter.has()); + ASSERT_FALSE(emitter.has()); } diff --git a/test/uvw/pipe.cpp b/test/uvw/pipe.cpp index a180587a..25c0f0aa 100644 --- a/test/uvw/pipe.cpp +++ b/test/uvw/pipe.cpp @@ -17,7 +17,7 @@ TEST(Pipe, ReadWrite) { FAIL(); }); - server->once([](const uvw::listen_event &, uvw::pipe_handle &handle) { + server->on([](const uvw::listen_event &, uvw::pipe_handle &handle) { std::shared_ptr socket = handle.parent().resource(); socket->on([](const uvw::error_event &, uvw::pipe_handle &) { FAIL(); }); @@ -28,11 +28,11 @@ TEST(Pipe, ReadWrite) { socket->read(); }); - client->once([](const uvw::write_event &, uvw::pipe_handle &handle) { + client->on([](const uvw::write_event &, uvw::pipe_handle &handle) { handle.close(); }); - client->once([](const uvw::connect_event &, uvw::pipe_handle &handle) { + client->on([](const uvw::connect_event &, uvw::pipe_handle &handle) { ASSERT_TRUE(handle.writable()); ASSERT_TRUE(handle.readable()); @@ -63,7 +63,7 @@ TEST(Pipe, SockPeer) { server->on([](const auto &, auto &) { FAIL(); }); client->on([](const auto &, auto &) { FAIL(); }); - server->once([&peername](const uvw::listen_event &, uvw::pipe_handle &handle) { + server->on([&peername](const uvw::listen_event &, uvw::pipe_handle &handle) { std::shared_ptr socket = handle.parent().resource(); socket->on([](const uvw::error_event &, uvw::pipe_handle &) { FAIL(); }); @@ -76,7 +76,7 @@ TEST(Pipe, SockPeer) { ASSERT_EQ(handle.sock(), peername); }); - client->once([&peername](const uvw::connect_event &, uvw::pipe_handle &handle) { + client->on([&peername](const uvw::connect_event &, uvw::pipe_handle &handle) { ASSERT_EQ(handle.peer(), peername); handle.close(); @@ -105,7 +105,7 @@ TEST(Pipe, Shutdown) { server->on([](const auto &, auto &) { FAIL(); }); client->on([](const auto &, auto &) { FAIL(); }); - server->once([](const uvw::listen_event &, uvw::pipe_handle &handle) { + server->on([](const uvw::listen_event &, uvw::pipe_handle &handle) { std::shared_ptr socket = handle.parent().resource(); socket->on([](const uvw::error_event &, uvw::pipe_handle &) { FAIL(); }); @@ -116,11 +116,11 @@ TEST(Pipe, Shutdown) { socket->read(); }); - client->once([](const uvw::shutdown_event &, uvw::pipe_handle &handle) { + client->on([](const uvw::shutdown_event &, uvw::pipe_handle &handle) { handle.close(); }); - client->once([&data](const uvw::connect_event &, uvw::pipe_handle &handle) { + client->on([&data](const uvw::connect_event &, uvw::pipe_handle &handle) { handle.write(data.get(), 3); handle.shutdown(); }); diff --git a/test/uvw/tcp.cpp b/test/uvw/tcp.cpp index d3b2b07f..8a64896a 100644 --- a/test/uvw/tcp.cpp +++ b/test/uvw/tcp.cpp @@ -24,7 +24,7 @@ TEST(TCP, ReadWrite) { server->on([](const auto &, auto &) { FAIL(); }); client->on([](const auto &, auto &) { FAIL(); }); - server->once([](const uvw::listen_event &, uvw::tcp_handle &handle) { + server->on([](const uvw::listen_event &, uvw::tcp_handle &handle) { std::shared_ptr socket = handle.parent().resource(); socket->on([](const uvw::error_event &, uvw::tcp_handle &) { FAIL(); }); @@ -35,11 +35,11 @@ TEST(TCP, ReadWrite) { socket->read(); }); - client->once([](const uvw::write_event &, uvw::tcp_handle &handle) { + client->on([](const uvw::write_event &, uvw::tcp_handle &handle) { handle.close(); }); - client->once([](const uvw::connect_event &, uvw::tcp_handle &handle) { + client->on([](const uvw::connect_event &, uvw::tcp_handle &handle) { ASSERT_TRUE(handle.writable()); ASSERT_TRUE(handle.readable()); @@ -67,7 +67,7 @@ TEST(TCP, SockPeer) { server->on([](const auto &, auto &) { FAIL(); }); client->on([](const auto &, auto &) { FAIL(); }); - server->once([&address](const uvw::listen_event &, uvw::tcp_handle &handle) { + server->on([&address](const uvw::listen_event &, uvw::tcp_handle &handle) { std::shared_ptr socket = handle.parent().resource(); socket->on([](const uvw::error_event &, uvw::tcp_handle &) { FAIL(); }); @@ -82,7 +82,7 @@ TEST(TCP, SockPeer) { ASSERT_EQ(addr.ip, address); }); - client->once([&address](const uvw::connect_event &, uvw::tcp_handle &handle) { + client->on([&address](const uvw::connect_event &, uvw::tcp_handle &handle) { uvw::socket_address addr = handle.peer(); ASSERT_EQ(addr.ip, address); @@ -108,7 +108,7 @@ TEST(TCP, Shutdown) { server->on([](const auto &, auto &) { FAIL(); }); client->on([](const auto &, auto &) { FAIL(); }); - server->once([](const uvw::listen_event &, uvw::tcp_handle &handle) { + server->on([](const uvw::listen_event &, uvw::tcp_handle &handle) { std::shared_ptr socket = handle.parent().resource(); socket->on([](const uvw::error_event &, uvw::tcp_handle &) { FAIL(); }); @@ -119,11 +119,11 @@ TEST(TCP, Shutdown) { socket->read(); }); - client->once([](const uvw::shutdown_event &, uvw::tcp_handle &handle) { + client->on([](const uvw::shutdown_event &, uvw::tcp_handle &handle) { handle.close(); }); - client->once([](const uvw::connect_event &, uvw::tcp_handle &handle) { + client->on([](const uvw::connect_event &, uvw::tcp_handle &handle) { handle.shutdown(); }); @@ -144,13 +144,13 @@ TEST(TCP, WriteError) { bool checkTryWriteNakedPtrErrorEvent = false; handle->close(); - handle->once([&checkWriteSmartPtrErrorEvent](const auto &, auto &) { checkWriteSmartPtrErrorEvent = true; }); + handle->on([&checkWriteSmartPtrErrorEvent](const auto &, auto &) { checkWriteSmartPtrErrorEvent = true; }); handle->write(std::unique_ptr{}, 0); - handle->once([&checkWriteNakedPtrErrorEvent](const auto &, auto &) { checkWriteNakedPtrErrorEvent = true; }); + handle->on([&checkWriteNakedPtrErrorEvent](const auto &, auto &) { checkWriteNakedPtrErrorEvent = true; }); handle->write(nullptr, 0); - handle->once([&checkTryWriteSmartPtrErrorEvent](const auto &, auto &) { checkTryWriteSmartPtrErrorEvent = true; }); + handle->on([&checkTryWriteSmartPtrErrorEvent](const auto &, auto &) { checkTryWriteSmartPtrErrorEvent = true; }); handle->try_write(std::unique_ptr{}, 0); - handle->once([&checkTryWriteNakedPtrErrorEvent](const auto &, auto &) { checkTryWriteNakedPtrErrorEvent = true; }); + handle->on([&checkTryWriteNakedPtrErrorEvent](const auto &, auto &) { checkTryWriteNakedPtrErrorEvent = true; }); handle->try_write(nullptr, 0); loop->run(); diff --git a/test/uvw/udp.cpp b/test/uvw/udp.cpp index 656add04..6d67781e 100644 --- a/test/uvw/udp.cpp +++ b/test/uvw/udp.cpp @@ -47,7 +47,7 @@ TEST(UDP, ReadTrySend) { server->on([](const auto &, auto &) { FAIL(); }); client->on([](const auto &, auto &) { FAIL(); }); - server->once([&client](const uvw::udp_data_event &, uvw::udp_handle &handle) { + server->on([&client](const uvw::udp_data_event &, uvw::udp_handle &handle) { client->close(); handle.close(); }); @@ -77,11 +77,11 @@ TEST(UDP, ReadSend) { server->on([](const auto &, auto &) { FAIL(); }); client->on([](const auto &, auto &) { FAIL(); }); - server->once([](const uvw::udp_data_event &, uvw::udp_handle &handle) { + server->on([](const uvw::udp_data_event &, uvw::udp_handle &handle) { handle.close(); }); - client->once([](const uvw::send_event &, uvw::udp_handle &handle) { + client->on([](const uvw::send_event &, uvw::udp_handle &handle) { handle.close(); });