What's New In Libevent 2.0 so far:

1. Meta-issues

1.1. About this document

  This document describes the key differences between Libevent 1.4 and
  Libevent 2.0, from a user's point of view.  It was most recently
  updated based on features in git master as of August 2010.

  NOTE: I am very sure that I missed some thing on this list.  Caveat
  haxxor.

1.2. Better documentation

  There is now a book-in-progress that explains how to use Libevent and its
  growing pile of APIs.  As of this writing, it covers everything except the
  http and rpc code.  Check out the latest draft at
  http://www.wangafu.net/~nickm/libevent-book/ .

2. New and Improved Event APIs

  Many APIs are improved, refactored, or deprecated in Libevent 2.0.

  COMPATIBILITY:

  Nearly all existing code that worked with Libevent 1.4 should still
  work correctly with Libevent 2.0.  However, if you are writing new code,
  or if you want to port old code, we strongly recommend using the new APIs
  and avoiding deprecated APIs as much as possible.

  Binaries linked against Libevent 1.4 will need to be recompiled to link
  against Libevent 2.0.  This is nothing new; we have never been good at
  preserving binary compatibility between releases.  We'll try harder in the
  future, though: see 2.1 below.

2.1. New header layout for improved forward-compatibility

  Libevent 2.0 has a new header layout to make it easier for programmers to
  write good, well-supported libevent code.  The new headers are divided
  into three types.

  There are *regular headers*, like event2/event.h.  These headers contain
  the functions that most programmers will want to use.

  There are *backward compatibility headers*, like event2/event_compat.h.
  These headers contain declarations for deprecated functions from older
  versions of Libevent.  Documentation in these headers should suggest what's
  wrong with the old functions, and what functions you want to start using
  instead of the old ones.  Some of these functions might be removed in a
  future release.  New programs should generally not include these headers.

  Finally, there are *structure headers*, like event2/event_struct.h.
  These headers contain definitions of some structures that Libevent has
  historically exposed.  Exposing them caused problems in the past,
  since programs that were compiled to work with one version of Libevent
  would often stop working with another version that changed the size or
  layout of some object.  We've moving them into separate headers so
  that programmers can know that their code is not depending on any
  unstable aspect of the Libvent ABI.  New programs should generally not
  include these headers unless they really know what they are doing, are
  willing to rebuild their software whenever they want to link it
  against a new version of Libevent, and are willing to risk their code
  breaking if and when data structures change.

  Functionality that once was located in event.h is now more subdivided.
  The core event logic is now in event2/event.h.  The "evbuffer" functions
  for low-level buffer manipulation are in event2/buffer.h.  The
  "bufferevent" functions for higher-level buffered IO are in
  event2/bufferevent.h.

  COMPATIBILITY:

  All of the old headers (event.h, evdns.h, evhttp.h, evrpc.h, and
  evutil.h) will continue to work by including the corresponding new
  headers.  Old code should not be broken by this change.

2.2. New thread-safe, binary-compatible, harder-to-mess-up APIs

  Some aspects of the historical Libevent API have encouraged
  non-threadsafe code, or forced code built against one version of Libevent
  to no longer build with another.  The problems with now-deprecated APIs
  fell into two categories:

     1) Dependence on the "current" event_base.  In an application with
        multiple event_bases, Libevent previously had a notion of the
        "current" event_base.  New events were linked to this base, and
        the caller needed to explicitly reattach them to another base.
        This was horribly error-prone.

        Functions like "event_set" that worked with the "current" event_base
        are now deprecated but still available (see 2.1).  There are new
        functions like "event_assign" that take an explicit event_base
        argument when setting up a structure.  Using these functions will help
        prevent errors in your applications, and to be more threadsafe.

     2) Structure dependence.  Applications needed to allocate 'struct
        event' themselves, since there was no function in Libevent to do it
        for them.  But since the size and contents of struct event can
        change between libevent versions, this created binary-compatibility
        nightmares.  All structures of this kind are now isolated in
        _struct.h header (see 2.1), and there are new allocate-and-
        initialize functions you can use instead of the old initialize-only
        functions.  For example, instead of malloc and event_set, you
        can use event_new().

        (For people who do really want to allocate a struct event on the
        stack, or put one inside another structure, you can still use
        event2/event_compat.h.)

   So in the case where old code would look like this:

      #include <event.h>
      ...
      struct event *ev = malloc(sizeof(struct event));
      /* This call will cause a buffer overrun if you compile with one version
         of Libevent and link dynamically against another. */
      event_set(ev, fd, EV_READ, cb, NULL);
      /* If you forget this call, your code will break in hard-to-diagnose
         ways in the presence of multiple event bases. */
      event_set_base(ev, base);

   New code will look more like this:

     #include <event2/event.h>
     ...
     struct event *ev;
     ev = event_new(base, fd, EV_READ, cb, NULL);

2.3. Overrideable allocation functions

  If you want to override the allocation functions used by libevent
  (for example, to use a specialized allocator, or debug memory
  issues, or so on), you can replace them by calling
  event_set_mem_functions.  It takes replacements for malloc(),
  free(), and realloc().

  If you're going to use this facility, you need to call it _before_
  Libevent does any memory allocation; otherwise, Libevent may allocate some
  memory with malloc(), and free it with the free() function you provide.

  You can disable this feature when you are building Libevent by passing
  the --disable-malloc-replacement argument to configure.

2.4. Configurable event_base creation

  Older versions of Libevent would always got the fastest backend
  available, unless you reconfigured their behavior with the environment
  variables EVENT_NOSELECT, EVENT_NOPOLL, and so forth.  This was annoying
  to programmers who wanted to pick a backend explicitly without messing
  with the environment.

  Also, despite our best efforts, not every backend supports every
  operation we might like.  Some features (like edge-triggered events, or
  working with non-socket file descriptors) only work with some operating
  systems' fast backends.  Previously, programmers who cared about this
  needed to know which backends supported what.  This tended to get quite
  ungainly.

  There is now an API to choose backends, either by name or by feature.
  Here is an example:

      struct event_config_t *config;
      struct event_base *base;

      /* Create a new configuration object. */
      config = event_config_new();
      /* We don't want to use the "select" method. */
      event_config_avoid_method(config, "select");
      /* We want a method that can work with non-socket file descriptors */
      event_config_require_features(config, EV_FEATURE_FDS);

      base = event_base_new_with_config(config);
      if (!base) {
         /* There is no backend method that does what we want. */
         exit(1);
      }
      event_config_free(config);

  Supported features are documented in event2/event.h

2.5. Socket is now an abstract type

  All APIs that formerly accepted int as a socket type now accept
  "evutil_socket_t".  On Unix, this is just an alias for "int" as
  before.  On Windows, however, it's an alias for SOCKET, which can
  be wider than int on 64-bit platforms.

2.6. Timeouts and persistent events work together.

  Previously, it wasn't useful to set a timeout on a persistent event:
  the timeout would trigger once, and never again.  This is not what
  applications tend to want.  Instead, applications tend to want every
  triggering of the event to re-set the timeout.  So now, if you set
  up an event like this:
       struct event *ev;
       struct timeval tv;
       ev = event_new(base, fd, EV_READ|EV_PERSIST, cb, NULL);
       tv.tv_sec = 1;
       tv.tv_usec = 0;
       event_add(ev, &tv);

  The callback 'cb' will be invoked whenever fd is ready to read, OR whenever
  a second has passed since the last invocation of cb.

2.7. Multiple events allowed per fd

  Older versions of Libevent allowed at most one EV_READ event and at most
  one EV_WRITE event per socket, per event base.  This restriction is no
  longer present.

2.8. evthread_* functions for thread-safe structures.

  Libevent structures can now be built with locking support.  This code
  makes it safe to add, remove, and activate events on an event base from a
  different thread.  (Previously, if you wanted to write multithreaded code
  with Libevent, you could only an event_base or its events in one thread at
  a time.)

  If you want threading support and you're using pthreads, you can just
  call evthread_use_pthreads().  (You'll need to link against the
  libevent_pthreads library in addition to libevent_core.  These functions are
  not in libevent_core.)

  If you want threading support and you're using Windows, you can just
  call evthread_use_windows_threads().

  If you are using some locking system besides Windows and pthreads, You
  can enable this on a per-event-base level by writing functions to
  implement mutexes, conditions, and thread IDs, and passing them to
  evthread_set_lock_callbacks and related functions in event2/thread.h.

  Once locking functions are enabled, every new event_base is created with a
  lock.  You can prevent a single event_base from being built with a lock
  disabled by using the EVENT_BASE_FLAG_NOLOCK flag in its
  event_config.  If an event_base is created with a lock, it is safe to call
  event_del, event_add, and event_active on its events from any thread.  The
  event callbacks themselves are still all executed from the thread running
  the event loop.

  To make an evbuffer or a bufferevent object threadsafe, call its
  *_enable_locking() function.

  The HTTP api is not currently threadsafe.

  To build Libevent with threading support disabled, pass
  --disable-thread-support to the configure script.

2.9. Edge-triggered events on some backends.

  With some backends, it's now possible to add the EV_ET flag to an event
  in order to request that the event's semantics be edge-triggered.  Right
  now, epoll and kqueue support this.

  The corresponding event_config feature is EV_FEATURE_ET; see 2.4 for more
  information.

2.10. Better support for huge numbers of timeouts

  The heap-based priority queue timer implementation for Libevent 1.4 is good
  for randomly distributed timeouts, but suboptimal if you have huge numbers
  of timeouts that all expire in the same amount of time after their
  creation.  The new event_base_init_common_timeout() logic lets you signal
  that a given timeout interval will be very common, and should use a linked
  list implementation instead of a priority queue.

2.11. Improved debugging support

  It's been pretty easy to forget to delete all your events before you
  re-initialize them, or otherwise put Libevent in an internally inconsistent
  state.  You can tell libevent to catch these and other common errors with
  the new event_enable_debug_mode() call.  Just invoke it before you do
  any calls to other libevent functions, and it'll catch many common
  event-level errors in your code.

2.12. Functions to access all event fields

  So that you don't have to access the struct event fields directly, Libevent
  now provides accessor functions to retrieve everything from an event that
  you set during event_new() or event_assign().

3. Backend-specific and performance improvements.

3.1. Change-minimization on O(1) backends

  With previous versions of Libevent, if you called event_del() and
  event_add() repeatedly on a single event between trips to the backend's
  dispatch function, the backend might wind up making unnecessary calls or
  passing unnecessary data to the kernel.  The new backend logic batches up
  redundant adds and deletes, and performs no more operations than necessary
  at the kernel level.

  This logic is on for the kqueue backend, and available (but off by
  default) for the epoll backend.  To turn it on for the epoll backend,
  set the EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST flag in the
  event_base_cofig, or set the EVENT_EPOLL_USE_CHANGELIST environment
  variable.  Doing this with epoll may result in weird bugs if you give
  any fds closed by dup() or its variants.

3.2. Improved notification on Linux

  When we need to wake the event loop up from another thread, we use
  an epollfd to do so, instead of a socketpair.  This is supposed to be
  faster.

3.3. Windows: better support for everything

  Bufferevents on Windows can use a new mechanism (off-by-default; see below)
  to send their data via Windows overlapped IO and get their notifications
  via the IOCP API.  This should be much faster than using event-based
  notification.

  Other functions throughout the code have been fixed to work more
  consistently with Windows.  Libevent now builds on Windows using either
  mingw, or using MSVC (with nmake).  Libevent works fine with UNICODE
  defined, or not.

  Data structures are a little smarter: our lookups from socket to pending
  event are now done with O(1) hash tables rather than O(lg n) red-black
  trees.

  Unfortunately, the main Windows backend is still select()-based: from
  testing the IOCP backends on the mailing list, it seems that there isn't
  actually a way to tell for certain whether a socket is writable with IOCP.
  Libevent 2.1 may add a multithreaded WaitForMultipleEvents-based
  backend for better performance with many inactive sockets and better
  integration with Windows events.

4. Improvements to evbuffers

  Libevent has long had an "evbuffer" implementation to wrap access to an
  input or output memory buffer.  In previous versions, the implementation
  was very inefficient and lacked some desirable features.  We've made many
  improvements in Libevent 2.0.

4.1. Chunked-memory internal representation

  Previously, each evbuffer was a huge chunk of memory.  When we ran out of
  space in an evbuffer, we used realloc() to grow the chunk of memory.  When
  data was misaligned, we used memmove to move the data back to the front
  of the buffer.

  Needless to say, this is a terrible interface for networked IO.

  Now, evbuffers are implemented as a linked list of memory chunks, like
  most Unix kernels use for network IO.  (See Linux's skbuf interfaces,
  or *BSD's mbufs).  Data is added at the end of the linked list and
  removed from the front, so that we don't ever need realloc huge chunks
  or memmove the whole buffer contents.

  To avoid excessive calls to read and write, we use the readv/writev
  interfaces (or WSASend/WSARecv on Windows) to do IO on multiple chunks at
  once with a single system call.

  COMPATIBILITY NOTE:
  The evbuffer struct is no longer exposed in a header.  The code here is
  too volatile to expose an official evbuffer structure, and there was never
  any means provided to create an evbuffer except via evbuffer_new which
  heap-allocated the buffer.

  If you need access to the whole buffer as a linear chunk of memory, the
  EVBUFFER_DATA() function still works.  Watch out, though: it needs to copy
  the buffer's contents in a linear chunk before you can use it.

4.2. More flexible readline support

  The old evbuffer_readline() function (which accepted any sequence of
  CR and LF characters as a newline, and which couldn't handle lines
  containing NUL characters), is now deprecated.  The preferred
  function is evbuffer_readln(), which supports a variety of
  line-ending styles, and which can return the number of characters in
  the line returned.

  You can also call evbuffer_search_eol() to find the end of a line
  in an evbuffer without ever extracting the line.

4.3. Support for file-based IO in evbuffers.

  You can now add chunks of a file into a evbuffer, and Libevent will have
  your OS use mapped-memory functionality, sendfile, or splice to transfer
  the data without ever copying it to userspace.  On OSs where this is not
  supported, Libevent just loads the data.

  There are probably some bugs remaining in this code.  On some platforms
  (like Windows), it just reads the relevant parts of the file into RAM.

4.4. Support for zero-copy ("scatter/gather") writes in evbuffers.

  You can add a piece of memory to an evbuffer without copying it.
  Instead, Libevent adds a new element to the evbuffer's linked list of
  chunks with a pointer to the memory you supplied.  You can do this
  either with a reference-counted chunk (via evbuffer_add_reference), or
  by asking Libevent for a pointer to its internal vectors (via
  evbuffer_reserve_space or evbuffer_peek()).

4.5. Multiple callbacks per evbuffer

  Previously, you could only have one callback active on an evbuffer at a
  time.  In practice, this meant that if one part of Libevent was using an
  evbuffer callback to notice when an internal evbuffer was reading or
  writing data, you couldn't have your own callback on that evbuffer.

  Now, you can now use the evbuffer_add_cb() function to add a callback that
  does not interfere with any other callbacks.

  The evbuffer_setcb() function is now deprecated.

4.6. New callback interface

  Previously, evbuffer callbacks were invoked with the old size of the
  buffer and the new size of the buffer.  This interface could not capture
  operations that simultaneously filled _and_ drained a buffer, or handle
  cases where we needed to postpone callbacks until multiple operations were
  complete.

  Callbacks that are set with evbuffer_setcb still use the old API.
  Callbacks added with evbuffer_add_cb() use a new interface that takes a
  pointer to a struct holding the total number of bytes drained read and the
  total number of bytes written.  See event2/buffer.h for full details.

4.7. Misc new evbuffer features

   You can use evbuffer_remove() to move a given number of bytes from one
   buffer to another.

   The evbuffer_search() function lets you search for repeated instances of
   a pattern inside an evbuffer.

   You can use evbuffer_freeze() to temporarily suspend drains from or adds
   to a given evbuffer.  This is useful for code that exposes an evbuffer as
   part of its public API, but wants users to treat it as a pure source or
   sink.

   There's an evbuffer_copyout() that looks at the data at the start of an
   evbuffer without doing a drain.

   You can have an evbuffer defer all of its callbacks, so that rather than
   being invoked immediately when the evbuffer's length changes, they are
   invoked from within the event_loop.  This is useful when you have a
   complex set of callbacks that can change the length of other evbuffers,
   and you want to avoid having them recurse and overflow your stack.

5. Bufferevents improvements

   Libevent has long included a "bufferevents" structure and related
   functions that were useful for generic buffered IO on a TCP connection.
   This is what Libevent uses for its HTTP implementation.  In addition to
   the improvements that they get for free from the underlying evbuffer
   implementation above, there are many new features in Libevent 2.0's
   evbuffers.

5.1. New OO implementations

   The "bufferevent" structure is now an abstract base type with multiple
   implementations.  This should not break existing code, which always
   allocated bufferevents with bufferevent_new().

   Current implementations of the bufferevent interface are described below.

5.2. bufferevent_socket_new() replaces bufferevent_new()

   Since bufferevents that use a socket are not the only kind,
   bufferevent_new() is now deprecated.  Use bufferevent_socket_new()
   instead.

5.3. Filtered bufferevent IO

   You can use bufferevent_filter_new() to create a bufferevent that wraps
   around another bufferevent and transforms data it is sending and
   receiving.  See test/regress_zlib.c for a toy example that uses zlib to
   compress data before sending it over a bufferevent.

5.3. Linked pairs of bufferevents

   You can use bufferevent_pair_new() to produce two linked
   bufferevents.  This is like using socketpair, but doesn't require
   system-calls.

5.4. SSL support for bufferevents with OpenSSL

   There is now a bufferevent type that supports SSL/TLS using the
   OpenSSL library.  The code for this is build in a separate
   library, libevent_openssl, so that your programs don't need to
   link against OpenSSL unless they actually want SSL support.

   There are two ways to construct one of these bufferevents, both
   declared in <event2/bufferevent_ssl.h>.  If you want to wrap an
   SSL layer around an existing bufferevent, you would call the
   bufferevent_openssl_filter_new() function.  If you want to do SSL
   on a socket directly, call bufferevent_openssl_socket_new().

5.5. IOCP support for bufferevents on Windows

   There is now a bufferevents backend that supports IOCP on Windows.
   Supposedly, this will eventually make Windows IO much faster for
   programs using bufferevents.  We'll have to see; the code is not
   currently optimized at all.  To try it out, call the
   event_base_start_iocp() method on an event_base before contructing
   bufferevents.

   This is tricky code; there are probably some bugs hiding here.

5.6. Improved connect support for bufferevents.

   You can now create a bufferevent that is not yet connected to any
   host, and tell it to connect, either by address or by hostname.

   The functions to do this are bufferevent_socket_connect and
   bufferevent_socket_connect_hostname.

5.7. Rate-limiting for bufferevents

   If you need to limit the number of bytes read/written by a single
   bufferevent, or by a group of them, you can do this with a new set of
   bufferevent rate-limiting calls.

6. Other improvements

6.1. DNS improvements

6.1.1. DNS: IPv6 nameservers

   The evdns code now lets you have nameservers whose addresses are IPv6.

6.1.2. DNS: Better security

   Libevent 2.0 tries harder to resist DNS answer-sniping attacks than
   earlier versions of evdns.  See comments in the code for full details.

   Notably, evdns now supports the "0x20 hack" to make it harder to
   impersonate a DNS server.  Additionally, Libevent now uses a strong
   internal RNG to generate DNS transaction IDs, so you don't need to supply
   your own.

6.1.3. DNS: Getaddrinfo support

   There's now an asynchronous getaddrinfo clone, evdns_getaddrinfo(),
   to make the results of the evdns functions more usable.  It doesn't
   support every feature of a typical platform getaddrinfo() yet, but it
   is quite close.

   There is also a blocking evutil_getaddrinfo() declared in
   event2/util.h, to provide a getaddrinfo() implementation for
   platforms that don't have one, and smooth over the differences in
   various platforms implementations of RFC3493.

   Bufferevents provide bufferevent_connect_hostname(), which combines
   the name lookup and connect operations.

6.1.4. DNS: No more evdns globals

   Like an event base, evdns operations are now supposed to use an evdns_base
   argument.  This makes them easier to wrap for other (more OO) languages,
   and easier to control the lifetime of.  The old evdns functions will
   still, of course, continue working.

6.2. Listener support

   You can now more easily automate setting up a bound socket to listen for
   TCP connections.  Just use the evconnlistener_*() functions in the
   event2/listener.h header.

   The listener code supports IOCP on Windows if available.

6.3. Secure RNG support

   Network code very frequently needs a secure, hard-to-predict random number
   generator.  Some operating systems provide a good C implementation of one;
   others do not.  Libevent 2.0 now provides a consistent implementation
   based on the arc4random code originally from OpenBSD.  Libevent (and you)
   can use the evutil_secure_rng_*() functions to access a fairly secure
   random stream of bytes.

6.4. HTTP

   The evhttp uriencoding and uridecoding APIs have updated versions
   that behave more correctly, and can handle strings with internal NULs.

   The evhttp query parsing and URI parsing logic can now detect errors
   more usefully.  Moreover, we include an actual URI parsing function
   (evhttp_uri_parse()) to correctly parse URIs, so as to discourage
   people from rolling their own ad-hoc parsing functions.

   There are now accessor functions for the useful fields of struct http
   and friends; it shouldn't be necessary to access them directly any
   more.

   Libevent now lets you declare support for all specified HTTP methods,
   including OPTIONS, PATCH, and so on.  The default list is unchanged.

   Numerous evhttp bugs also got fixed.

7. Infrastructure improvements

7.1. Better unit test framework

   We now use a unit test framework that Nick wrote called "tinytest".
   The main benefit from Libevent's point of view is that tests which
   might mess with global state can all run each in their own
   subprocess.  This way, when there's a bug that makes one unit test
   crash or mess up global state, it doesn't affect any others.

7.2. Better unit tests

   Despite all the code we've added, our unit tests are much better than
   before.  Right now, iterating over the different backends on various
   platforms, I'm getting between 78% and 81% test coverage, compared
   with less than 45% test coverage in Libevent 1.4.

