Home | History | Annotate | Download | only in libevent
      1 What's New In Libevent 2.0 so far:
      2 
      3 1. Meta-issues
      4 
      5 1.1. About this document
      6 
      7   This document describes the key differences between Libevent 1.4 and
      8   Libevent 2.0, from a user's point of view.  It was most recently
      9   updated based on features in git master as of August 2010.
     10 
     11   NOTE: I am very sure that I missed some thing on this list.  Caveat
     12   haxxor.
     13 
     14 1.2. Better documentation
     15 
     16   There is now a book-in-progress that explains how to use Libevent and its
     17   growing pile of APIs.  As of this writing, it covers everything except the
     18   http and rpc code.  Check out the latest draft at
     19   http://www.wangafu.net/~nickm/libevent-book/ .
     20 
     21 2. New and Improved Event APIs
     22 
     23   Many APIs are improved, refactored, or deprecated in Libevent 2.0.
     24 
     25   COMPATIBILITY:
     26 
     27   Nearly all existing code that worked with Libevent 1.4 should still
     28   work correctly with Libevent 2.0.  However, if you are writing new code,
     29   or if you want to port old code, we strongly recommend using the new APIs
     30   and avoiding deprecated APIs as much as possible.
     31 
     32   Binaries linked against Libevent 1.4 will need to be recompiled to link
     33   against Libevent 2.0.  This is nothing new; we have never been good at
     34   preserving binary compatibility between releases.  We'll try harder in the
     35   future, though: see 2.1 below.
     36 
     37 2.1. New header layout for improved forward-compatibility
     38 
     39   Libevent 2.0 has a new header layout to make it easier for programmers to
     40   write good, well-supported libevent code.  The new headers are divided
     41   into three types.
     42 
     43   There are *regular headers*, like event2/event.h.  These headers contain
     44   the functions that most programmers will want to use.
     45 
     46   There are *backward compatibility headers*, like event2/event_compat.h.
     47   These headers contain declarations for deprecated functions from older
     48   versions of Libevent.  Documentation in these headers should suggest what's
     49   wrong with the old functions, and what functions you want to start using
     50   instead of the old ones.  Some of these functions might be removed in a
     51   future release.  New programs should generally not include these headers.
     52 
     53   Finally, there are *structure headers*, like event2/event_struct.h.
     54   These headers contain definitions of some structures that Libevent has
     55   historically exposed.  Exposing them caused problems in the past,
     56   since programs that were compiled to work with one version of Libevent
     57   would often stop working with another version that changed the size or
     58   layout of some object.  We've moving them into separate headers so
     59   that programmers can know that their code is not depending on any
     60   unstable aspect of the Libvent ABI.  New programs should generally not
     61   include these headers unless they really know what they are doing, are
     62   willing to rebuild their software whenever they want to link it
     63   against a new version of Libevent, and are willing to risk their code
     64   breaking if and when data structures change.
     65 
     66   Functionality that once was located in event.h is now more subdivided.
     67   The core event logic is now in event2/event.h.  The "evbuffer" functions
     68   for low-level buffer manipulation are in event2/buffer.h.  The
     69   "bufferevent" functions for higher-level buffered IO are in
     70   event2/bufferevent.h.
     71 
     72   COMPATIBILITY:
     73 
     74   All of the old headers (event.h, evdns.h, evhttp.h, evrpc.h, and
     75   evutil.h) will continue to work by including the corresponding new
     76   headers.  Old code should not be broken by this change.
     77 
     78 2.2. New thread-safe, binary-compatible, harder-to-mess-up APIs
     79 
     80   Some aspects of the historical Libevent API have encouraged
     81   non-threadsafe code, or forced code built against one version of Libevent
     82   to no longer build with another.  The problems with now-deprecated APIs
     83   fell into two categories:
     84 
     85      1) Dependence on the "current" event_base.  In an application with
     86         multiple event_bases, Libevent previously had a notion of the
     87         "current" event_base.  New events were linked to this base, and
     88         the caller needed to explicitly reattach them to another base.
     89         This was horribly error-prone.
     90 
     91         Functions like "event_set" that worked with the "current" event_base
     92         are now deprecated but still available (see 2.1).  There are new
     93         functions like "event_assign" that take an explicit event_base
     94         argument when setting up a structure.  Using these functions will help
     95         prevent errors in your applications, and to be more threadsafe.
     96 
     97      2) Structure dependence.  Applications needed to allocate 'struct
     98         event' themselves, since there was no function in Libevent to do it
     99         for them.  But since the size and contents of struct event can
    100         change between libevent versions, this created binary-compatibility
    101         nightmares.  All structures of this kind are now isolated in
    102         _struct.h header (see 2.1), and there are new allocate-and-
    103         initialize functions you can use instead of the old initialize-only
    104         functions.  For example, instead of malloc and event_set, you
    105         can use event_new().
    106 
    107         (For people who do really want to allocate a struct event on the
    108         stack, or put one inside another structure, you can still use
    109         event2/event_compat.h.)
    110 
    111    So in the case where old code would look like this:
    112 
    113       #include <event.h>
    114       ...
    115       struct event *ev = malloc(sizeof(struct event));
    116       /* This call will cause a buffer overrun if you compile with one version
    117          of Libevent and link dynamically against another. */
    118       event_set(ev, fd, EV_READ, cb, NULL);
    119       /* If you forget this call, your code will break in hard-to-diagnose
    120          ways in the presence of multiple event bases. */
    121       event_set_base(ev, base);
    122 
    123    New code will look more like this:
    124 
    125      #include <event2/event.h>
    126      ...
    127      struct event *ev;
    128      ev = event_new(base, fd, EV_READ, cb, NULL);
    129 
    130 2.3. Overrideable allocation functions
    131 
    132   If you want to override the allocation functions used by libevent
    133   (for example, to use a specialized allocator, or debug memory
    134   issues, or so on), you can replace them by calling
    135   event_set_mem_functions.  It takes replacements for malloc(),
    136   free(), and realloc().
    137 
    138   If you're going to use this facility, you need to call it _before_
    139   Libevent does any memory allocation; otherwise, Libevent may allocate some
    140   memory with malloc(), and free it with the free() function you provide.
    141 
    142   You can disable this feature when you are building Libevent by passing
    143   the --disable-malloc-replacement argument to configure.
    144 
    145 2.4. Configurable event_base creation
    146 
    147   Older versions of Libevent would always got the fastest backend
    148   available, unless you reconfigured their behavior with the environment
    149   variables EVENT_NOSELECT, EVENT_NOPOLL, and so forth.  This was annoying
    150   to programmers who wanted to pick a backend explicitly without messing
    151   with the environment.
    152 
    153   Also, despite our best efforts, not every backend supports every
    154   operation we might like.  Some features (like edge-triggered events, or
    155   working with non-socket file descriptors) only work with some operating
    156   systems' fast backends.  Previously, programmers who cared about this
    157   needed to know which backends supported what.  This tended to get quite
    158   ungainly.
    159 
    160   There is now an API to choose backends, either by name or by feature.
    161   Here is an example:
    162 
    163       struct event_config_t *config;
    164       struct event_base *base;
    165 
    166       /* Create a new configuration object. */
    167       config = event_config_new();
    168       /* We don't want to use the "select" method. */
    169       event_config_avoid_method(config, "select");
    170       /* We want a method that can work with non-socket file descriptors */
    171       event_config_require_features(config, EV_FEATURE_FDS);
    172 
    173       base = event_base_new_with_config(config);
    174       if (!base) {
    175          /* There is no backend method that does what we want. */
    176          exit(1);
    177       }
    178       event_config_free(config);
    179 
    180   Supported features are documented in event2/event.h
    181 
    182 2.5. Socket is now an abstract type
    183 
    184   All APIs that formerly accepted int as a socket type now accept
    185   "evutil_socket_t".  On Unix, this is just an alias for "int" as
    186   before.  On Windows, however, it's an alias for SOCKET, which can
    187   be wider than int on 64-bit platforms.
    188 
    189 2.6. Timeouts and persistent events work together.
    190 
    191   Previously, it wasn't useful to set a timeout on a persistent event:
    192   the timeout would trigger once, and never again.  This is not what
    193   applications tend to want.  Instead, applications tend to want every
    194   triggering of the event to re-set the timeout.  So now, if you set
    195   up an event like this:
    196        struct event *ev;
    197        struct timeval tv;
    198        ev = event_new(base, fd, EV_READ|EV_PERSIST, cb, NULL);
    199        tv.tv_sec = 1;
    200        tv.tv_usec = 0;
    201        event_add(ev, &tv);
    202 
    203   The callback 'cb' will be invoked whenever fd is ready to read, OR whenever
    204   a second has passed since the last invocation of cb.
    205 
    206 2.7. Multiple events allowed per fd
    207 
    208   Older versions of Libevent allowed at most one EV_READ event and at most
    209   one EV_WRITE event per socket, per event base.  This restriction is no
    210   longer present.
    211 
    212 2.8. evthread_* functions for thread-safe structures.
    213 
    214   Libevent structures can now be built with locking support.  This code
    215   makes it safe to add, remove, and activate events on an event base from a
    216   different thread.  (Previously, if you wanted to write multithreaded code
    217   with Libevent, you could only an event_base or its events in one thread at
    218   a time.)
    219 
    220   If you want threading support and you're using pthreads, you can just
    221   call evthread_use_pthreads().  (You'll need to link against the
    222   libevent_pthreads library in addition to libevent_core.  These functions are
    223   not in libevent_core.)
    224 
    225   If you want threading support and you're using Windows, you can just
    226   call evthread_use_windows_threads().
    227 
    228   If you are using some locking system besides Windows and pthreads, You
    229   can enable this on a per-event-base level by writing functions to
    230   implement mutexes, conditions, and thread IDs, and passing them to
    231   evthread_set_lock_callbacks and related functions in event2/thread.h.
    232 
    233   Once locking functions are enabled, every new event_base is created with a
    234   lock.  You can prevent a single event_base from being built with a lock
    235   disabled by using the EVENT_BASE_FLAG_NOLOCK flag in its
    236   event_config.  If an event_base is created with a lock, it is safe to call
    237   event_del, event_add, and event_active on its events from any thread.  The
    238   event callbacks themselves are still all executed from the thread running
    239   the event loop.
    240 
    241   To make an evbuffer or a bufferevent object threadsafe, call its
    242   *_enable_locking() function.
    243 
    244   The HTTP api is not currently threadsafe.
    245 
    246   To build Libevent with threading support disabled, pass
    247   --disable-thread-support to the configure script.
    248 
    249 2.9. Edge-triggered events on some backends.
    250 
    251   With some backends, it's now possible to add the EV_ET flag to an event
    252   in order to request that the event's semantics be edge-triggered.  Right
    253   now, epoll and kqueue support this.
    254 
    255   The corresponding event_config feature is EV_FEATURE_ET; see 2.4 for more
    256   information.
    257 
    258 2.10. Better support for huge numbers of timeouts
    259 
    260   The heap-based priority queue timer implementation for Libevent 1.4 is good
    261   for randomly distributed timeouts, but suboptimal if you have huge numbers
    262   of timeouts that all expire in the same amount of time after their
    263   creation.  The new event_base_init_common_timeout() logic lets you signal
    264   that a given timeout interval will be very common, and should use a linked
    265   list implementation instead of a priority queue.
    266 
    267 2.11. Improved debugging support
    268 
    269   It's been pretty easy to forget to delete all your events before you
    270   re-initialize them, or otherwise put Libevent in an internally inconsistent
    271   state.  You can tell libevent to catch these and other common errors with
    272   the new event_enable_debug_mode() call.  Just invoke it before you do
    273   any calls to other libevent functions, and it'll catch many common
    274   event-level errors in your code.
    275 
    276 2.12. Functions to access all event fields
    277 
    278   So that you don't have to access the struct event fields directly, Libevent
    279   now provides accessor functions to retrieve everything from an event that
    280   you set during event_new() or event_assign().
    281 
    282 3. Backend-specific and performance improvements.
    283 
    284 3.1. Change-minimization on O(1) backends
    285 
    286   With previous versions of Libevent, if you called event_del() and
    287   event_add() repeatedly on a single event between trips to the backend's
    288   dispatch function, the backend might wind up making unnecessary calls or
    289   passing unnecessary data to the kernel.  The new backend logic batches up
    290   redundant adds and deletes, and performs no more operations than necessary
    291   at the kernel level.
    292 
    293   This logic is on for the kqueue backend, and available (but off by
    294   default) for the epoll backend.  To turn it on for the epoll backend,
    295   set the EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST flag in the
    296   event_base_cofig, or set the EVENT_EPOLL_USE_CHANGELIST environment
    297   variable.  Doing this with epoll may result in weird bugs if you give
    298   any fds closed by dup() or its variants.
    299 
    300 3.2. Improved notification on Linux
    301 
    302   When we need to wake the event loop up from another thread, we use
    303   an epollfd to do so, instead of a socketpair.  This is supposed to be
    304   faster.
    305 
    306 3.3. Windows: better support for everything
    307 
    308   Bufferevents on Windows can use a new mechanism (off-by-default; see below)
    309   to send their data via Windows overlapped IO and get their notifications
    310   via the IOCP API.  This should be much faster than using event-based
    311   notification.
    312 
    313   Other functions throughout the code have been fixed to work more
    314   consistently with Windows.  Libevent now builds on Windows using either
    315   mingw, or using MSVC (with nmake).  Libevent works fine with UNICODE
    316   defined, or not.
    317 
    318   Data structures are a little smarter: our lookups from socket to pending
    319   event are now done with O(1) hash tables rather than O(lg n) red-black
    320   trees.
    321 
    322   Unfortunately, the main Windows backend is still select()-based: from
    323   testing the IOCP backends on the mailing list, it seems that there isn't
    324   actually a way to tell for certain whether a socket is writable with IOCP.
    325   Libevent 2.1 may add a multithreaded WaitForMultipleEvents-based
    326   backend for better performance with many inactive sockets and better
    327   integration with Windows events.
    328 
    329 4. Improvements to evbuffers
    330 
    331   Libevent has long had an "evbuffer" implementation to wrap access to an
    332   input or output memory buffer.  In previous versions, the implementation
    333   was very inefficient and lacked some desirable features.  We've made many
    334   improvements in Libevent 2.0.
    335 
    336 4.1. Chunked-memory internal representation
    337 
    338   Previously, each evbuffer was a huge chunk of memory.  When we ran out of
    339   space in an evbuffer, we used realloc() to grow the chunk of memory.  When
    340   data was misaligned, we used memmove to move the data back to the front
    341   of the buffer.
    342 
    343   Needless to say, this is a terrible interface for networked IO.
    344 
    345   Now, evbuffers are implemented as a linked list of memory chunks, like
    346   most Unix kernels use for network IO.  (See Linux's skbuf interfaces,
    347   or *BSD's mbufs).  Data is added at the end of the linked list and
    348   removed from the front, so that we don't ever need realloc huge chunks
    349   or memmove the whole buffer contents.
    350 
    351   To avoid excessive calls to read and write, we use the readv/writev
    352   interfaces (or WSASend/WSARecv on Windows) to do IO on multiple chunks at
    353   once with a single system call.
    354 
    355   COMPATIBILITY NOTE:
    356   The evbuffer struct is no longer exposed in a header.  The code here is
    357   too volatile to expose an official evbuffer structure, and there was never
    358   any means provided to create an evbuffer except via evbuffer_new which
    359   heap-allocated the buffer.
    360 
    361   If you need access to the whole buffer as a linear chunk of memory, the
    362   EVBUFFER_DATA() function still works.  Watch out, though: it needs to copy
    363   the buffer's contents in a linear chunk before you can use it.
    364 
    365 4.2. More flexible readline support
    366 
    367   The old evbuffer_readline() function (which accepted any sequence of
    368   CR and LF characters as a newline, and which couldn't handle lines
    369   containing NUL characters), is now deprecated.  The preferred
    370   function is evbuffer_readln(), which supports a variety of
    371   line-ending styles, and which can return the number of characters in
    372   the line returned.
    373 
    374   You can also call evbuffer_search_eol() to find the end of a line
    375   in an evbuffer without ever extracting the line.
    376 
    377 4.3. Support for file-based IO in evbuffers.
    378 
    379   You can now add chunks of a file into a evbuffer, and Libevent will have
    380   your OS use mapped-memory functionality, sendfile, or splice to transfer
    381   the data without ever copying it to userspace.  On OSs where this is not
    382   supported, Libevent just loads the data.
    383 
    384   There are probably some bugs remaining in this code.  On some platforms
    385   (like Windows), it just reads the relevant parts of the file into RAM.
    386 
    387 4.4. Support for zero-copy ("scatter/gather") writes in evbuffers.
    388 
    389   You can add a piece of memory to an evbuffer without copying it.
    390   Instead, Libevent adds a new element to the evbuffer's linked list of
    391   chunks with a pointer to the memory you supplied.  You can do this
    392   either with a reference-counted chunk (via evbuffer_add_reference), or
    393   by asking Libevent for a pointer to its internal vectors (via
    394   evbuffer_reserve_space or evbuffer_peek()).
    395 
    396 4.5. Multiple callbacks per evbuffer
    397 
    398   Previously, you could only have one callback active on an evbuffer at a
    399   time.  In practice, this meant that if one part of Libevent was using an
    400   evbuffer callback to notice when an internal evbuffer was reading or
    401   writing data, you couldn't have your own callback on that evbuffer.
    402 
    403   Now, you can now use the evbuffer_add_cb() function to add a callback that
    404   does not interfere with any other callbacks.
    405 
    406   The evbuffer_setcb() function is now deprecated.
    407 
    408 4.6. New callback interface
    409 
    410   Previously, evbuffer callbacks were invoked with the old size of the
    411   buffer and the new size of the buffer.  This interface could not capture
    412   operations that simultaneously filled _and_ drained a buffer, or handle
    413   cases where we needed to postpone callbacks until multiple operations were
    414   complete.
    415 
    416   Callbacks that are set with evbuffer_setcb still use the old API.
    417   Callbacks added with evbuffer_add_cb() use a new interface that takes a
    418   pointer to a struct holding the total number of bytes drained read and the
    419   total number of bytes written.  See event2/buffer.h for full details.
    420 
    421 4.7. Misc new evbuffer features
    422 
    423    You can use evbuffer_remove() to move a given number of bytes from one
    424    buffer to another.
    425 
    426    The evbuffer_search() function lets you search for repeated instances of
    427    a pattern inside an evbuffer.
    428 
    429    You can use evbuffer_freeze() to temporarily suspend drains from or adds
    430    to a given evbuffer.  This is useful for code that exposes an evbuffer as
    431    part of its public API, but wants users to treat it as a pure source or
    432    sink.
    433 
    434    There's an evbuffer_copyout() that looks at the data at the start of an
    435    evbuffer without doing a drain.
    436 
    437    You can have an evbuffer defer all of its callbacks, so that rather than
    438    being invoked immediately when the evbuffer's length changes, they are
    439    invoked from within the event_loop.  This is useful when you have a
    440    complex set of callbacks that can change the length of other evbuffers,
    441    and you want to avoid having them recurse and overflow your stack.
    442 
    443 5. Bufferevents improvements
    444 
    445    Libevent has long included a "bufferevents" structure and related
    446    functions that were useful for generic buffered IO on a TCP connection.
    447    This is what Libevent uses for its HTTP implementation.  In addition to
    448    the improvements that they get for free from the underlying evbuffer
    449    implementation above, there are many new features in Libevent 2.0's
    450    evbuffers.
    451 
    452 5.1. New OO implementations
    453 
    454    The "bufferevent" structure is now an abstract base type with multiple
    455    implementations.  This should not break existing code, which always
    456    allocated bufferevents with bufferevent_new().
    457 
    458    Current implementations of the bufferevent interface are described below.
    459 
    460 5.2. bufferevent_socket_new() replaces bufferevent_new()
    461 
    462    Since bufferevents that use a socket are not the only kind,
    463    bufferevent_new() is now deprecated.  Use bufferevent_socket_new()
    464    instead.
    465 
    466 5.3. Filtered bufferevent IO
    467 
    468    You can use bufferevent_filter_new() to create a bufferevent that wraps
    469    around another bufferevent and transforms data it is sending and
    470    receiving.  See test/regress_zlib.c for a toy example that uses zlib to
    471    compress data before sending it over a bufferevent.
    472 
    473 5.3. Linked pairs of bufferevents
    474 
    475    You can use bufferevent_pair_new() to produce two linked
    476    bufferevents.  This is like using socketpair, but doesn't require
    477    system-calls.
    478 
    479 5.4. SSL support for bufferevents with OpenSSL
    480 
    481    There is now a bufferevent type that supports SSL/TLS using the
    482    OpenSSL library.  The code for this is build in a separate
    483    library, libevent_openssl, so that your programs don't need to
    484    link against OpenSSL unless they actually want SSL support.
    485 
    486    There are two ways to construct one of these bufferevents, both
    487    declared in <event2/bufferevent_ssl.h>.  If you want to wrap an
    488    SSL layer around an existing bufferevent, you would call the
    489    bufferevent_openssl_filter_new() function.  If you want to do SSL
    490    on a socket directly, call bufferevent_openssl_socket_new().
    491 
    492 5.5. IOCP support for bufferevents on Windows
    493 
    494    There is now a bufferevents backend that supports IOCP on Windows.
    495    Supposedly, this will eventually make Windows IO much faster for
    496    programs using bufferevents.  We'll have to see; the code is not
    497    currently optimized at all.  To try it out, call the
    498    event_base_start_iocp() method on an event_base before contructing
    499    bufferevents.
    500 
    501    This is tricky code; there are probably some bugs hiding here.
    502 
    503 5.6. Improved connect support for bufferevents.
    504 
    505    You can now create a bufferevent that is not yet connected to any
    506    host, and tell it to connect, either by address or by hostname.
    507 
    508    The functions to do this are bufferevent_socket_connect and
    509    bufferevent_socket_connect_hostname.
    510 
    511 5.7. Rate-limiting for bufferevents
    512 
    513    If you need to limit the number of bytes read/written by a single
    514    bufferevent, or by a group of them, you can do this with a new set of
    515    bufferevent rate-limiting calls.
    516 
    517 6. Other improvements
    518 
    519 6.1. DNS improvements
    520 
    521 6.1.1. DNS: IPv6 nameservers
    522 
    523    The evdns code now lets you have nameservers whose addresses are IPv6.
    524 
    525 6.1.2. DNS: Better security
    526 
    527    Libevent 2.0 tries harder to resist DNS answer-sniping attacks than
    528    earlier versions of evdns.  See comments in the code for full details.
    529 
    530    Notably, evdns now supports the "0x20 hack" to make it harder to
    531    impersonate a DNS server.  Additionally, Libevent now uses a strong
    532    internal RNG to generate DNS transaction IDs, so you don't need to supply
    533    your own.
    534 
    535 6.1.3. DNS: Getaddrinfo support
    536 
    537    There's now an asynchronous getaddrinfo clone, evdns_getaddrinfo(),
    538    to make the results of the evdns functions more usable.  It doesn't
    539    support every feature of a typical platform getaddrinfo() yet, but it
    540    is quite close.
    541 
    542    There is also a blocking evutil_getaddrinfo() declared in
    543    event2/util.h, to provide a getaddrinfo() implementation for
    544    platforms that don't have one, and smooth over the differences in
    545    various platforms implementations of RFC3493.
    546 
    547    Bufferevents provide bufferevent_connect_hostname(), which combines
    548    the name lookup and connect operations.
    549 
    550 6.1.4. DNS: No more evdns globals
    551 
    552    Like an event base, evdns operations are now supposed to use an evdns_base
    553    argument.  This makes them easier to wrap for other (more OO) languages,
    554    and easier to control the lifetime of.  The old evdns functions will
    555    still, of course, continue working.
    556 
    557 6.2. Listener support
    558 
    559    You can now more easily automate setting up a bound socket to listen for
    560    TCP connections.  Just use the evconnlistener_*() functions in the
    561    event2/listener.h header.
    562 
    563    The listener code supports IOCP on Windows if available.
    564 
    565 6.3. Secure RNG support
    566 
    567    Network code very frequently needs a secure, hard-to-predict random number
    568    generator.  Some operating systems provide a good C implementation of one;
    569    others do not.  Libevent 2.0 now provides a consistent implementation
    570    based on the arc4random code originally from OpenBSD.  Libevent (and you)
    571    can use the evutil_secure_rng_*() functions to access a fairly secure
    572    random stream of bytes.
    573 
    574 6.4. HTTP
    575 
    576    The evhttp uriencoding and uridecoding APIs have updated versions
    577    that behave more correctly, and can handle strings with internal NULs.
    578 
    579    The evhttp query parsing and URI parsing logic can now detect errors
    580    more usefully.  Moreover, we include an actual URI parsing function
    581    (evhttp_uri_parse()) to correctly parse URIs, so as to discourage
    582    people from rolling their own ad-hoc parsing functions.
    583 
    584    There are now accessor functions for the useful fields of struct http
    585    and friends; it shouldn't be necessary to access them directly any
    586    more.
    587 
    588    Libevent now lets you declare support for all specified HTTP methods,
    589    including OPTIONS, PATCH, and so on.  The default list is unchanged.
    590 
    591    Numerous evhttp bugs also got fixed.
    592 
    593 7. Infrastructure improvements
    594 
    595 7.1. Better unit test framework
    596 
    597    We now use a unit test framework that Nick wrote called "tinytest".
    598    The main benefit from Libevent's point of view is that tests which
    599    might mess with global state can all run each in their own
    600    subprocess.  This way, when there's a bug that makes one unit test
    601    crash or mess up global state, it doesn't affect any others.
    602 
    603 7.2. Better unit tests
    604 
    605    Despite all the code we've added, our unit tests are much better than
    606    before.  Right now, iterating over the different backends on various
    607    platforms, I'm getting between 78% and 81% test coverage, compared
    608    with less than 45% test coverage in Libevent 1.4.
    609 
    610