Commit Graph

137 Commits

Author SHA1 Message Date
Simon Giesecke
58ffef7190 Problem: no tests for monitor_t::abort
Solution: add a test and fix implementation of monitor_t::abort to make it usable
2018-06-05 17:27:32 +02:00
Joseph Artsimovich
d4374cbebe Add message_t::routing_id() and set_routing_id()
Setting a routing id is necessary when sending a message through a
ZMQ_SERVER socket. See [1] for more details.

[1] http://api.zeromq.org/4-2:zmq-socket#toc5
2018-05-19 08:44:41 +03:00
Pawel Kurdybacha
ff3c221516 Problem: whitespace style too restrictive.
For header only library like cppzmq, whitespace style inherited from
libzmq is too restrictive.

Solution: relaxing whitespace before parens from always to in control
statements only, increased max column width from 80 to 85 and removing
requirement of whitespace after template keyword.
2018-05-12 17:28:28 +01:00
Giesecke
65ae6b33fd Problem: poller_t::wait_all and active_poller_t::wait declare int return type but actually return an element count
Solution: change return type to size_t, remove a redundant if in consequence
2018-05-12 09:18:46 +02:00
Pawel Kurdybacha
5031278f18 Problem: project files do not follow clang-format 2018-05-11 20:29:15 +01:00
Simon Giesecke
882f5e844c Problem: extra abstraction layer type poller_t is in zmq.hpp
Solution: move to zmq_addon.hpp, rename to active_poller_t, and rename base_poller_t to poller_t
2018-05-11 11:33:53 +02:00
Simon Giesecke
bf47be0a0c Problem: poller_t adds an abstraction layer on zmq_poller_*
Solution: extract base_poller_t from poller_t, which provides a direct mapping of zmq_poller_* to C++ only
2018-05-11 11:02:27 +02:00
Simon Giesecke
cdef8bc069
Merge pull request #222 from kurdybacha/poller-init
Problem: poller's constructor is not default generated
2018-05-11 08:12:52 +02:00
Pawel Kurdybacha
33025bf0e6 Problem: client/server socket types not defined.
Solution: Add ZMQ_CLIENT and ZMQ_SERVER to socket_type enum.
Update some of draft guarded unit tests to use them.
2018-05-11 06:41:53 +01:00
Pawel Kurdybacha
c03fb35173 Problem: poller's constructor is not default
Solution: Constructor logic moved to the same place where cleanup is and
marking constructor `default`. Init/cleanup code is in one pleace making
it easier to read/maintain.
2018-05-11 05:56:07 +01:00
Pawel Kurdybacha
559d373da3 Add back size method, add empty for completeness
As disscussed on #219 PR bringing back `size` method and adding `empty`
for completeness.
2018-05-09 05:44:11 +01:00
Pawel Kurdybacha
4dde37e7b2 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.
2018-05-08 21:56:15 +01:00
Pawel Kurdybacha
faf6671d38 Problem: poller can segfault when modified from registered handler. (#219)
* Problem: poller can segfault when modified from registred handler.

It is possible that a user would like to add/remove sockets from
handlers. As handlers and poll items might be removed while not
being processed yet - we have a segfault situation.
Provided unit test `remove_from_handler` demonstrates the problem.

Solution: Modify internal poll item data structure only after processing
of events is finished.

Please not that events processing path performance remains the same when there are
no modification (add/remove) to the poller (no rebuild) - main real use case.

As an effect of changes `size()` method has been removed as it does not
represent any meaningful information anymore. There are active and pending
(waiting for rebuild) poll items so two different sizes. User can
easily track on their side number of registered sockets if original size
information is needed.

`wait` method returns number of processed sockets now. It might be
useful information to a user for no extra cost.
2018-05-03 21:10:05 +01:00
Pawel Kurdybacha
94e0fb0bc3 Problem: deprecated poller's method in draft API
We have a deprecated method `add` in poller that contradicts purpose of a draft
API where it can change without deprecation period.

Solution: remove the method so we do not to maintain it anymore.
2018-04-26 19:50:14 +01:00
Pawel Kurdybacha
85e05b0c88 Problem: poller_t does not support modify
Solution: Added `modify` method based on `zmq_poller_modify` and test cases
covering it.
Reduced code duplication in existing test cases by introducing
`client_server_setup` helper struct.
2018-04-24 21:16:01 +01:00
Pawel Kurdybacha
c55379d6e2 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.
2018-04-20 06:16:04 +01:00
Pawel Kurdybacha
f5b9fcc4ef Problem: throw error_t should follow only zmq call. 2018-04-18 19:23:26 +01:00
Pawel Kurdybacha
810b87c021 Problem: poller_t invalid behaviour on invalid sockets
On adding invalid socket (e.g. after move) there was exception thrown
but leaving modified and unconsistent internal state.
Besides that there was no possibility to remove a socket that was moved
into.

Solutions: check for socket validity (added operator bool) and changed
internal unordered_map "handlers" to operator on zmq internal pointers.

Added two test cases covering the issues.
2018-04-18 07:00:41 +01:00
Pawel Kurdybacha
fdc145a09e Problem: Windows build broken because of multiple issues (#204)
* Problem: Windows build broken because of multiple issues

Windows issues:
* missing includes files
  Solution: added missing <memory> and <unordered_map>
  Here <map> was replaced with <unordered_map> as there is no need for
  sorted map.
* googletest fails because deprecation warning causing errors.
  Solution: D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING option added.
* googletest fails because by default, new Visual Studio projects
  link the C runtimes dynamically but Google Test links them statically.
  Solution: gtest_force_shared_crt=ON option added.

Besides that adding appveyor.yml configuration to add Windows build to
CI in order to prevent accidental Windows build breakage.
For now only Debug configuration as Release requires more time to figure
out.

* Problem: Windows build takes too long

Solution: disabling tests and perf tools

* Problem: Windows unit_tests executable not finding lizmq dll.

Solution: copy libzmq dll to build bin directory.

* Problem: Windows build fails because wrong test path provided
2018-04-17 09:29:47 +01:00
Simon Giesecke
2aac1dffa3 Problem: bad code style in operator==
Solution: simplified code
2018-04-13 11:38:16 -04:00
Simon Giesecke
c92afb675e Problem: message_t::operator== is absurdly inefficient and constructs temporary copies of both operands
Solution: implement operator== using memcmp instead
2018-04-13 11:28:40 -04:00
Simon Giesecke
4367bd6128 Problem: code duplication in equals/operator==
Solution: implemented equals using operator==
2018-04-13 11:21:05 -04:00
Pawel Kurdybacha
6caa5d19d3 Problem: message_t should be easier to construct
* Added overload constructor (c++11 only) taking iteratable object.
  It would be easier to use std::string, std::array etc to construct
  a message now. Making it a draft for now in case it is too greedy
  and needs to be more specialize.
* Added equal and not euqal operator to message_t as a recommended
  and expected way of comparing objects in C++.
* deprecated C style equal method as operator== should be used instead
  (point above).
* Added message_t test covering all available message_t's constructors
2018-04-14 12:13:44 +01:00
Pawel Kurdybacha
8353e8460f Problem: non consistent whitespace formatting
* Converted tabs to to 4 spaces to be consistend with the rest of the
code
* Stripped white spaces from the end of lines
2018-04-13 17:35:41 +01:00
Simon Giesecke
5b1ab44264 Problem: insufficient tests for poller_t, bad usability since caller of add must store function object
Solution: added tests, added size() method, added add deprecated overload with former signature, changed new add signature to accept handler by value
2018-04-13 16:24:46 +02:00
Pawel Kurdybacha
1975818171 Problem: poller's handler not aware of event type. (#200)
* Problem: Poller's handler not aware of event type.

It was possible to register a handler for more than one event types but
impossible to distinguish which event is being handled.
Now events are passed to a handler.

Besides that some other changes:
* new test covering changes in the poller
* modified existing tests to cover changes in the poller
* defined handler_t in poller_t scope for more convinient use
  and simpler code
* helper loopback binder to be re-used in tests

* Problem: CMake build fails on Windows

Issue #199

It seems that with GCC on Linux <array> is implicitly included
by one of stl includes already in zmq.hpp but it breaks on Windows
with Visual Studio.

Adding explicit include for array.

Can not verify right now but this change is a good practice
so creating a pull request.

* Poller: array include not between C++11 guards
2018-04-09 08:22:31 +01:00
Pawel Kurdybacha
18f8035ba8 Problem: poller_t does not have great test coverage
@sigiesec's recent commits with gtests and basics tests for zmq
types (thanks for that!) makes it too convinient to not add some more tests.

* Adding some simple tests for poller_t
* Stripped whitespaces from poller implementation.
2018-04-07 23:00:10 +01:00
Simon Giesecke
7a8cc9d7cf Problem: version detection broken, confuses libzmq and cppzmq versions
Solution: Fix version detection and cmake syntax errors
Fixes #182
2018-03-28 12:58:12 +02:00
sigiesec
608613217e Problem: inconsistent error handling in poller_t
Solution: make poller_t::add and poller_t::remove throw error_t on error, return void
2018-03-26 16:59:47 +02:00
sigiesec
16a76513e3 Problem: poller_t is copyable, but does not implement copying properly
Solution: make poller_t non-copyable, but properly movable
2018-03-26 16:58:13 +02:00
Giuseppe Corbelli
0d1c20e2ea Consistently indented some preprocessor directives.
Added a str() method and companion operator<<(std::ostream) similar to multipart_t.
Added some comments to mark the end of preprocessor instructions / class def / namespace def.
2018-03-07 14:14:09 +01:00
Wilbert van de Ridder
59f7d1ca2f Added wrapper for context options 2018-01-27 19:14:35 +01:00
NAIVEddd
d28e13115d
Reduce the duplication. 2017-11-03 13:12:52 +08:00
Simon Giesecke
e325495a39 Problem: implicit type conversion warning
Solution: Added explicit static_cast
2017-10-25 10:13:07 +02:00
Simon Giesecke
af9a92e6a8 Revert "Revert "Fix compile error for libzmq 4.2.1 and 4.2.2"" 2017-10-10 13:42:50 +02:00
Simon Giesecke
8ec71c146a Revert "Fix compile error for libzmq 4.2.1 and 4.2.2 (#161)"
This reverts commit a1000a0dd6.
2017-10-09 16:10:44 +02:00
Frank van Kesteren
a1000a0dd6 Fix compile error for libzmq 4.2.1 and 4.2.2 (#161)
* Fix compile error for libzmq 4.2.1 and 4.2.2

When defined ZMQ_BUILD_DRAFT_API=1, you receive an error "'on_event_handshake_succeeded' was not declared in this scope"... which is correct for versions 4.2.1 and 4.2.2.
Function was renamed from 'on_event_handshake_succeed', fixed this by updating the function name.
2017-10-09 15:02:00 +01:00
Simon Giesecke
4a08086815 Problem: inconsistent symbol naming for ZMQ_VERSION>=4.2.3
Solution: use new on_event_* methods
2017-10-09 14:16:40 +02:00
Ivan Čukić
e93e9f9715 Removing ambiguous overload of poll
There are two overloads of `poll` - one that has `-1` as the default value for the timeout, and one that does not have the timeout argument (which calls the previous one with -1 for the timeout). This makes it ambiguous for the compiler when `poll` is called without the timeout.

This patch removes the second overload as it is not needed since the first one already covers the same case.
2017-09-24 11:24:29 +02:00
sigiesec
0cb94dc32d Problem: inconsistency DRAFT APIs in libzmq 4.2.x
Solution: distinguish cases for libzmq 4.2.0, 4.2.1/4.2.2 and 4.2.3
2017-09-20 12:15:14 +02:00
Lingpho
af523fad7d Fix #147 issuse (#150)
* add more DRAFT API, fix the #147 issue
2017-08-31 20:30:43 +01:00
Simon Giesecke
a94e648495 Revert "Fix rvalue for socket::send() on EHOSTUNREACH" 2017-08-29 11:15:03 +02:00
Luca Boccassi
d9f0f016c0 Problem: copyright years out of date
Solution: update them
List the ZeroMQ community as a shorthand for the full list of authors
as it can be found via git log
2017-07-31 14:30:55 +01:00
juseless
449a0141fb Update zmq.hpp
Line 706 constructor was:   
monitor_t() : socketPtr(NULL), monitor_socket{NULL} {}
but should be:
monitor_t() : socketPtr(NULL), monitor_socket(NULL) {}

Note change of bracket types for monitor_socket parameter.
2017-07-16 20:01:08 -04:00
a4z
d4da63fed6 Problem: monitor_t::monitor function is blocking
This does not allaw to use monitor_t without a thread.
What is often OK but sometimes not.

Solution:
keep existing interface but add a non blocking alternative.
2017-07-14 16:03:04 +02:00
a4z
d88414e435 Problem: uninitialized context pointer in socket_t move constructor
This can cause monitor_t to crash if used with a socket that was
constructed via the move constructor.

Solution: initialise the context pointer variable ctxptr in the move
constructor.
2017-07-03 10:35:19 +02:00
Marc Sune
5363388fc5 Fix rvalue for socket::send() on EHOSTUNREACH
During introduction of EHOSTUNREACH, missing mapping between
EHOSTUNREACH errno and false/0 return code for socket's send()
calls was missing, throwing an exception.

To be consistent with the rest of wrappers (e.g. DONTWAIT), fix it
by handling this errno as a regular EAGAIN, and let the caller use
errno/zmq_errno() to branch on their code.
2017-06-07 12:09:02 +02:00
bjovke
46fc0572c5 Code formatting, sorry... 2017-04-09 22:16:35 +02:00
bjovke
d9a0fde681 Allow for empty handler parameter (empty std::function()) in call to zmq::poller_t::add(). 2017-04-09 21:34:16 +02:00
John Gornowich
2def369043 update directive for ZMQ_MAKE_VERSION check against zmq_msg_gets method 2017-02-20 08:04:02 -05:00