diff --git a/tests/poller.cpp b/tests/poller.cpp index e32592d..6307143 100644 --- a/tests/poller.cpp +++ b/tests/poller.cpp @@ -178,6 +178,31 @@ TEST_CASE("poller remove registered non empty", "[poller]") const std::string hi_str = "Hi"; +#if CPPZMQ_HAS_OPTIONAL +TEST_CASE("poller wait", "[poller]") +{ + common_server_client_setup s; + CHECK_NOTHROW(s.client.send(zmq::message_t{hi_str}, zmq::send_flags::none)); + zmq::poller_t poller; + int i = 42; + CHECK_NOTHROW(poller.add(s.server, zmq::event_flags::pollin, &i)); + auto event = poller.wait(); + CHECK(event.has_value()); + CHECK(s.server == event.value().socket); + CHECK(&i == event.value().user_data); +} + +TEST_CASE("poller wait timeout", "[poller]") +{ + common_server_client_setup s; + // No message sent so it will timeout + zmq::poller_t poller; + CHECK_NOTHROW(poller.add(s.server, zmq::event_flags::pollin, nullptr)); + auto event = poller.wait(std::chrono::milliseconds{3}); + CHECK(!event.has_value()); +} +#endif + TEST_CASE("poller poll basic", "[poller]") { common_server_client_setup s; diff --git a/zmq.hpp b/zmq.hpp index 2e3fc2f..778dcbb 100644 --- a/zmq.hpp +++ b/zmq.hpp @@ -2762,6 +2762,24 @@ template class poller_t } } +#if CPPZMQ_HAS_OPTIONAL + std::optional + wait(std::chrono::milliseconds timeout = std::chrono::milliseconds{-1}) + { + event_type event; + int rc = zmq_poller_wait(poller_ptr.get(), + reinterpret_cast(&event), + static_cast(timeout.count())); + if (rc == -1) { + if (zmq_errno() == EAGAIN) + return {}; + else + throw error_t(); + } + return event; + } +#endif + template size_t wait_all(Sequence &poller_events, const std::chrono::milliseconds timeout) {