|  | What's New In Libevent 1.4: | 
|  |  | 
|  | 0. About this document | 
|  |  | 
|  | This document describes the key differences between Libevent 1.3 and | 
|  | Libevent 1.4, from a user's point of view.  It was most recently | 
|  | updated based on features from libevent 1.4.2-rc. | 
|  |  | 
|  | 1. Packaging Issues. | 
|  |  | 
|  | 1.1. The great library division. | 
|  |  | 
|  | The libevent source now builds two libraries: libevent_core and | 
|  | libevent_extra.  The libevent_core library includes event loops, | 
|  | timers, buffer code, and various small compatibility functions.  The | 
|  | libevent_extra library includes code for HTTP, DNS, RPC, and so on. | 
|  | Thus, if you're writing software that only uses libevent's event | 
|  | loop, you should link against only the libevent_core library, | 
|  | whereas if you're writing software that uses libevent's protocol | 
|  | support as well, you need to link libevent_extra as well. | 
|  |  | 
|  | For backward compatibility, libevent also builds a library called | 
|  | "libevent" that includes everything. | 
|  |  | 
|  | 1.2. The event-config.h header | 
|  |  | 
|  | Libevent configure script now builds two headers from its configure | 
|  | script: config.h (which it uses internally) and event-config.h | 
|  | (which it installs as a header file).  All of the macros in | 
|  | event-config.h are modified so that they're safe to include in other | 
|  | projects.  This allows libevent's header files (like event.h and | 
|  | evutil.h) information about platform configuration. | 
|  |  | 
|  | What does this mean for you?  As of 1.4.x, it should never be | 
|  | necessary to include extra files or define extra types before you | 
|  | include event.h (or any other libevent header); event.h can now look | 
|  | at the information in event-config.h and figure out what it needs to | 
|  | include. | 
|  |  | 
|  | 1.3. Documentation | 
|  |  | 
|  | Libevent now includes better doxygen documentation.  It's not | 
|  | perfect or complete, though; if you find a mistake, please let us | 
|  | know. | 
|  |  | 
|  | 1.4. Libtool usage | 
|  |  | 
|  | We now use libtool's library versioning support correctly.  If we | 
|  | don't mess this up, it means that binaries linked against old | 
|  | version of libevent should continue working when we make changes to | 
|  | libevent that don't break backward compatibility. | 
|  |  | 
|  | 1.5. Portability | 
|  |  | 
|  | Libevent now builds with MSVC again.  We've only tested it with MSVC | 
|  | 2005, and the project files might not be right.  Please let us know | 
|  | if you run into any issues. | 
|  |  | 
|  | Libevent now builds on platforms where /bin/sh is not bash. | 
|  |  | 
|  | Libevent's regression test no longer requires Python to be | 
|  | installed. | 
|  |  | 
|  | 2. New and Improved APIs: | 
|  |  | 
|  | (This list includes functions that are new, functions whose behavior | 
|  | has changed, and functions that were included in previous releases | 
|  | but which never actually worked before.) | 
|  |  | 
|  | 2.1. Utility functions are defined in evutil.h | 
|  |  | 
|  | Libevent now exposes a small set of functions for cross-platform | 
|  | network programming in evutil.h, on the theory that they've been | 
|  | useful enough to us that other people may likely want to use them | 
|  | too.  These are mainly workarounds for Windows issues for now: they | 
|  | include evutil_socketpair (to fake socketpair on platforms that | 
|  | don't have it) and evutil_make_socket_nonblocking (to make a socket | 
|  | nonblocking in a cross-platform way.  See the header for more | 
|  | information. | 
|  |  | 
|  | 2.2. In the libevent core. | 
|  |  | 
|  | The event_base_free() function now works.  Previously, it would | 
|  | crash with an assertion failure if there were events pending on a | 
|  | base.  Now, it simply deletes all the pending events and frees the | 
|  | base.  Be careful -- this might leak fds and memory associated with | 
|  | the old events.  To avoid leaks, you should still remove all the | 
|  | events and free their resources before you delete the base. | 
|  |  | 
|  | Libevent should now work properly with fork().  Just call | 
|  | event_reinit() on your event base after the fork call, and it should | 
|  | work okay.  Please let us know about any bugs you find. | 
|  |  | 
|  | There's a new event_base_new() function that acts just like | 
|  | event_init(), but does not replace the default base.  If you are | 
|  | using multiple event bases in your code, you should just use | 
|  | event_base_new() instead of event_init(), to avoid accidental bugs. | 
|  |  | 
|  | There's new event_loopbreak() function to make a current event loop | 
|  | stop exiting and return.  Unlike event_loopexit, it stops subsequent | 
|  | pending events from getting executed.  This behavior is useful for | 
|  | scripting languages to implement exceptions from inside callbacks. | 
|  |  | 
|  | There's a new event_base_get_method() function, for use in place of | 
|  | event_get_method() in multi-base applications. | 
|  |  | 
|  | 2.3. New in HTTP. | 
|  |  | 
|  | There's an evhttp_connection_set_local_address() function you can | 
|  | use to set the local address of an HTTP connection. | 
|  |  | 
|  | HTTP/1.1 chunking now correctly ends chunks with '\r\n'. | 
|  |  | 
|  | 2.4. New in DNS | 
|  |  | 
|  | Instead of picking your method for generating DNS transaction IDs at | 
|  | startup, you can use evdns_set_transaction_id() to provide a | 
|  | transaction ID function at runtime. | 
|  |  | 
|  | The "class" field in evdns_server_request is now renamed to | 
|  | dns_question_class, so that it won't break compilation under C++. | 
|  | This uses some preprocessor hacks so that C code using the old name | 
|  | won't break.  Eventually, the old name will be deprecated entirely; | 
|  | please don't use it. | 
|  |  | 
|  | 2.5. New in RPC | 
|  |  | 
|  | There are now hooks on RPC input and output; can be used to | 
|  | implement RPC independent processing such as compression or | 
|  | authentication. | 
|  |  | 
|  | RPC tags can now be up to 32 bits.  This is wire-compatible, but | 
|  | changes some of the types in the APIs.  Please let us know if this | 
|  | is problematic for you. | 
|  |  | 
|  | 3. Big bugfixes | 
|  |  | 
|  | We've done a lot, with help from users on different platforms, to | 
|  | make the different backends behave more similarly with respect to | 
|  | signals and timeouts.  The kqueue and solaris backends were the big | 
|  | offenders previously, but they should be better now.  Windows should | 
|  | be better too, though it's likely that problems remain there. | 
|  |  | 
|  | The libevent headers (though not the source files!) should now build | 
|  | cleanly on C++. | 
|  |  | 
|  | (For more bugfixes, see the ChangeLog file.  These are only the | 
|  | biggies.) | 
|  |  | 
|  | 4. Big performance improvements | 
|  |  | 
|  | Libevent now uses a min-heap rather than a red-black tree to track | 
|  | timeouts.  This means that finding the next timeout to fire is now | 
|  | O(1) instead of (lg n). | 
|  |  | 
|  | The win32 select-based backend now uses a red-black tree to map | 
|  | SOCKET handles to event structures.  This changes the performance | 
|  | characteristics of the event loop on win32 from O(n^2) to O(n lg n). | 
|  | Not perfect, but better. | 
|  |  | 
|  | 5. Removed code and features | 
|  |  | 
|  | The rtsig backend is now removed.  It hasn't even compiled for a | 
|  | while, and nobody seemed to miss it very much.  All the platforms | 
|  | that have rtsig seem to have a better option instead these days. | 
|  | Please let us know if rtsig was crucial for you. | 
|  |  |