Merge pull request #304 from gummif/gfa/monitor-move

Problem: monitor_t incorrectly deletes socket_t move assignment operator
This commit is contained in:
Simon Giesecke 2019-04-04 09:15:55 +02:00 committed by GitHub
commit 5c69a36b95
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 64 additions and 7 deletions

View File

@ -33,6 +33,51 @@ TEST_CASE("monitor create destroy", "[monitor]")
}
#if defined(ZMQ_CPP11)
TEST_CASE("monitor move construct", "[monitor]")
{
zmq::context_t ctx;
zmq::socket_t sock(ctx, ZMQ_DEALER);
SECTION("move ctor empty")
{
zmq::monitor_t monitor1;
zmq::monitor_t monitor2 = std::move(monitor1);
}
SECTION("move ctor init")
{
zmq::monitor_t monitor1;
monitor1.init(sock, "inproc://monitor-client");
zmq::monitor_t monitor2 = std::move(monitor1);
}
}
TEST_CASE("monitor move assign", "[monitor]")
{
zmq::context_t ctx;
zmq::socket_t sock(ctx, ZMQ_DEALER);
SECTION("move assign empty")
{
zmq::monitor_t monitor1;
zmq::monitor_t monitor2;
monitor1 = std::move(monitor2);
}
SECTION("move assign init")
{
zmq::monitor_t monitor1;
monitor1.init(sock, "inproc://monitor-client");
zmq::monitor_t monitor2;
monitor2 = std::move(monitor1);
}
SECTION("move assign init both")
{
zmq::monitor_t monitor1;
monitor1.init(sock, "inproc://monitor-client");
zmq::monitor_t monitor2;
zmq::socket_t sock2(ctx, ZMQ_DEALER);
monitor2.init(sock2, "inproc://monitor-client2");
monitor2 = std::move(monitor1);
}
}
TEST_CASE("monitor init event count", "[monitor]")
{
common_server_client_setup s{false};

26
zmq.hpp
View File

@ -837,14 +837,9 @@ class monitor_t
virtual ~monitor_t()
{
if (socketPtr)
zmq_socket_monitor(socketPtr, ZMQ_NULLPTR, 0);
if (monitor_socket)
zmq_close(monitor_socket);
close();
}
#ifdef ZMQ_HAS_RVALUE_REFS
monitor_t(monitor_t &&rhs) ZMQ_NOTHROW : socketPtr(rhs.socketPtr),
monitor_socket(rhs.monitor_socket)
@ -853,7 +848,15 @@ class monitor_t
rhs.monitor_socket = ZMQ_NULLPTR;
}
socket_t &operator=(socket_t &&rhs) ZMQ_DELETED_FUNCTION;
monitor_t &operator=(monitor_t &&rhs) ZMQ_NOTHROW
{
close();
socketPtr = ZMQ_NULLPTR;
monitor_socket = ZMQ_NULLPTR;
std::swap(socketPtr, rhs.socketPtr);
std::swap(monitor_socket, rhs.monitor_socket);
return *this;
}
#endif
@ -1129,6 +1132,15 @@ class monitor_t
void *socketPtr;
void *monitor_socket;
void close() ZMQ_NOTHROW
{
if (socketPtr)
zmq_socket_monitor(socketPtr, ZMQ_NULLPTR, 0);
if (monitor_socket)
zmq_close(monitor_socket);
}
};
#if defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_CPP11) && defined(ZMQ_HAVE_POLLER)