A memcpy is eliminated when receiving data on a ZMQ_STREAM socket. Instead
of receiving into a static buffer and then copying the data into the
buffer malloced in msg_t::init_size, the raw_decoder allocates the memory
for together with the reference-counter and creates a msg_t object
on top of that memory. This saves the memcpy operation.
For small messages, data is still copied and the receive buffer is reused.
The shared reference count was not shared but copied. msg_t cannot
store the refcnt itsef but has to store a pointer to an externally
allocated (shared) refcnter. The changes to lmsg are reverted to
use content_t again. Howver, this introduces an allocation in v2_decoder
when creating the message which can be avoided. When allocating the reception
buffer, space is allocated for the maximum number of reference counts
(8192 / max_vsm_size = 8192/64 = 128 zmq:atomic_counter objects). This
increases the buffer by 128*sizeof(atomic_counter) = 128*4 = 512 bytes only.
When creating a message, the refcnt member is set to the address of one of the
pre-allocated atomic_counter_t objects. To do so, a new msg_t type zcmsg
is introduced because msg::copy must discriminate between the message types
when releasing memory.
Problem: zmq_setsockpt() returns success when changing the
HWM after a bind or connect() even though the call has no effect.
Solution: Introduce a failing test a reminder we need to patch it.
Solution: as libzmq already provides this across all platforms,
expose an atomic counter API. I've not wrapped atomic pointers,
though someone who needs this may want to do so.
The use of binary for CURVE keys is painful; you cannot easily copy
these in e.g. email, or use them directly in source code. There are
various encoding possibilities. Base16 and Base64 are not optimal.
Ascii85 is not safe for source (it generates quotes and escapes).
So, I've designed a new Base85 encoding, Z85, which is safe to use
in code and elsewhere, and I've modified libzmq to use this where
it also uses binary keys (in get/setsockopt).
Very simply, if you use a 32-byte value, it's Base256 (binary),
and if you use a 40-byte value, it's Base85 (Z85).
I've put the Z85 codec into z85_codec.hpp, it's not elegant C++
but it is minimal and it works. Feel free to rewrap as a real class
if this annoys you.
* maint:
Makefile.am: Add missing files to distribution, improve maintainer-clean
configure.in: Extract API version from zmq.h
Added bin directory to ignore list.
Conflicts:
configure.in
include/zmq.h
Add missing files needed for regenerating configure to the distribution;
add MAINTAINERS; improve maintainer-clean to produce a really clean tree.
Signed-off-by: Martin Lucina <mato@kotelna.sk>
* Added a version.sh and relevant changes to configure.in to extract the API
version from zmq.h at the time autogen.sh is run.
* Moved the version macros to be next to zmq_version in zmq.h and improved
the comments.
* Modified ZMQ_MAKE_VERSION to use (x) instead of plain x when expanding
macro parameters.
Signed-off-by: Martin Lucina <mato@kotelna.sk>
Change 'make dist' to generate the Git ChangeLog file, that way it doesn't
have to be manually updated nor kept in Git which causes unnecessary work.
Also change 'make dist' to invoke 'dist-zip' automatically to generate a
ZIP as well as a .tar.gz.
Thanks to http://live.gnome.org/Git/ChangeLog for the inspiration to
automatically generate ChangeLog.