Skip to content

Commit 4dde37e

Browse files
committed
Make poller default movable
Latest modification to the poller made move constructor and move assigment operator not complete. In order to prevent that in the future poller should be default movable. Unique pointer has been used to manager zmq_poller. That makes code simpler and safer now.
1 parent 3281509 commit 4dde37e

File tree

1 file changed

+17
-27
lines changed

1 file changed

+17
-27
lines changed

zmq.hpp

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,36 +1018,19 @@ namespace zmq
10181018
class poller_t
10191019
{
10201020
public:
1021-
poller_t () : poller_ptr (zmq_poller_new ())
1021+
poller_t ()
10221022
{
10231023
if (!poller_ptr)
10241024
throw error_t ();
10251025
}
10261026

1027-
~poller_t ()
1028-
{
1029-
if (poller_ptr)
1030-
{
1031-
int rc = zmq_poller_destroy (&poller_ptr);
1032-
assert(rc == 0);
1033-
}
1034-
}
1027+
~poller_t () = default;
10351028

10361029
poller_t(const poller_t&) = delete;
10371030
poller_t &operator=(const poller_t&) = delete;
1038-
poller_t(poller_t&& src)
1039-
: poller_ptr(src.poller_ptr)
1040-
, poller_events(std::move (src.poller_events))
1041-
{
1042-
src.poller_ptr = NULL;
1043-
}
1044-
poller_t &operator=(poller_t&& src)
1045-
{
1046-
poller_ptr = src.poller_ptr;
1047-
poller_events = std::move (src.poller_events);
1048-
src.poller_ptr = NULL;
1049-
return *this;
1050-
}
1031+
1032+
poller_t(poller_t&& src) = default;
1033+
poller_t &operator=(poller_t&& src) = default;
10511034

10521035
using handler_t = std::function<void(short)>;
10531036

@@ -1056,7 +1039,7 @@ namespace zmq
10561039
auto it = std::end (handlers);
10571040
auto inserted = false;
10581041
std::tie(it, inserted) = handlers.emplace (socket.ptr, std::make_shared<handler_t> (std::move (handler)));
1059-
if (0 == zmq_poller_add (poller_ptr, socket.ptr, inserted && *(it->second) ? it->second.get() : nullptr, events)) {
1042+
if (0 == zmq_poller_add (poller_ptr.get (), socket.ptr, inserted && *(it->second) ? it->second.get() : nullptr, events)) {
10601043
need_rebuild = true;
10611044
return;
10621045
}
@@ -1068,7 +1051,7 @@ namespace zmq
10681051

10691052
void remove (zmq::socket_t &socket)
10701053
{
1071-
if (0 == zmq_poller_remove (poller_ptr, socket.ptr)) {
1054+
if (0 == zmq_poller_remove (poller_ptr.get (), socket.ptr)) {
10721055
handlers.erase (socket.ptr);
10731056
need_rebuild = true;
10741057
return;
@@ -1078,7 +1061,7 @@ namespace zmq
10781061

10791062
void modify (zmq::socket_t &socket, short events)
10801063
{
1081-
if (0 != zmq_poller_modify (poller_ptr, socket.ptr, events))
1064+
if (0 != zmq_poller_modify (poller_ptr.get (), socket.ptr, events))
10821065
throw error_t ();
10831066
}
10841067

@@ -1095,7 +1078,7 @@ namespace zmq
10951078
}
10961079
need_rebuild = false;
10971080
}
1098-
int rc = zmq_poller_wait_all (poller_ptr, poller_events.data (),
1081+
int rc = zmq_poller_wait_all (poller_ptr.get (), poller_events.data (),
10991082
static_cast<int> (poller_events.size ()),
11001083
static_cast<long>(timeout.count ()));
11011084
if (rc > 0) {
@@ -1117,7 +1100,14 @@ namespace zmq
11171100
}
11181101

11191102
private:
1120-
void *poller_ptr {nullptr};
1103+
std::unique_ptr<void, std::function<void(void*)>> poller_ptr
1104+
{
1105+
zmq_poller_new (),
1106+
[](void *ptr) {
1107+
int rc = zmq_poller_destroy (&ptr);
1108+
ZMQ_ASSERT (rc == 0);
1109+
}
1110+
};
11211111
bool need_rebuild {false};
11221112
std::unordered_map<void*, std::shared_ptr<handler_t>> handlers {};
11231113
std::vector<zmq_poller_event_t> poller_events {};

0 commit comments

Comments
 (0)