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();
});