| 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. | 
 |  |