mirror of
https://github.com/zeromq/cppzmq.git
synced 2025-03-02 20:30:14 +01:00
Problem: monitor_t incorrectly deletes socket_t move assignment operator
Solution: Implement a move assignment operator for monitor_t
This commit is contained in:
parent
e1fe5e5209
commit
b6a07be512
@ -33,6 +33,51 @@ TEST_CASE("monitor create destroy", "[monitor]")
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(ZMQ_CPP11)
|
#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]")
|
TEST_CASE("monitor init event count", "[monitor]")
|
||||||
{
|
{
|
||||||
common_server_client_setup s{false};
|
common_server_client_setup s{false};
|
||||||
|
26
zmq.hpp
26
zmq.hpp
@ -821,14 +821,9 @@ class monitor_t
|
|||||||
|
|
||||||
virtual ~monitor_t()
|
virtual ~monitor_t()
|
||||||
{
|
{
|
||||||
if (socketPtr)
|
close();
|
||||||
zmq_socket_monitor(socketPtr, ZMQ_NULLPTR, 0);
|
|
||||||
|
|
||||||
if (monitor_socket)
|
|
||||||
zmq_close(monitor_socket);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef ZMQ_HAS_RVALUE_REFS
|
#ifdef ZMQ_HAS_RVALUE_REFS
|
||||||
monitor_t(monitor_t &&rhs) ZMQ_NOTHROW : socketPtr(rhs.socketPtr),
|
monitor_t(monitor_t &&rhs) ZMQ_NOTHROW : socketPtr(rhs.socketPtr),
|
||||||
monitor_socket(rhs.monitor_socket)
|
monitor_socket(rhs.monitor_socket)
|
||||||
@ -837,7 +832,15 @@ class monitor_t
|
|||||||
rhs.monitor_socket = ZMQ_NULLPTR;
|
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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -1113,6 +1116,15 @@ class monitor_t
|
|||||||
|
|
||||||
void *socketPtr;
|
void *socketPtr;
|
||||||
void *monitor_socket;
|
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)
|
#if defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_CPP11) && defined(ZMQ_HAVE_POLLER)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user