== 0.5.1 / 20100830 * Works with 0mq 2.0.8 release. * Removed the socket finalizer. The current 0mq framework cannot handle the case where zmq_close is called on a socket that was created from another thread. Therefore, the garbage collection thread causes the framework to break. Version 2.1 (or later) should fix this 0mq limitation. * Misc fixes. See commits. == 0.5.0 / 20100606 * Updated the bindings to conform to the 0mq 2.0.7 release. Several parts of the API changed. * Updated all examples to use the new Context api. * Added Socket#getsockopt. * Added a Socket#identity and Socket#identity= method pair to allow for easy get/put on socket identities. Useful for async request/reply using XREQ/XREP sockets. * Added more specs (slowly but surely). * Support multi-part messages (new as of 2.0.7). I am unsure how to best support multi-part messages so the Message (and related) API may change in the future. Added Socket#more_parts?. * Lots of fixes. Many classes use finalizers to deallocate native memory when they go out of scope; be sure to use JRuby 1.5.1 or later to get important finalizer fixes. == 0.4.1 / 20100511 * I was misusing all of the FFI memory allocator classes. I now wrap libc and use malloc/free directly for creating buffers used by libzmq. == 0.4.0 / 20100510 * Changed the Socket#recv method signature to take an optional message object as its first argument. This allows the library user to allocate and pass in their own message object for the purposes of zero-copy. Original behavior was for the library to *always* allocate a new message object to receive a message into. Hopefully this is the last change required. * Modified the Socket constructor to take an optional hash as its final argument. It honors two keys; :receiver_klass and :sender_klass. Passing in a new constant for either (or both) keys will override the class used by Socket for allocating new Message objects. == 0.3.1 / 20100509 * Modified ZMQ::Message so we have both an UnmanagedMessage where memory management is manual via the #close method, and Message where memory management is automated via a finalizer method run during garbage collection. * Updated ZMQ::Message docs to make it clearer how to use a subclass and FFI::Struct to lazily access the message buffer. This gets us as close to zero-copy as possible for performance. * Fixed a memory leak in Message where the FFI::Struct backing the C struct was not being freed. * Tested the FFI code against MRI 1.8.x and 1.9.x. It works! * Patched a potential problem in LibZMQ::MessageDeallocator. It was crashing under MRI because it complained that FFI::Pointer did not have a free method. It now checks for :free before calling it. Need to investigate this further because it never happened under JRuby. * Modified the Socket constructor slightly to allow for using unmanaged or managed messages. * Changed the /examples to print a throughput (msgs/s) number upon completion. == 0.3.0 / 20100507 * ZMQ::Socket#send and ZMQ::Socket#recv semantics changed * The official 0mq ruby bindings utilize strings for #send and #recv. However, to do so requires lots of copying to and from buffers which greatly impacts performance. These methods now return a ZMQ::Message object which can be subclassed to do lazy evaluation of the buffer. * Added ZMQ::Socket#send_string and ZMQ::Socket#recv_string. They automatically convert the messages to strings just like the official 0mq ruby bindings. * Fixed bug in ZMQ::Util#error_string * Split the ZMQ::Message class into two classes. The base class called UnmanagedMessage requires manual memory management. The Message class (used by default by Socket) has a finalizer defined to automatically release memory when the message object gets garbage collected. == 0.2.0 / 20100505 * 1 major enhancement * Birthday!