From c55379d6e2b7ed574a59d372aa7f99f3425165f3 Mon Sep 17 00:00:00 2001 From: Pawel Kurdybacha Date: Fri, 20 Apr 2018 06:16:04 +0100 Subject: [PATCH] Problem: poller_t's deprecated add might throw std::bad_function_call Issue is reproducible in deprecated add method with empty handler followed by wait that kicks in (covered by provided unit test). I would prefer we remove this method completely as maintaining something that we consider `deprecated` is unnecessary in `draft` API. --- tests/poller.cpp | 15 +++++++++++++++ zmq.hpp | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/poller.cpp b/tests/poller.cpp index b4d7bff..6012620 100644 --- a/tests/poller.cpp +++ b/tests/poller.cpp @@ -252,4 +252,19 @@ TEST(poller, poller_remove_invalid_socket_throws) ASSERT_EQ (1u, poller.size ()); } +TEST(poller, wait_on_added_empty_handler) +{ + zmq::context_t context; + zmq::socket_t vent{context, zmq::socket_type::push}; + auto endpoint = loopback_ip4_binder(vent).endpoint(); + + zmq::socket_t sink{context, zmq::socket_type::pull}; + ASSERT_NO_THROW(sink.connect(endpoint)); + ASSERT_NO_THROW(vent.send("Hi")); + + zmq::poller_t poller; + std::function handler; + ASSERT_NO_THROW(poller.add(sink, ZMQ_POLLIN, handler)); + ASSERT_NO_THROW(poller.wait(std::chrono::milliseconds{-1})); +} #endif diff --git a/zmq.hpp b/zmq.hpp index 7c729bd..ecbca26 100644 --- a/zmq.hpp +++ b/zmq.hpp @@ -1053,7 +1053,8 @@ namespace zmq ZMQ_DEPRECATED("from 4.3.0, use overload accepting handler_t instead") void add (zmq::socket_t &socket, short events, std::function &handler) { - add (socket, events, [&handler](short) { handler(); }); + add (socket, events, handler ? [&handler](short) { handler(); } + : handler_t{}); } void add (zmq::socket_t &socket, short events, handler_t handler)