Commit faa9e0f0 authored by Dominik Charousset's avatar Dominik Charousset

Refactor socket_guard

parent 2a22ce5c
...@@ -27,14 +27,27 @@ namespace net { ...@@ -27,14 +27,27 @@ namespace net {
template <class Socket> template <class Socket>
class socket_guard { class socket_guard {
public: public:
socket_guard() : sock_(invalid_socket_id) { socket_guard() noexcept : sock_(invalid_socket_id) {
// nop // nop
} }
explicit socket_guard(Socket sock) : sock_(sock) { explicit socket_guard(Socket sock) noexcept : sock_(sock) {
// nop // nop
} }
socket_guard(socket_guard&& other) noexcept : sock_(other.release()) {
// nop
}
socket_guard(const socket_guard&) = delete;
socket_guard& operator=(socket_guard&& other) noexcept {
reset(other.release());
return *this;
}
socket_guard& operator=(const socket_guard&) = delete;
~socket_guard() { ~socket_guard() {
if (sock_.id != invalid_socket_id) if (sock_.id != invalid_socket_id)
close(sock_); close(sock_);
...@@ -46,21 +59,13 @@ public: ...@@ -46,21 +59,13 @@ public:
sock_ = x; sock_ = x;
} }
Socket release() { Socket release() noexcept {
auto sock = sock_; auto sock = sock_;
sock_.id = invalid_socket_id; sock_.id = invalid_socket_id;
return sock; return sock;
} }
Socket* get() noexcept { Socket socket() const noexcept {
return &sock_;
}
Socket* operator->() noexcept {
return &sock_;
}
Socket& operator*() noexcept {
return sock_; return sock_;
} }
......
...@@ -32,8 +32,6 @@ namespace { ...@@ -32,8 +32,6 @@ namespace {
constexpr socket_id dummy_id = 13; constexpr socket_id dummy_id = 13;
struct dummy_socket { struct dummy_socket {
dummy_socket() = default;
dummy_socket(socket_id id, bool& closed) : id(id), closed(closed) { dummy_socket(socket_id id, bool& closed) : id(id), closed(closed) {
// nop // nop
} }
...@@ -71,7 +69,7 @@ CAF_TEST_FIXTURE_SCOPE(socket_guard_tests, fixture) ...@@ -71,7 +69,7 @@ CAF_TEST_FIXTURE_SCOPE(socket_guard_tests, fixture)
CAF_TEST(cleanup) { CAF_TEST(cleanup) {
{ {
auto guard = make_socket_guard(sock); auto guard = make_socket_guard(sock);
CAF_CHECK_EQUAL(guard->id, dummy_id); CAF_CHECK_EQUAL(guard.socket().id, dummy_id);
} }
CAF_CHECK(sock.closed); CAF_CHECK(sock.closed);
} }
...@@ -79,11 +77,11 @@ CAF_TEST(cleanup) { ...@@ -79,11 +77,11 @@ CAF_TEST(cleanup) {
CAF_TEST(reset) { CAF_TEST(reset) {
{ {
auto guard = make_socket_guard(sock); auto guard = make_socket_guard(sock);
CAF_CHECK_EQUAL(guard->id, dummy_id); CAF_CHECK_EQUAL(guard.socket().id, dummy_id);
guard.release(); guard.release();
CAF_CHECK_EQUAL(guard->id, invalid_socket_id); CAF_CHECK_EQUAL(guard.socket().id, invalid_socket_id);
guard.reset(sock); guard.reset(sock);
CAF_CHECK_EQUAL(guard->id, dummy_id); CAF_CHECK_EQUAL(guard.socket().id, dummy_id);
} }
CAF_CHECK_EQUAL(sock.closed, true); CAF_CHECK_EQUAL(sock.closed, true);
} }
...@@ -91,9 +89,9 @@ CAF_TEST(reset) { ...@@ -91,9 +89,9 @@ CAF_TEST(reset) {
CAF_TEST(release) { CAF_TEST(release) {
{ {
auto guard = make_socket_guard(sock); auto guard = make_socket_guard(sock);
CAF_CHECK_EQUAL(guard->id, dummy_id); CAF_CHECK_EQUAL(guard.socket().id, dummy_id);
guard.release(); guard.release();
CAF_CHECK_EQUAL(guard->id, invalid_socket_id); CAF_CHECK_EQUAL(guard.socket().id, invalid_socket_id);
} }
CAF_CHECK_EQUAL(sock.closed, false); CAF_CHECK_EQUAL(sock.closed, false);
} }
......
...@@ -55,9 +55,9 @@ struct fixture : test_coordinator_fixture<>, host_fixture { ...@@ -55,9 +55,9 @@ struct fixture : test_coordinator_fixture<>, host_fixture {
mpx->set_thread_id(); mpx->set_thread_id();
CAF_CHECK_EQUAL(mpx->num_socket_managers(), 1u); CAF_CHECK_EQUAL(mpx->num_socket_managers(), 1u);
auto sockets = unbox(make_stream_socket_pair()); auto sockets = unbox(make_stream_socket_pair());
send_socket.reset(sockets.first); send_socket_guard.reset(sockets.first);
recv_socket.reset(sockets.second); recv_socket_guard.reset(sockets.second);
if (auto err = nonblocking(*recv_socket, true)) if (auto err = nonblocking(recv_socket_guard.socket(), true))
CAF_FAIL("nonblocking returned an error: " << err); CAF_FAIL("nonblocking returned an error: " << err);
} }
...@@ -67,8 +67,8 @@ struct fixture : test_coordinator_fixture<>, host_fixture { ...@@ -67,8 +67,8 @@ struct fixture : test_coordinator_fixture<>, host_fixture {
multiplexer_ptr mpx; multiplexer_ptr mpx;
buffer_type recv_buf; buffer_type recv_buf;
socket_guard<stream_socket> send_socket; socket_guard<stream_socket> send_socket_guard;
socket_guard<stream_socket> recv_socket; socket_guard<stream_socket> recv_socket_guard;
buffer_ptr shared_buf; buffer_ptr shared_buf;
}; };
...@@ -157,7 +157,7 @@ CAF_TEST_FIXTURE_SCOPE(endpoint_manager_tests, fixture) ...@@ -157,7 +157,7 @@ CAF_TEST_FIXTURE_SCOPE(endpoint_manager_tests, fixture)
CAF_TEST(receive) { CAF_TEST(receive) {
using transport_type = stream_transport<dummy_application>; using transport_type = stream_transport<dummy_application>;
auto mgr = make_endpoint_manager(mpx, sys, auto mgr = make_endpoint_manager(mpx, sys,
transport_type{recv_socket.release(), transport_type{recv_socket_guard.release(),
dummy_application{ dummy_application{
shared_buf}}); shared_buf}});
CAF_CHECK_EQUAL(mgr->init(), none); CAF_CHECK_EQUAL(mgr->init(), none);
...@@ -166,7 +166,8 @@ CAF_TEST(receive) { ...@@ -166,7 +166,8 @@ CAF_TEST(receive) {
auto& transport = mgr_impl->transport(); auto& transport = mgr_impl->transport();
transport.configure_read(receive_policy::exactly(hello_manager.size())); transport.configure_read(receive_policy::exactly(hello_manager.size()));
CAF_CHECK_EQUAL(mpx->num_socket_managers(), 2u); CAF_CHECK_EQUAL(mpx->num_socket_managers(), 2u);
CAF_CHECK_EQUAL(write(*send_socket, as_bytes(make_span(hello_manager))), CAF_CHECK_EQUAL(write(send_socket_guard.socket(),
as_bytes(make_span(hello_manager))),
hello_manager.size()); hello_manager.size());
CAF_MESSAGE("wrote " << hello_manager.size() << " bytes."); CAF_MESSAGE("wrote " << hello_manager.size() << " bytes.");
run(); run();
...@@ -178,7 +179,7 @@ CAF_TEST(receive) { ...@@ -178,7 +179,7 @@ CAF_TEST(receive) {
CAF_TEST(resolve and proxy communication) { CAF_TEST(resolve and proxy communication) {
using transport_type = stream_transport<dummy_application>; using transport_type = stream_transport<dummy_application>;
auto mgr = make_endpoint_manager(mpx, sys, auto mgr = make_endpoint_manager(mpx, sys,
transport_type{send_socket.release(), transport_type{send_socket_guard.release(),
dummy_application{ dummy_application{
shared_buf}}); shared_buf}});
CAF_CHECK_EQUAL(mgr->init(), none); CAF_CHECK_EQUAL(mgr->init(), none);
...@@ -193,7 +194,7 @@ CAF_TEST(resolve and proxy communication) { ...@@ -193,7 +194,7 @@ CAF_TEST(resolve and proxy communication) {
after(std::chrono::seconds(0)) >> after(std::chrono::seconds(0)) >>
[&] { CAF_FAIL("manager did not respond with a proxy."); }); [&] { CAF_FAIL("manager did not respond with a proxy."); });
run(); run();
auto read_res = read(*recv_socket, make_span(recv_buf)); auto read_res = read(recv_socket_guard.socket(), make_span(recv_buf));
if (!holds_alternative<size_t>(read_res)) if (!holds_alternative<size_t>(read_res))
CAF_FAIL("read() returned an error: " << sys.render(get<sec>(read_res))); CAF_FAIL("read() returned an error: " << sys.render(get<sec>(read_res)));
recv_buf.resize(get<size_t>(read_res)); recv_buf.resize(get<size_t>(read_res));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment