Changes in version 2.0.22-stable (5 Jan 2015)

SECURITY FIXES (evbuffers)
 o Avoid integer overflow bugs in evbuffer_add() and related functions.  See CVE-2014-6272 advisory for more information. (20d6d4458bee5d88bda1511c225c25b2d3198d6c)

BUGFIXES (evhttp)
 o fix #73 and fix http_connection_fail_test to catch it (crash fix) (b618204 Greg Hazel)
 o Avoid racy bufferevent activation (5eb1788 Nate Rosenblum)

BUGFIXES (compilation and portability)
 o Fix compilation with WIN32_HAVE_CONDITION_VARIABLES enabled (7e45739)
 o Fix missing AC_PROG_SED on older Autoconfs (9ab2b3f Tay Ray Chuan)
 o Backport libevent to vanilla Autoconf 2.59 (as used in RHEL5) (74d4c44 Kevin Bowling)
 o Use AC_CONFIG_HEADERS in place of AM_CONFIG_HEADERS for autmake 1.13 compat (817ea36)
 o Rename configure.in to configure.ac to appease newer autoconfs (0c79787)
 o Avoid using top_srcdir in TESTS: new automakes do not like this (a55514e)
 o Use windows vsnprintf fixup logic on all windows environments (e826f19)
 o Fix a compiler warning when checking for arc4random_buf linker breakage. (5cb3865)
 o Fix another arc4random_buf-related warning (e64a2b0)
 o Add -Qunused-arguments for clang on macos (b56611d Trond Norbye)

BUGFIXES (resource leaks/lock errors on error)
 o Avoid leaking fds on evconnlistener with no callback set (69db261)
 o Avoid double-close on getsockname error in evutil_ersatz_socketpair (0a822a6)
 o Fix a locking error in bufferevent_socket_get_dns_error. (0a5eb2e)
 o libevent/win32_dealloc() : fix sizeof(pointer) vs sizeof(*pointer) (b8f5980 Frank Denis)

BUGFIXES: (other stability)
 o bufferevent_pair: don't call downcast(NULL) (f2428a2)
 o Consistently check for failure from evbuffer_pullup() (60f8f72)
 o Fix race caused by event_active (3c7d6fc vjpai)

BUGFIXES (miscellaneous)
 o Avoid redundant invocations of init_extension_functions for IOCP (3b77d62)
 o Typo fixes from Linus Nordberg (cec62cb, 8cd695b)
 o Add a few files created by "make verify" to .gitignore. (1a8295a Pierre Phaneuf)
 o regress_buffer: fix 'memcmp' compare size (79800df Maks Naumov)
 o Fix bufferevent setwatermark suspend_read (b34e4ac ufo2243)
 o Fix evbuffer_peek() with len==-1 and start_at non-NULL. (fb7e76a)

BUFGIXES (evdns)
 o Checking request nameserver for NULL, before using it. (5c710c0 Belobrov Andrey)
 o Fix SEGFAULT after evdns_base_resume if no nameservers installed. (f8d7df8 Azat Khuzhin)
 o Fix a crash in evdns related to shutting down evdns (9f39c88,e8fe749)

BUGFIXES (epoll)
 o Check does arch have the epoll_create and __NR_epoll_wait syscalls. (dfe1e52 Marcin Juszkiewicz)

BUGFIXES (evutil_secure_random)
 o Avoid other RNG initialization FS reads when urandom file is specified (9695e9c, bb52471)
 o When we seed from /proc/sys/kernel/random/uuid, count it as success (e35b540)
 o Document that arc4random is not a great cryptographic PRNG. (6e49696)
 o Add evutil_secure_rng_set_urandom_device_file (2bbb5d7)
 o Really remove RNG seeds from the stack (f5ced88)


DOCUMENTATION FIXES
 o Fix a mistake in evbuffer_remove() arguments in example http server code (c322c20 Gyepi Sam)
 o Fix a typo in a comment in buffer.h. Spotted by Alt_F4 (773b0a5)
 o Clarify event_base_loop exit conditions (031a803)
 o Use FindClose for handle from FindFirstFile in http-server.c (6466e88)
 o Fix a typo in a doxygen comment. Reported by 亦得. (be1aeff)


Changes in version 2.0.21-stable (18 Nov 2012)
BUGFIXES:
 o ssl: Don't discard SSL read event when timeout and read come close together (576b29f)
 o ssl: Stop looping in "consider_reading" if reading is suspended. (f719b8a Joachim Bauch)
 o ssl: No need to reserve space if reading is suspended. (1acf2eb Joachim Bauch)
 o dns: Avoid a memory-leak on OOM in evdns. (73e85dd, f2bff75 George Danchev)
 o build: Use python2 rather than python (0eb0109 Ross Lagerwall)
 o build: Compile without warnings on mingw64 (94866c2)
 o build: Fix compilation on mingw64 with -DUSE_DEBUG (62bd2c4)
 o build: Make rpcgen_wrapper.sh work on systems without a "python2" binary (f3009e4)
 o iocp: Close IOCP listener socket on free when LEV_OPT_CLOSE_ON_FREE is set (cb853ea Juan Pablo Fernandez)
 o core: Avoid crash when event_pending() called with no event_base set on event (e3cccf3)
 o misc: remove stray 'x' so print_err will compile when uncommented (ac35650 Patrick Pelletier)
 o tests: Fix renegotiation test to work around openssl 1.0.1 bug (c2f3086)
 o tests: Warn when openssl version in unit test mismatches compiled version. (ac009f9)


Changes in version 2.0.20-stable (23 Aug 2012)
BUGFIXES:
 o core: Make event_pending() threadsafe. (be7a95c Simon Liu)
 o win32: avoid crash when waiting forever on zero fds. (160e58b)
 o evhttp: Fix a memory leak on error in evhttp_uriencode (11c8b31)
 o evbuffer: Avoid possible needless call to writev. Found by coverity. (6a4ec5c)
 o evdns: memset sockaddr_in before using it. Found by coverity. (a1a0e67)
 o evhttp: Check more setsockopt return values when binding sockets. Found by coverity (a0912e3)
 o evdns: Avoid segfault on weird timeout during name lookup. (dc32077 Greg Hazel)
 o bufferevent_ssl: Correctly invoke callbacks when a SSL bufferevent reads some and then blocks. (606ac43)


PORTABILITY FIXES:
 o check for arc4random_buf at runtime, on OS X (bff5f94 Greg Hazel)
 o Correctly check for arc4random_buf (fcec3e8 Sebastian Hahn)
 o Add explicit AC_PROG_SED to configure.in so all autoconfs will expose $(SED) (ca80ea6)

BUILD FIXES:
 o Add GCC annotations so that the vsprintf functions get checked properly (117e327)
 o Fix an unused variable warning on *BSD. (c0720c1)

UNIT TEST FIXES:
 o Fix a couple of memory leaks (found with Valgrind). (3b2529a Ross Lagerwall)
 o Remove deadcode in http regression tests. Found by coverity. (5553346)
 o Fix possible uninitialized read in dns regression tests. Found by coverity. (2259777)
 o Set umask before calling mkstemp in unit tests. Found by coverity (f1ce15d)
 o Fix various check-after-dereference issues in unit tests: found by coverity (4f3732d)
 o Fix resource leaks in the unit tests; found by coverity (270f279)
 o Add some missing null checks to unit tests; found by coverity (f021c3d)
 o Avoid more crashes/bad calls in unit tests; found by coverity (3cde5bf)
 o Remove unused variable; spotted by coverity (6355b2a)
 o Add checks to various return values in unit tests. Found by coverity (b9e7329)
 o Move assignment outside tt_assert in ssl unit tests. Appeases coverity. (a2006c0)



Changes in version 2.0.19-stable (3 May 2012)
BUGFIXES (CORE):
 o Refactor event_persist_closure: raise and extract some common logic (bec22b4)
 o If time has jumped so we'd reschedule a periodic event in the past, schedule it for the future instead (dfd808c)
 o If a higher-priority event becomes active, don't continue running events of the current priority. (2bfda40)

BUGFIXES (SSL):
 o Fixed potential double-readcb execution with openssl bufferevents. (4e62cd1 Mark Ellzey)

BUGFIXES (DNS):
 o Cancel a probe request when the server is freed, and ignore cancelled probe callbacks (94d2336 Greg Hazel)
 o Remove redundant DNS_ERR_CANCEL check, move comment (46b8060 Greg Hazel)
 o When retransmitting a timed-out DNS request, pick a fresh nameserver. (3d9e52a)

DOCUMENTATION FIXES:
 o Fix a typo in the bufferevent documentation (98e9119)
 o Add missing ) to changelog; spotted by rransom (4c7ee6b)
 o Fix the website URL in the readme (f775521)

COMPILATION FIXES:
 o Fix a compilation error with MSVC 2005 due to use of mode_t (336dcae)
 o Configure with gcc older than 2.95 (4a6fd43 Sebastian Hahn)
 o Generate event-config.h with a single sed script (30b6f88 Zack Weinberg)

FORWARD-COMPATIBILITY:
 o Backport: provide EVENT_LOG_* names, and deprecate _EVENT_LOG_* (d1a03b2)

TESTING/DEBUGGING SUPPORT:
 o dns-example.c can now take a resolv.conf file on the commandline (6610fa5)
 o Make some evdns.c debug logs more verbose (d873d67)
 o Work-around a stupid gcov-breaking bug in OSX 10.6 (b3887cd)



Changes in version 2.0.18-stable (22 Mar 2012)
BUGFIXES (core):
 o Make uses of open() close-on-exec safe by introducing an internal evutil_open_closeonexec. (d2b5f72 Ross Lagerwall, 03dce42)

BUGFIXES (kqueue):
 o Properly zero the kevent in kq_setup_kevent() (c2c7b39 Sebastian Hahn)

BUILD FIXES:
 o Added OPENSSL_LDFLAGS env variable which is appended to SSL checks. (9278196 Mark Ellzey)
 o Changed OPENSSL_LDFLAGS to OPENSSL_LIBADD (2d67b63 Mark Ellzey)
 o Don't do clang version detection when disabling some flags (083296b Sebastian Hahn)

BUGFIXES (dns):
 o Stop crashing in evdns when nameserver probes give a weird error (bec5068)


Changes in version 2.0.17-stable (10 Feb 2012)

BUGFIXES (core):
 o Be absolutely sure to clear pncalls before leaving event_signal_closure (11f36a5)
 o check for sysctl before we use it (358c745 Mike Frysinger)
 o Remove bogus casts of socket to int before calling ev_callback (f032516)
 o Make evconnlistener work around bug in older Linux when getting nmapped (ecfc720)
 o Fix a list corruption bug when using event_reinit() with signals present (6e41cdc)
 o Fix a fd leak in event_reinit() (3f18ad1)
 o Do a memberwise comparison of threading function tables (c94a5f2 Nate R)
 o Use C-style comments in C source files (for compatibility with compilers such as xlc on AIX). (d84d917 Greg Hewgill)
 o Avoid crash when freeing event_iocp and using event_set_mem_functions (19715a6)
 o In the kqueue backend, do not report EBADF as an EV_READ (5d7bfa1 Nicholas Marriott)

BUGFIXES (evbuffer and bufferevents):
 o Fix behavior of evbuffer_peek(buf,-1,NULL,NULL,0) (c986f23 Zack Weinberg)
 o Loop on filtering SSL reads until we are blocked or exhausted. (5b4b812)

BUGFIXES (evhttp):
 o Force strict validation of HTTP version in response. (790f6b3 Catalin Patulea)

BUGFIXES (evdns):
 o evdns: fix a bug in circular-queue implementation (d6094b1)

BUILD FIXES:
 o Fix a silly compilation error with the sun compiler (1927776 Colin Watt)
 o Suppress a gcc warning from ignoring fwrite return in http-sample.c (7206e8c)

DOCUMENTATION FIXES:
 o Slightly clarify evbuffer_peek documentation (7bbf6ca)
 o Update copyright notices to 2012 (e49e289)

NEW APIS:
 o Backport evhttp_connection_get_bufferevent to Libevent 2.0 (da70fa7 Arno Bakker)

TESTS AND TEST FIXES:
 o Fix a race condition in the dns/bufferevent_connect_hostname test. (cba48c7)
 o Add function to check referential integrity of an event_base (27737d5)
 o Check event_base correctness at end of each unit test (3312b02)
 o Workaround in the unit tests for an apparent epoll bug in Linux 3.2 (dab9187)
 o Better workaround for Linux 3.2 edge-triggered epoll bug (9f9e259)

Changes in version 2.0.16-stable (18 Nov 2011)
BUGFIXES (core):
 o More detailed message in case of libevent self-debugging failure. (9e6a4ef Leonid Evdokimov)
 o epoll: close fd on alloc fail at initialization (1aee718 Jamie Iles)
 o Fix compile warning from saying event2/*.h inside a comment (447b0ba)
 o Warn when unable to construct base because of failing make_base_notifiable (4e797f3)
 o Don't try to make notifiable event_base when no threading fns are configured (e787413)

BUGFIXES (evbuffer):
 o unit test for remove_buffer bug (90bd620 Greg Hazel)
 o Fix an evbuffer crash in evbuffer_remove_buffer() (c37069c)

BUGFIXES (bufferevent_openssl):
 o Refactor amount-to-read calculations in buffervent_ssl consider_reading() (a186e73 Mark Ellzey)
 o Move SSL rate-limit enforcement into bytes_to_read() (96c562f)
 o Avoid spinning on OpenSSL reads (2aa036f Mark Ellzey)

BUGFIXES (dns)
 o Empty DNS reply with OK status is another way to say NODATA. (21a08d6 Leonid Evdokimov)

TESTING:
 o Tests for 94fba5b and f72e8f6 (d58c15e Leonid Evdokimov)
 o Test for commit aff6ba1 (f7841bf Leonid Evdokimov)
 o Style and comment tweaks for dns/leak* tests (5e42202)
 o improve test to remove at least one buffer from src (7eb52eb Greg Hazel)

DOCUMENTATION:
 o Add note about evhttp_send_reply_end to its doxygen (724bfb5)
 o Update copyright dates to 2011. (3c824bd)
 o Fix typo in whatsnew-2.0.txt (674bc6a Mansour Moufid)
 o Improve win32 behavior of dns-sample.c code (a3f320e Gisle Vanem)



Changes in version 2.0.15-stable (12 Oct 2011)
BUGFIXES (DNS):
 o DNS: add ttl for negative answers using RFC 2308 idea. (f72e8f6 Leonid Evdokimov)
 o Add DNS_ERR_NODATA error code to handle empty replies. (94fba5b Leonid Evdokimov)

BUFGIXES (bufferevents and evbuffers):
 o Make evbuffer callbacks get the right n_added value after evbuffer_add (1ef1f68 Alex)
 o Prefer mmap to sendfile unless a DRAINS_TO_FD flag is set. Allows add_file to work with SSL. (0ba0af9)

BUGFIXES (event loop):
 o When a signal callback is activated to run multiple times, allow event_base_loopbreak to work even before they all have run. (4e8eb6a)

DOCUMENTATION FIXES:
 o Fix docstring in dns.h (2b6eae5 Leonid Evdokimov)
 o refer to non-deprecated evdns functions in comments (ba5c27d Greg Hazel)

BUILD AND TESTING FIXES:
 o le-proxy and regress depend on openssl directly (9ae061a Sergey Avseyev)
 o Use _SOURCES, not _sources, in sample/Makefile.am (7f82382)
 o Fixed compiler warnings for unchecked read/write calls. (c3b62fd Mark Ellzey)
 o Make write-checking fixes use tt_fail_perror (2b76847)
 o Fix some "value never used" warnings with gcc 4.6.1 (39c0cf7)



Changes in version 2.0.14-stable (31 Aug 2011)
BUGFIXES (bufferevents and evbuffers):
 o Propagate errors on the underlying bufferevent to the user. (4a34394 Joachim Bauch)
 o Ignore OpenSSL deprecation warnings on OS X (5d1b255 Sebastian Hahn)
 o Fix handling of group rate limits under 64 bytes of burst (6d5440e)
 o Solaris sendfile: correctly detect amount of data sent (643922e Michael Herf)
 o Make rate limiting work with common_timeout logic (5b18f13)
 o clear read watermark on underlying bufferevent when creating filtering bev to fix potentially failing fragmented ssl handshakes (54f7e61 Joachim Bauch)

BUGFIXES (IOCP):
 o IOCP: don't launch reads or writes on an unconnected socket (495c227)
 o Make IOCP rate-limiting group support stricter and less surprising. (a98da7b)
 o Have test-ratelim.c support IOCP (0ff2c5a)
 o Make overlapped reads result in evbuffer callbacks getting invoked (6acfbdd)
 o Correctly terminate IO on an async bufferevent on bufferevent_free (e6af35d)

BUGFIXES (other):
 o Fix evsig_dealloc memory leak with debugging turned on. (9b724b2 Leonid Evdokimov)
 o Fix request_finished memory leak with debugging turned on. (aff6ba1 Leonid Evdokimov)

BUILD AND TESTING FIXES:
 o Allow OS-neutral builds for platforms where some versions have arc4random_buf (b442302 Mitchell Livingston)
 o Try to fix 'make distcheck' errors when building out-of-tree (04656ea Dave Hart)
 o Clean up some problems identified by Coverity. (7c11e51 Harlan Stenn)


Changes in version 2.0.13-stable (18 Jul 2011)
BUGFIXES
 o Avoid race-condition when initializing global locks (b683cae)
 o Fix bug in SSL bufferevents backed by a bev with a write high-watermarks (e050703 Joachim Bauch)
 o Speed up invoke_callbacks on evbuffers when there are no callbacks (f87f568 Mark Ellzey)
 o Avoid a segfault when all methods are disabled or broken (27ce38b)
 o Fix incorrect results from evbuffer_search_eol(EOL_LF) (4461f1a)
 o Add some missing checks for mm_calloc failures (89d5e09)
 o Replace an assertion for event_base_free(NULL) with a check-and-warn (09fe97d)
 o Report kqueue ebadf, epipe, and eperm as EV_READ events (1fd34ab)
 o Check if the `evhttp_new_object' function in `http.c' returns NULL. (446cc7a Mansour Moufid)
 o Use the correct printf args when formatting size_t (3203f88)
 o Complain if the caller tries to change threading cbs after setting them (cb6ecee)

DOCUMENTATION FIXES AND IMPROVEMENTS
 o Revise the event/evbuffer/bufferevent doxygen for clarity and accuracy (2888fac)
 o Update Doxyfile to produce more useful output (aea0555)

TEST FIXES
 o Fix up test_evutil_snprintf (caf695a)
 o Fix tinytest invocation from windows shell (57def34 Ed Day)

BUILD FIXES
 o Use AM_CPPFLAGS in sample/Makefile.am, not AM_CFLAGS (4a5c82d)
 o Fix select.c compilation on systems with no NFDBITS (49d1136)
 o Fix a few warnings on OpenBSD (8ee9f9c Nicholas Marriott)
 o Don't break when building tests from git without python installed (b031adf)
 o Don't install event_rpcgen.py when --disable-libevent-install is used (e23cda3 Harlan Stenn)
 o Fix AIX build issue with TAILQ_FOREACH definition (e934096)


Changes in version 2.0.12-stable (4 Jun 2011)
BUGFIXES
 o Fix a warn-and-fail bug in kqueue by providing kevent() room to report errors (28317a0)
 o Fix an assert-inducing fencepost bug in the select backend (d90149d)
 o Fix failing http assertion introducd in commit 0d6622e (0848814 Kevin Ko)
 o Fix a bug that prevented us from configuring IPv6 nameservers. (74760f1)
 o Prevent size_t overflow in evhttp_htmlescape. (06c51cd Mansour Moufid)
 o Added several checks for under/overflow conditions in evhttp_handle_chunked_read (a279272 Mark Ellzey)
 o Added overflow checks in evhttp_read_body and evhttp_get_body (84560fc Mark Ellzey)

DOCUMENTATION:
 o Add missing words to EVLOOP_NONBLOCK documentation (9556a7d)

BUILD FIXES
 o libssl depends on libcrypto, not the other way around. (274dd03 Peter Rosin)
 o Libtool brings in the dependencies of libevent_openssl.la automatically (7b819f2 Peter Rosin)
 o Use OPENSSL_LIBS in Makefile.am (292092e Sebastian Hahn)
 o Move the win32 detection in configure.in (ceb03b9 Sebastian Hahn)
 o Correctly detect openssl on windows (6619385 Sebastian Hahn)
 o Fix a compile warning with zlib 1.2.4 and 1.2.5 (5786b91 Sebastian Hahn)
 o Fix compilation with GCC 2, which had no __builtin_expect (09d39a1 Dave Hart)
 o Fix new warnings from GCC 4.6 (06a714f)
 o Link with -lshell32 and -ladvapi32 on Win32. (86090ee Peter Rosin)
 o Make the tests build when OpenSSL is not available. (07c41be Peter Rosin)
 o Bring in the compile script from automake, if needed. (f3c7a4c Peter Rosin)
 o MSVC does not provide S_ISDIR, so provide it manually. (70be7d1 Peter Rosin)
 o unistd.h and sys/time.h might not exist. (fe93022 Peter Rosin)
 o Make sure TINYTEST_LOCAL is defined when building tinytest.c (8fa030c Peter Rosin)
 o Fix winsock2.h #include issues with MSVC (3d768dc Peter Rosin)
 o Use evutil_gettimeofday instead of relying on the system gettimeofday. (0de87fe Peter Rosin)
 o Always use evutil_snprintf, even if OS provides it (d1b2d11 Sebastian Hahn)
 o InitializeCriticalSectionAndSpinCount requires _WIN32_WINNT >= 0x0403. (816115a Peter Rosin)
 o cygwin: make it possible to build DLLs (d54d3fc)



Changes in version 2.0.11-stable (27 Apr 2011)
  [Autogenerated from the Git log, sorted and cleaned by hand.]
BUGFIXES:
 o Fix evport handling of POLLHUP and POLLERR (b42ce4b)
 o Fix compilation on Windows with NDEBUG (cb8059d)
 o Check for POLLERR, POLLHUP and POLLNVAL for Solaris event ports (0144886 Trond Norbye)
 o Detect and handle more allocation failures. (666b096 Jardel Weyrich)
 o Use event_err() only if the failure is truly unrecoverable. (3f8d22a Jardel Weyrich)
 o Handle resize failures in the select backend better. (83e805a)
 o Correctly free selectop fields when select_resize fails in select_init (0c0ec0b)
 o Make --enable-gcc-warnings a no-op if not using gcc (3267703)
 o Fix a type error in our (unused) arc4random_stir() (f736198)
 o Correctly detect and stop non-chunked http requests when the body is too long (63a715e)
 o Have event_base_gettimeofday_cached() always return wall-clock time (a459ef7)
 o Workaround for http crash bug 3078187 (5dc5662 Tomash Brechko)
 o Fix incorrect assertions and possible use-after-free in evrpc_free() (4b8f02f Christophe Fillot)
 o Reset outgoing http connection when read data in idle state. (272823f Tomash Brechko)
 o Fix subtle recursion in evhttp_connection_cb_cleanup(). (218cf19 Tomash Brechko)
 o Fix the case when failed evhttp_make_request() leaved request in the queue. (0d6622e Tomash Brechko)
 o Fix a crash bug in evdns server circular list code (00e91b3)
 o Handle calloc failure in evdns. (Found by Dave Hart) (364291e)
 o Fix a memory leak on win32 socket->event map. (b4f89f0)
 o Add a forgotten NULL check to evhttp_parse_headers (12311ff Sebastian Hahn)
 o Fix possible NULL-deref in evdns_cancel_request (5208544 Sebastian Hahn)

PORTABILITY:
 o Fall back to sscanf if we have no other way to implement strtoll (453317b)
 o Build correctly on platforms without sockaddr_storage (9184563)
 o Try to build correctly on platforms with no IPv6 support (713c254)
 o Build on systems without AI_PASSIVE (cb92113)
 o Fix http unit test on non-windows platforms without getaddrinfo (6092f12)
 o Do not check for gethostbyname_r versions if we have getaddrinfo (c1260b0)
 o Include arpa/inet.h as needed on HPUX (10c834c Harlan Stenn)
 o Include util-internal.h as needed to build on platforms with no sockaddr_storage (bbf5515 Harlan Stenn)
 o Check for getservbyname even if not on win32. (af08a94 Harlan Stenn)
 o Add -D_OSF_SOURCE to fix hpux builds (0b33479 Harlan Stenn)
 o Check for allocation failures in apply_socktype_protocol_hack (637d17a)
 o Fix the check for multicast or broadcast addresses in evutil_check_interfaces (1a21d7b)
 o Avoid a free(NULL) if out-of-memory in evdns_getaddrinfo. Found by Dave Hart (3417f68)

DEFENSIVE PROGRAMMING:
 o Add compile-time check for AF_UNSPEC==PF_UNSPEC (3c8f4e7)

BUGS IN TESTS:
 o Fix test.sh output on solaris (b4f89b6 Dave Hart)
 o Make test-eof fail with a timeout if we never get an eof. (05a2c22 Harlan Stenn)
 o Use %s with printf in test.sh (039b9bd)
 o Add an assert to appease clang's static analyzer (b0ff7eb Sebastian Hahn)
 o Add a forgotten return value check in the unit tests (3819b62 Sebastian Hahn)
 o Actually send NULL request in http_bad_request_test (b693c32 Sebastian Hahn)
 o add some (void) casts for unused variables (65707d7 Sebastian Hahn)
 o Refactor test_getaddrinfo_async_cancel_stress() (48c44a6 Sebastian Hahn)
 o Be nice and "handle" error return values in sample code (4bac793 Sebastian Hahn)
 o Check return value of evbuffer_add_cb in tests (93a1abb Sebastian Hahn)
 o Remote some dead code from dns-example.c (744c745 Sebastian Hahn)
 o Zero a struct sockaddr_in before using it (646f9fe Sebastian Hahn)

BUILD FIXES:
 o Fix warnings about AC_LANG_PROGRAM usage (f663112 Sebastian Hahn)
 o Skip check for zlib if we have no zlib.h (a317c06 Harlan Stenn)
 o Fix autoconf bracket issues; make check for getaddrinfo include netdb.h (833e5e9 Harlan Stenn)
 o Correct an AM_CFLAGS to an AM_CPPFLAGS in test/Makefile.am (9c469db Dave Hart)
 o Fix make distcheck & installation of libevent 1 headers (b5a1f9f Dave Hart)
 o Fix compilation under LLVM/clang with --enable-gcc-warnings (ad9ff58 Sebastian Hahn)

FEATURES:
 o Make URI parser able to tolerate nonconformant URIs. (95060b5)

DOCUMENTATION:
 o Clarify event_set_mem_functions doc (926f816)
 o Correct evhttp_del_accept_socket documentation on whether socket is closed (f665924)
 o fix spelling mistake in whatsnew-2.0.txt (deb2f73)
 o Fix sample/http-server ipv6 fixes (eb692be)
 o Comment internal headers used in sample code. (4eb281c)
 o Be explicit about how long event loops run in event.h documentation (f95bafb)
 o Add comment to configure.in to explain gc-sections test logic (c621359)
 o Fix a couple of memory leaks in samples/http-server.c. Found by Dave Hart. (2e9f665)

BUILD IMPROVEMENTS:
 o Use the gcc -ffunction-segments feature to allow gc when linking with static libevent (0965c56 Dave Hart)
 o Add configure options to disable installation, regression tests (49e9bb7 Dave Hart)



Changes in version 2.0.10-stable (16 Dec 2010)
  [Autogenerated from the Git log, sorted and cleaned by hand.]
BUGFIXES
 o Minor fix for IOCP shutdown handling fix (2599b2d Kelly Brock)
 o Correctly notify the main thread when activating an event from a subthread (5beeec9)
 o Reject overlong http requests early when Expect:100-continue is set (d23839f Constantine Verutin)
 o EVUTIL_ASSERT: Use sizeof() to avoid "unused variable" warnings with -DNDEBUG. (b63ab17 Evan Jones)

CODE CLEANUPS
 o bufferevent-internal.h: Use the new event2/util.h header, not evutil.h (ef5e65a Evan Jones)
 o Use relative includes instead of system includes consistently. (fbe64f2 Evan Jones)
 o Make whitespace more consistent

TESTING
 o tests: Use new event2 headers instead of old compatibility headers. (4f33209 Evan Jones)

DOCUMENTATION
 o Document that the cpu_hint is only used on Windows with IOCP for now (57689c4)
 o Add stuff to "whats new in 2.0" based on reading include changes since August. (18adc3f)


Changes in 2.0.9-rc (30 Nov 2010):
  [Autogenerated from the Git log, sorted and cleaned by hand.]
NEW AND MODIFIED APIs
 o Add a function to change a listener's callback. (46ee061)
 o Make evbuffer_add_file take ev_off_t, not off_t (ac7e52d)
 o Make rate-limits go up to SIZE_MAX/EV_SSIZE_MAX, not just INT32_MAX (2cbb1a1)
 o Add a bufferevent_get_base function (aab49b6)

MAJOR BUGFIXES
 o Disable changelist for epoll by default because of Linux dup() bug; add an option and/or an envvar to reenable it for speed. (9531763)
 o Fix a 100%-CPU bug where an SSL connection would sometimes never stop trying to write (1213d3d)
 o Fix a nasty bug related to use of dup() with epoll on Linux (c281aba)
 o Fix bugs in posix thread-id calculation when sizeof(pthread_t) != sizeof(long) (fbaf077)
 o Fix some ints to evutil_socket_t; make tests pass on win64. (f817bfa Dimitre Piskyulev)
 o Set _EVENT_SIZEOF_VOID_P correctly on win32 and win64 (1ae82cd Dimitre Piskyulev)
 o Avoid double-invocation of user callback with EVUTIL_EAI_CANCEL (abf01ed)
 o Set SO_UPDATE_ACCEPT_CONTEXT on sockets from AcceptEx so that shutdown() can work (52aa419)
 o When closing a filtering bufferevent, clear callbacks on the underlying bufferevent (fc7b1b0)

NEW AND MODIFIED HTTP APIs
 o Add evhttp_parse_query_str to be used with evhttp_uri_parse. (2075fbc)
 o Add evhttp_response_code to remove one more reason to include http_struct.h (22e0a9b)
 o Define enumerators for all HTTP methods, including PATCH from RFC5789 (75a7341 Felix Nawothnig)
 o Functions to actually use evhttp_bound_socket with/as evconnlistener. (006efa7)
 o Add evhttp_request_get_command so code can tell GET from POST without peeking at the struct. (49f4bf7)
 o Introduce absolute URI parsing helpers. (86dd720 Pavel Plesov)
 o Revise evhttp_uri_parse implementation to handle more of RFC3986 (eaa5f1d)
 o Add evhttp_connection_get_base() to get the event_base from an http connection (cd00079)
 o Let evhttp_parse_query return -1 on failure (b1756d0)
 o New evhttp_uri(encode|decode) functions to handle + and NUL characters right (a8148ce)
 o Add evhttp_response_code to remove one more reason to include http_struct.h (22e0a9b)
 o Tweak interface for allowed methods (f5b391e)
 o Add evhttp server alias interface, correct flagging of proxy requests. (aab8c38 Christopher Davis)

HTTP BUGFIXES
 o Add some comments to http.c and make a few functions static. (90b3ed5)
 o Fix Content-Length when trying send more than 100GB of data (!) on an evhttp. (525da3e)
 o Fix a bug where we would read too much data in HTTP bodies or requests. (58a1cc6)
 o Correctly count req->body_size on http usage without Content-Length (8e342e5)
 o Avoid missed-request bug when entire http request arrives before data is flushed (74c0e86)
 o reset "chunked" flag when sending non-chunked reply (aa5f55f Joachim Bauch)
 o evhttp_encode_uri encodes all reserved characters, including !$'()*+,/:=@ (2e63a60)
 o Replace exact-version checks for HTTP/1.1 with >= or < checks (647e094)
 o evhttp: Return 501 when we get an unrecognized method, not 400. (536311a)
 o Don't disable reading from the HTTP connection after sending the request to be notified of connection-close in time (c76640b Felix Nawothnig)
 o Never call evhttp_readcb while writing. (0512487)
 o Try to fix an assertion failure related to close detection (0faaa39)
 o Correctly detect timeouts during http connects (04861d5)
 o Preliminary support for Continue expectation in evhttp. (fa9305f Christopher Davis)

OTHER BUGFIXES
 o Correct logic for realigning a chain in evbuffer_add (e4f34e8)
 o Fix a minor syntax error that most compilers didn't care about (e56ff65)
 o Fix some uses of int for socket in regress (5d389dc)
 o Check return value for ioctlsocket on win32 (f5ad31c Trond Norbye)
 o Fix som event_warns that should have been event_warnx (19c71e7)
 o Fix signal handler types for win64. (b81217f)
 o Try to clear up more size_t vs int/long issues. (598d133)
 o Make sure IOCP evconnlistener uses virtual events. (7b40a00 Christopher Davis)
 o Don't free evdns_request handles until after the callback is invoked (9ed30de)
 o Fix some more cancel-related bugs in getaddrinfo_async (c7cfbcf)
 o Make evdns_getaddrinfo_cancel threadsafe (d51b2fc)
 o Only clear underlying callbacks when the user hasn't reset them. (1ac5b23)
 o Fix bug in bufferevent_connect on an openssl bufferevent that already had an fd (4f228a1)
 o Resolve an evport bug in the thread/forking test (3a67d0b)
 o Make sure the CLOEXEC flag is set on fds we open for base notification (3ab578f)
 o Fix IRIX build.  sa_family collides with a #define in sys/socket.h on IRIX. (e874982 Kevin Bowling)
 o If not WIN32, include <sys/socket.h> in event2/util.h. (1cd45e5 Kevin Bowling)
 o Fix some C99-style comments to work with the xlC compiler. (c2e5e22 Kevin Bowling)
 o Add some checks since lack of TAILQ_FOREACH doesn't imply lack of FIRST, END, NEXT, or INSERT_BEFORE.  Quiet some warnings in XL C. (c4dc335 Kevin Bowling)
 o Reworked AIX __ss_family workaround to use AC_STRUCT_MEMBER. (2e2a3d7 Kevin Bowling)
 o Take select from <sys/select.h> when testing in autoconf.  AIX build fix. (a3a9f6b Kevin Bowling)
 o Fix snprintf related failures on IRIX. (3239073 Kevin Bowling)
 o Remove _event_initialized(); make event_initialized() a function(); make it consistent on windows and non-windows (652024b)
 o Do not let EVLOOP_ONCE exit the loop until all deferred callbacks have run (2d5e1bd)
 o Make EVLOOP_ONCE ignore internal events (0617a81)
 o Possible crash fix when freeing an underlying bufferevent of an openssl bufferevent (29f7623)

HTTP CLEANUPS
 o Stop using Libevent-1 headers in regress_http (1f507d7)
 o Modernize header usage in bench_http.c (e587069)
 o fix signed/unsigned warnings in http.c (74a91e5)
 o Update the HTTP regression tests to use Libevent2 apis for non-http stuff (d9ffa89)
 o Start porting http tests to not use legacy interfaces (8505a74)
 o Convert the rest of the http tests to be non-legacy unit tests. (9bb8239)
 o Rename the confusing "base" static variable in regress_http.c (353402a)
 o Stop accessing http request struct directly from in the unit tests. (0b137f4)
 o Refactor http version parsing into a single function (a38140b)

TESTING
 o Improvements to tinytest_macros.h (ad923a1)
 o Add a huge pile of tests for the new URI functions, and make them pass. (a5a76e6)
 o Unit tests for evhttp_uri_set* (bc98f5e)
 o Increase the skew tolerance to 2 seconds in thread/deferred_cb_skew (f806476 Christopher Davis)
 o Reorder backends in test.sh to match preference order in event.c (ece974f)
 o Add a stress test for getaddrinfo_cancel (da1bf52)
 o Units test for unexpected evhttp methods. (75e3320)

DOCUMENTATION
 o Document behavior of URI parsing more thoroughly. (3a33462)
 o Document that two bufferevent functions only work on socket bufferevents (70e1b60)
 o add a requested docstring for event_rpcgen.CommandLine.__init__ (f1250eb)
 o Fix a mistake in http documentation found by Julien Blache (229714d)
 o Add a basic example of how to write a static HTTP server. (4e794d5)
 o Document event_get_assignment (88be27d)
 o Note that reentrant calls to libevent from logging cbs may fail badly (e431bcd)
 o Clarify EVLOOP_* documentation to be more precise. (057a514)

CLEANUPS
 o Simplify the logic for choosing EPOLL_CTL_ADD vs EPOLL_CTL_MOD (2c66983)
 o Rename "size" variables in win32select that were really fd counts. (b6a158c)
 o Fix even more win64 warnings (7484df6)
 o Fix even more win64 warnings: buffer, event_tagging, http, evdns, evrpc (545a611)
 o Fix more wn64 warnings. (34b84b9 Christopher Davis)
 o Use the label_len local variable in evdns instead of recalculating it over and over (ba01456)
 o Fix some irix compilation warnings spotted by Kevin Bowling (7bcace2)



Changes in 2.0.8-rc (14 Oct 2010):
 [Autogenerated from the Git log, sorted and cleaned by hand.]
NEW APIS
 o Add error callback to evconnlistener (c4be8d8 Simon Perreault)
 o Add a LEV_OPT_THREADSAFE option for threadsafe evconnlisteners (127d4f2)

CHANGED BEHAVIOR
 o Correct logic on disabling underlying bufferevents when disabling a filter (ac27eb8)

BUGFIXES
 o Obey enabled status when unsuspending (040a019 Simon Perreault)
 o Warn when using the error-prone EV_SIGNAL interface in an error-prone way.  Also, fix a couple of race conditions in signal.c (720bd93)
 O Make default signal backend fully threadsafe (95a7d41)
 o Put internal events at highest priority (90651b3)
 o Fix warnings in the main codebase flagged by -Wsigned-compare (9c8db0, 5e4bafb, 5c214a, 6be589a, e06f514)
 o Fix compile in kqueue.c (b395392 Sebastian Hahn)
 o Do not search outside of the system directory for windows DLLs (d49b5e3)
 o Fix a spurious-call bug on epoll.c (0faaee0)
 o Send a shutdown(SHUT_WR) before closing an http connection (e0fd870 Christopher Davis)
 o Fix warnings on mingw with gcc 4.5 (5b7a370)
 o Fix an EINVAL on evbuffer_write_iovec on OpenSolaris. (fdc640b)
 o Fix allocation error for IOCP listeners. Probably harmless, since struct event is big (481ef92)
 o Make iocp/listener/error work; don't accept again if lev is disabled. (62b429a Christopher Davis)
 o Handle rate-limiting for reading on OpenSSL bufferevents correctly. (819b171)
 o Fix serious bugs in per-bufferevent rate-limiting code (34d64f8)
 o Avoid spurious reads from just-created open openssl bufferevents (223ee40)
 o Fix a case where an ssl bufferevent with CLOSE_ON_FREE didn't close its fd (93bb7d8)
 o The corrected bufferevent filter semantics let us fix our openssl tests (34331e4)

TESTING
 o Make SSL tests cover enabling/disabling EV_READ. (a5ce9ad)
 o Bump to the latest version of tinytest (f0bd83e)
 o Unit tests for listener error callbacks (045eef4)
 o New unit test for ssl bufferevents starting with connected SSLs. (02f6259)

DEBUGGABILITY
 o Make debugging output for epoll backend more comprehensive (ec2b05e)
 o Make event.c debugging messages report fds (e119899)
 o Make the --enable-gcc-warnings option include signed comparison warnings (d3b096c)

DEADCODE REMOVAL
 o Remove the now-useless evsig_caught and evsig_process (4858b79)
 o Remove event_base.evsigbase; nothing used it. (38d0960)



Changes in 2.0.7-rc (9 Sep 2010):
 [Autogenerated from the Git log, sorted and cleaned by hand.]
NEW APIS
 o Expose a evdns_base_nameserver_sockaddr_add() function to add a nameserver by sockaddr (1952143)
 o Add event_config_set_num_cpus_hint() for tuning win32 IOCP thread pools, etc. (2447fe8 Christopher Davis)

BUGFIXES
 o Fix a nasty dangling-event bug when using rate-limiting groups (0bffe43)
 o Clean up syntax on TAILQ_ENTRY() usage to build correctly with recent MSVC (60433a0 Gilad Benjamini)
 o Make definition of WIN32_LEAN_AND_MEAN in event.h conditional (3920172 Gilad Benjamini)
 o Correctly detect failure to delete bufferevent read-timeout event (da6e7cd)
 o Set close-on-exec bit for filedescriptors created by dns subsystem (d0b8843)
 o Fix kqueue correctness test on x84_64 (6123d12)
 o Detect events with no ev_base; warn instead of crashing (f1074b7)
 o Fix an issue with forking and signal socketpairs in select/poll backends (d61b2f3)
 o Stop using global arrays to implement the EVUTIL_ctype functions (1fdec20)
 o On windows, make lock/thread function tables static (5de2bcb)
 o Close th_notify_fds and open a new pair on reinit (495ed66)
 o Declare signal handler function as "__cdecl" on Windows (f0056d0)
 o Use the _func() replacements for open, fstat, etc in evutil.c on win32 (e50c0fc)
 o Only process up to MAX_DEFERRED deferred_cbs at a time (17a14f1 Christopher Davis)

THREADING BUGFIXES
 o Avoid deadlock when activating signals (970e6ad)
 o Add a condition variable backend, with implementations for pthreads and win32 (d4977b5)
 o Use conditions instead of current_event_lock to fix a deadlock (e0972c2)
 o Fix logic error in win32 TRY_LOCK that caused problems with rate-limiting (4c32b9d)
 o Avoid needlessly calling evthread_notify_base() when the loop is not running (c7a06bf)
 o Minimize calls to base_notify implementation functions, thereby avoiding needless syscalls (4632b78)

IOCP BUGFIXES
 o IOCP-related evbuffer fixes (03afa20 Christopher Davis)
 o Stop IOCP when freeing the event_base (d844242 Christopher Davis)
 o Some IOCP bufferevent tweaks (76f7e7a Christopher Davis)

TESTS
 o Make the regress_pthread.c tests work on windows with current test APIs (d74ae38)
 o Add a unit test for conditions (5fb1095)
 o Allow more than one copy of regression tests to run at once (a97320a)
 o Fix event_del(0) instance in bench.c (b0f284c Shuo Chen)
 o Fix a few memory leaks in the tests (1115366)
 o IOCP-related unit test tweaks (499452f Christopher Davis)
 o Improve testing of when thread-notification occurs (ce85280)

BUILD AND DISTRIBUTION
 o Add pkgconfig files for libevent_{openssl,pthreads} (ebcb1f0)
 o Change include order in Makefile.nmake (4022b28)
 o Make include/event2/event-config.h not included in source dist (a4af9be)
 o Honor NDEBUG; build without warnings with NDEBUG; make NDEBUG always-off in unit test code (743f866)
 o Declare evkeyvalq and event_list even if event_struct.h comes before sys/queue.h (d3ceca8)
 o Move evkeyvalq into a separate header for evhttp_parse_query users (ca9048f)
 o Prefer autoreconf -ivf to manual autogen.sh (7ea8e89)

CLEANUP
 o Completely remove the (mostly-removed) obsolete thread functions (3808168)
 o Rename regress_pthread.c to regress_thread.c (041989f)
 o Make defer-internal.h use lock macros, not direct calls to lock fns (5218d2a)

DOCUMENTATION
 o Document that DNS_NO_SEARCH is an obsolete alias for DNS_QUERY_NO_SEARCH (33200e7)
 o Update the whatsnew-2.0.txt document (4991669)



Changes in 2.0.6-rc (6 Aug 2010):
 [Autogenerated from the Git log, sorted by hand.]
DOCUMENTATION
 o Document a change in the semantics of event_get_struct_event_size() (e21f5d1)
 o Add a comment to describe our plan for library versioning (9659ece)
 o Fix sentence fragment in docs for event_get_struct_event_size() (7b259b6)

NEW FEATURES AND INTERFACE CHANGES
 o Remove the obsolete evthread interfaces (c5bab56)
 o Let evhttp_send_error infer the right error reasons (3990669)
 o Add a function to retrieve the other side of a bufferevent pair (17a8e2d)
 o Add bufferevent_lock()/bufferevent_unlock() (215e629)
 o Stop asserting when asked for a (unsupported) TCP dns port. Just return NULL. (7e87a59)
 o Replace (unused,always 0) is_tcp argument to evdns_add_server_port*() with flags (e1c1167)
 o Constify a couple of arguments to evdns_server_request_add_*_reply (cc2379d)
 o Add an interface to expose min_share in ratelimiting groups (6ae53d6)

BUGFIXES
 o Avoid event_del on uninitialized event in event_base_free (6d19510)
 o Add some missing includes to fix Linux build again (75701e8)
 o Avoid close of uninitialized socket in evbuffer unit test (bda21e7)
 o Correctly recognize .255 addresses as link-local when looking for interfaces (8c3452b)
 o If no evdns request can be launched, return NULL, not a handle (b14f151)
 o Use generic win32 interfaces, not ASCII-only ones, where possible. (899b0a3)
 o Fix the default HTTP error template (06bd056 Felix Nawothnig)
 o Close the file in evutil_read_file whether there's an error or not. (0798dd1 Pierre Phaneuf)
 o Fix possible nullptr dereference in evhttp_send_reply_end() (29b2e23 Felix Nawothnig)
 o never let bufferevent_rlim functions return negative (0859870)
 o Make sample/hello_world work on windows (d89fdba)
 o Fix a deadlock related to event-base notification.  Diagnosed by Zhou Li, Avi Bab, and Scott Lamb. (17522d2)
 o Possible fix to 100% cpu usage with epoll and openssl (cf249e7 Mike Smellie)
 o Don't race when calling event_active/event_add on a running signal event (fc5e0a2)
 o Suppress a spurious EPERM warning in epoll.c (e73cbde)
 o Fix wrong size calculation of iovec buffers when exact=1 (65abdc2 niks)
 o Change bufferevent_openssl::do_write so it doesn't call SSL_write with a 0 length buffer (c991317 Mike Smellie)
 o Fixed compilation of sample/le-proxy.c on win32 (13b912e Trond Norbye)
 o Fix rate-limit calculation on openssl bufferevents. (009f300)
 o Remember to initialize timeout events for bufferevent_async (de1f5d6 Christopher Davis)

BUILD AND DISTRIBUTION CHANGES
 o Test the unlocked-deferred callback case of bufferevents (dfb75ab)
 o Remove the now-unusable EVTHREAD_LOCK/UNLOCK constants (fdfc3fc)
 o Use -Wlogical-op on gcc 4.5 or higher (d14bb92)
 o Add the libtool-generated /m4/* stuff to .gitignore (c21c663)
 o Remove some automake-generated files from version control. (9b14911)
 o Have autogen.sh pass --force-missing to automake (8a44062)
 o Set library version for libevent_pthreads correctly (b2d7440)
 o Really only add libevent_core.la to LIBADD on mingw (1425003 Sebastian Hahn)
 o Build more cleanly with NetBSDs that dislike toupper(char) (42a8c71)
 o Fix unit tests with -DUSE_DEBUG enabled (28f31a4)
 o Fix evdns build with -DUNICODE (5fa30d2)
 o Move event-config.h to include/event2 (ec347b9)

TESTING
 o Add options to test-ratelim.c to check its results (2b44dcc)
 o Make test-ratelim clean up after itself better. (b5bfc44)
 o Remove the now-obsolete setup_test() and cleanup_test() functions (e73f1d7)
 o Remove all non-error prints from test/regress.c (8bc1e3d)
 o Make test.sh exit with nonzero status if tests fail (faf2a04)
 o Have the unit tests report errors from test.sh (3689bd2)
 o Fix logic in correcting high values from FIONREAD (3467f2f)
 o Add test for behavior on remote socket close (44d57ee)
 o Unit test for event_get_struct_event_size() (7510aac)
 o Make test/test.sh call test-changelist (7c92691)
 o Fix badly-behaved subtest of dns/bufferevent_connect_hostname (840a72f Joachim Bauch)
 o Add option to test-ratelim to test min_share (42f6b62)
 o Fix an assertion bug in test-ratelim (b2c6202)
 o Make tests quieter on local dns resolver failure (e996b3d)
 o Increase the tolerance in our unit tests for sloppy clocks. (170ffd2)
 o Use AF_INET socketpair to test sendfile on Solaris (9b60209)
 o Make test-changelist count cpu usage right on win32 (ea1ea3d)

INTERNALS, PERFORMANCE, AND CODE CLEANUPS
 o Mark the event_err() functions as __attribute__((noreturn)) (33bbbed)
 o Do not check that event_base is set in EVBASE_ACQUIRE_LOCK (218a3c3)
 o Replace (safe) use of strcpy with memcpy to appease OpenBSD (caca2f4)
 o Remove some dead assignments (47c5dfb)
 o Fix a pedantic gcc 4.4 warning in event2/event.h (276e7ee)
 o Drain th_notify_fd[0] more bytes at a time. (a5bc15b)
 o Tidy up the code in evthread_make_base_notifiable a little (61e1eee)
 o Pass flags to fcntl(F_SETFL) and fcntl(F_SETFD) as int, not long (7c2dea1)
 o Remove unused variables in test/test-changelist.c (b00d4c0)
 o Fix whitespace. (cb927a5)
 o Improve error message for failed epoll to make debugging easier. (9e725f7)
 o Turn our socketpair() replacement into its own function (57b30cd)



Changes in 2.0.5-beta (10 May 2010):
 [Autogenerated from the Git log, sorted by hand.]
DOCUMENTATION
 o Update all our copyright notices to say "2010" (17efc1c)
 o Add Christopher Clark and Maxim Yegorushkin to the LICENSE file (38b7b57)
 o Clarify Christopher Clark's status as writer of original ht code. (78772c3)
 o Try to comment some of the event code more (cdd4c49)
 o Add a few more evmap/changelist comments (c247adc)
 o Add a comment to explain why evdns_request is now separte from request (ceefbe8)
 o Document evutil_secure_rng_init() and evutil_secure_rng_add_bytes() (a5bf43a)
 o Stop distributing and installing manpages: they were too inaccurate (7731ec8)

NEW FEATURES AND INTERFACE CHANGES
 o Remove signal_assign() and signal_new() macros. (2fac0f7)
 o Make evdns use the regular logging system by default (b2f2be6)
 o Allow evbuffer_read() to split across more than 2 iovecs (e470ad3)
 o Functions to manipulate existing rate limiting groups. (ee41aca)
 o Functions to track the total bytes sent over a rate limit group. (fb366c1)
 o Detect and refuse reentrant event_base_loop() calls (b557b17)
 o Limit the maximum number of events on each socket to 65535 (819f949)
 o Add evbuffer_copyout to copy data from an evbuffer without draining (eb86c8c)
 o Expose the request and reply members of rpc_req_generic() (07edf78 Shuo Chen)
 o Add void* arguments to request_new and reply_new evrpc hooks (755fbf1 Shuo Chen)
 o Seed the RNG using sysctl() as well as /dev/urandom (71fc3eb)
 o Make evutil_secure_rng_init() work even with builtin arc4random (f980716)
 o Report DNS error when lookup fails during bufferevent_socket_connect_hostname. (0ef4070 Christopher Davis)
 o Release locks on bufferevents while executing callbacks (a5208fe Joachim Bauch) o Make debug mode catch mixed ET and non-ET events on an fd (cb67074)
 o Catch attempts to enable debug_mode too late (9ecf0d4)
 o Refuse null keys in evhttp_parse_query() (953e229 Frank Denis)

BUGFIXES
 o Avoid a spurious close(-1) on Linux (70a44b6)
 o Do not close(-1) when freeing an uninitialized socket bufferevent (b34abf3)
 o Free evdns_base->req_heads on evdns_base_free (859af67)
 o Avoid an (untriggerable so far) crash bug in bufferevent_free() (0cf1431)
 o Set mem_offset for every bufferevent type (657d1b6)
 o Fix infrequent memory leak in bufferevent_init_common(). (8398641 Jardel Weyrich)
 o Make evutil_signal_active() match declaration. (e1e703d Patrick Galbraith)
 o Fix minheap code to use replacement malloc functions (a527618)
 o Fix a free(NULL) in minheap-internal.h (6f20492)
 o Fix critical bug in evbuffer_write when writev is not available (cda56ab)
 o Make the no_iovecs case of write_atmost compile (8e227b0)
 o Fix a memory leak when appending/prepending to a buffer with unused space. (45068a3)
 o Clean up a mistake in pointer manipulation in evbuffer_remove (28bfed4 Christopher Davis)
 o Always round up when there's a fractional number of msecs. (8f9e60c Christopher Davis)
 o Fix compiler warnings under WIN32 (d469c50 Giuseppe Scrivano)
 o Clean up properly when adding a signal handler fails. (b84b598 Gilad Benjamini) o Ensure that evdns_request is a persistent handle. (15bb82d Christopher Davis)
 o Free search state when finished searching to avoid an infinite loop. (a625840 Christopher Davis)
 o Assert for valid requests as necessary. (67072f3 Christopher Davis)
 o do not leak the request object on persistent connections (9d8edf2)
 o Make evdns logging threadsafe (b1c7950)
 o Fix a couple of bugs in the BSD sysctl arc4seed logic (a47a4b7)
 o Remove one last bug in last_with_datap logic. Found with valgrind (d49b92a)
 o fix a leak when unpausing evrpc requests (94ee125)
 o Fix a memory leak when unmarshalling RPC object arrays (f6ab2a2)
 o Fix compilation when openssl support is disabled (40c301b)
 o Allow empty reason line in HTTP status (739e688 Pierre Phaneuf)
 o Fix a compile warning introduced in 739e688 (bd1ed5f Sebastian Hahn)
 o Fix nonstandard TAILQ_FOREACH_REVERSE() definition (71afc52 Frank Denis)
 o Try /proc on Linux as entropy fallback; use sysctl as last resort (20fda29)
 o Fix symbol conflict between mm_*() macros and libmm (99e50e9)
 o Fix some crazy macro mistakes in arc4random.c (90d4225)
 o Make evbuffer_add_file() work on windows (dcdae6b)
 o Fix unused-variable warning when building with threads disabled (ad811cd)
 o Numerous opensolaris compilation fixes (c44de06)
 o Fix getaddrinfo with protocol unset on Solaris 9. Found by Dagobert Michelsen (2cf2a28)
 o Fix another nasty solaris getaddrinfo() behavior (3557071)
 o Define _REENTRANT as needed on Solaris, elsewhere (c1cd32a)
 o Fix some autoconf issues on OpenBSD (7c519df)

BUILD AND DISTRIBUTION CHANGES
 o Distribute libevent.pc.in, not libevent.pc (22aff04)
 o Avoid errors in evutil.c when building with _UNICODE defined (b677032 Brodie Thiesfield)
 o Avoid errors in http.c when building with VC 2003 .NET (13e4f3b Brodie Thiesfield)
 o Support the standard 'make check' target in place of 'make verify' (426c8fb)
 o Remove redundant stuff from EXTRA_DIST (b660edf)
 o Switch to using AM conditionals in place of AC_LIBOBJ (2e898f5)
 o Remove an orphaned RELEASE flag in Makefile.am (0794b0d)
 o Give a better warning for bad automake versions. (77c917d)
 o Use dist_bin_SCRIPTS, not EXTRA_DIST, to distribute scripts (9eb2fd7)
 o Never test for select() on windows (3eb044d Trond Norbye)
 o Do not inhibit automake dependencies generation (10c4c90 Giuseppe Scrivano)
 o Create shared libraries under Windows (3cbca86 Giuseppe Scrivano)
 o Add ctags/etags files to .gitignore (0861d17)
 o Only specify -no-undefined on mingw (25433b9)
 o Only add libevent_core.la to LIBADD on mingw (fdc6297)

TESTING
 o Get bench_http to work on Windows; add a switch to enable IOCP. (4ac38a5 Christopher Davis)
 o VC has no getopt(), so do without in bench_http. (1273d2f Christopher Davis)
 o Fix an obnoxious typo in the bufferevent_timeout_filter test (0d047c3)
 o Fix a write of uninitialized RAM in regression tests (68dc742)
 o Fix some memory leaks in the unit tests (274a7bd)
 o Make 'main/many_events' test 70 fds, not 64. (33874b0)
 o Unit-test every evbuffer_add_file() implementation. (06a4443)
 o Add more unit tests for evbuffer_expand (8c83e99)
 o Test another case of evbuffer_prepend (1234b95)
 o Fix a possible double-free bug in SSL bufferevents with CLOSE_ON_FREE (7501895) o Add dns/search_cancel unit test. (39b870b Christopher Davis)
 o Make http_base_test stop leaking an event_base. (96730d3)
 o Detect broken unsetenv at unit-test runtime (f37cd4c)
 o Implement regress_make_tempfile on win32 to test evbuffer_add_file (b4f12a1)
 o add more (currently skipped) add_file tests on win32 (05de45d)
 o Fix bench_http build on win32. (384d124)
 o Make unit test for add_file able to tell "error" from "done" (88a543f)
 o Make test for bufferevent_connect_hostname system-neutral (f89168e)
 o Make test.sh support mingw/msys on win32 (0ee6f6c)
 o Fix test.sh on freebsd (3d9e05b)

INTERNALS, PERFORMANCE, AND AND CODE CLEANUPS
 o Improve the speed of evbuffer_readln() (cc1600a)
 o more whitespace normalization (2c2618d)
 o Revise evbuffer to add last_with_data (2a6d2a1)
 o Use last_with_data in place of previous_to_last (c8ac57f)
 o Remove previous_to_last from evbuffer (6f47bd1)
 o Fix last_with_data compilation on windows (1e7b986)
 o Add some glass-box tests for the last_with_data code. (17da042)
 o Improve robustness for refcounting (f1bc125)
 o Remove a needless min_heap_shift_up_() call (7204b91)
 o Increase MIN_BUFFER_SIZE to 512 (1024 on 64-bit) (2014ae4)
 o Do not use evbuffer_expand() to add the first chain to a buffer (5c0ebb3)
 o Make evbuffer_prepend handle empty buffers better (c87272b)
 o Replace last_with_data with a slightly smarter version (b7442f8)
 o Turn the increasingly complex *_CHAIN() macros into functions (96865c4)
 o Rewrite evbuffer_expand and its users (d5ebcf3)
 o Add evutil_tv_to_msec for safe conversion of timevals to milliseconds. (850c3ff Christopher Davis)
 o Initialize last_with_datap correctly in evbuffer_overlapped (a0983b6)
 o Replace EVUTIL_CLOSESOCKET macro with a function (899c1dc Sebastian Sjöberg)
 o Move domain search state to evdns_request. (beaa14a Christopher Davis)
 o Remove redundant checks for lock!=NULL before calling EVLOCK_LOCK (50ec59f)
 o Rename current_base symbol to event_global_current_base_ (c16e684)
 o Fix whitespace in evutil.c (935e150)
 o Replace users of "int fd" with "evutil_socket_t fd" in portable code (c7cf6f0)



Changes in 2.0.4-alpha (28 Feb 2010):
 [Autogenerated from the Git log, sorted by hand.]
DOCUMENTATION
 o Add stub header for 2.0.4-alpha changelog. (94d0065)
 o Improve the README with more information and links. (0b42726)
 o Add more people who wrote patches to the acknowledgments (0af10d5)
 o Add a warning about the use of event_initialized. (f32b575)
 o Add a LICENSE file so people can find our license easily (7067006)
 o Add a new "hello world" sample program (becb9f9)
 o Clarify status of example programs (d60a1bd)
 o Update time-test.c to use event2 (f4190bf)
 o Add the arc4random.c license to the LICENSE file. (e15e1e9)

NEW FEATURES AND INTERFACE CHANGES
 o Improved optional lock debugging. (0cd3bb9)
 o Rate-limiting for bufferevents; group and individual limits are supported. (737c9cd)
 o Testing code for bufferevent rate-limiting. (f0c0124)
 o Make the initial nameserver probe timeout configurable. (1e56a32)
 o Revise the locking API: deprecate the old locking callbacks and add trylock. (347952f)
 o Do not make bufferevent_setfd implicitly disable EV_READ and EV_WRITE. (8274379)
 o Do not ignore bufferevent_enable(EV_READ) before bufferevent_connect(). (4a5b534)
 o Introduced evutil_make_socket_closeonexec() to preserve fd flags for F_SETFD. (d0939d2 Jardel Weyrich)
 o evdns_getaddrinfo() now supports the /etc/hosts file. (72dd666)
 o Look at the proper /etc/hosts file on windows. (66c02c7)
 o Allow http connections to use evdns for hostname looksups. (c698b77)
 o Changelist code to defer event changes until just before dispatch (27308aa)
 o do not use a function to assign the evdns base; instead assign it via evhttp_connection_base_new() which is a new function introduced in 2.0 (5032e52)
 o Functions to access more fields of struct event. (0683950)
 o Make kqueue use changelists. (45e5ae3)
 o Remove kqueue->pend_changes. (3225dfb)
 o Minimize epoll_ctl calls by using changelist (c8c6a89)
 o Add support for a "debug mode" to try to catch common errors. (cd17c3a)
 o Note a missing ratelim function (361da8f)
 o Add ev_[u]intptr_t to include/event2/util.h (1fa4c81)
 o const-ify a few more functions in event.h (d38a7a1)
 o Deprecate EVENT_FD and EVENT_SIGNAL. (f6b2694)
 o Remove EVUTIL_CHECK_FMT. (6c21c89)
 o Add EV_*_MAX macros to event2/util.h to expose limits for ev_* types. (aba1fff) o Functions to view and manipulate rate-limiting buckets. (85047a6)
 o Add the rest of the integer limits, and add a test for them. (60742d5)
 o Remove the 'flags' argument from evdns_base_set_option() (1dd7e6d)
 o Add an arc4random implementation for use by evdns (d4de062)
 o Use off_t for the length parameter of evbuffer_add_file (3fe60fd)
 o Construct Windows locks using InitializeCriticalSectionAndSpinCount (32c6f1b)
 o Expose view of current rate limit as constrained by group limit (162ce8a)
 o Provide consistent, tested semantics for bufferevent timeouts (d328829)

BUGFIXES AND TESTS
 o Tolerate code that returns from a fatal_cb. (91fe23f)
 o Parenthesize macro arguments more aggressively (07e9e9b)
 o Fix memory-leak of signal handler array with kqueue. (e1ffbb8)
 o Stop passing EVTHREAD_READ and EVTHREAD_WRITE to non-rw locks. (76cd2b7)
 o Fix two use-after-free bugs in unit tests spoted by lock debugging (d84d838)
 o Fix a locking bug in event_base_loop() (da1718b)
 o Fix an evdns lock violation. (2df1f82 Zhuang Yuyao)
 o Valgrind fix: Clear struct kevent before checking for OSX bug. (56771a3 William Ahern)
 o Fix up evthread compilation on windows (bd6f1ba Roman Puls)
 o Fix regress_iocp.c usage of old lock allocation macros. (31687b4 unknown)
 o Update nmake makefile to build evthread.c (b62d979 unknown)
 o Fix a crash when reading badly formatted resolve.conf; from Yasuoka Masahiko (6c7c579 Yasuoka Masahiko)
 o Fix a snow leopard compile warning in the unit tests. (7ae9445)
 o Fix compile on Snow Leopard with gcc warnings enabled (70cdfe4 Sebastian Hahn)
 o Only define _GNU_SOURCE if it is not already defined. (ea6b1df Joachim Bauch)
 o Update sample/signal-test.c to use newer APIs and not leak. (f6430ac Evan Jones)
 o Fix a segfault when writing a very fragmented evbuffer onto an SSL (a6adeca Joachim Bauch)
 o Fix a segfault when freeing SSL bufferevents in an unusual order (a773df5 Joachim Bauch)
 o Drop install-sh from our git repo: a mismatched version could break "make dist" (6799527)
 o Set all instances of the version number correctly. (5a112d3)
 o Fix a few locking issues on windows. (c51bb3c unknown)
 o Use evutil_socket_t, not int, when logging socket errors. (292467c)
 o Fix up behavior of never-defered callbacks a little (390e056)
 o Replace some cases of uint32_t with ev_uint32_t. (a47d88d)
 o Fix compilation of devpoll.c by adding missing thread includes. (fee2c77 Dagobert Michelsen)
 o Make evutil_make_socket_nonblocking() leave any other flags alone. (4c8b7cd Jardel Weyrich)
 o Fix an fd leak in evconnlistener_new_bind(). (24fb502 Jardel Weyrich)
 o Fix a bogus free in evutil_new_addrinfo() (0d64051 Jardel Weyrich)
 o Adjusted fcntl() retval comparison on evutil_make_socket_nonblocking(). (4df7dbc Jardel Weyrich)
 o Fix the code that allowed DNS options to not end with : (ee4953f)
 o Fix crash bugs when a bufferevent's eventcb is not set. (2e8eeea)
 o Fix test-ratelim compilation on Linux. (885b427)
 o Fix compilation of rate-limiting code on win32. (165d30e)
 o Eradicated the last free() call. Let mm_free() take care of deallocation. (0546ce1 Jardel Weyrich)
 o Fix byte counts when mixing deferred and non-deferred evbuffer callbacks. (29151e6)
 o Fixed a memory leak on windows threads implementation. The CRITICAL_SECTION was not being free'd in evthread_win32_lock_free(). (2f33e00 Jardel Weyrich)
 o Fixed a fd leak in start_accepting(), plus cosmetic changes (4367a33 Jardel Weyrich)
 o Improved error handling in evconnlistener_new_async(). Also keeping the fd open because it is not opened by this function, so the caller is responsible for closing it. Additionally, since evconnlistener_new_bind() creates a socket and passes it to the function above, it required error checking to close the same socket. (fec66f9 Jardel Weyrich)
 o Don't use a bind address for nameservers on loopback (8d4aaf9)
 o Fix compilation of rate-limit code when threading support is disabled (97a8c79)
 o Detect setenv/unsetenv; skip main/base_environ test if we can't fake them. (7296971)
 o Check more internal event_add() calls for failure (ff3f6cd)
 o Fix windows and msvc build (5c7a7bc)
 o Call event_debug_unassign on internal events (a19b4a0)
 o Try to fix a warning in hash_debug_entry (137f2c6)
 o Fix a dumb typo in ev_intptr_t definitions. (27c9a40)
 o do not fail while sending on http connections the client closed. (93d7369)
 o make evhttp_send() safe against terminated connections, too (3978180)
 o Make Libevent 1.4.12 build on win32 with Unicode enabled. (000a33e Brodie Thiesfield)
 o Fix some additional -DUNICODE issues on win32. (a7a9431)
 o Add a check to make soure our EVUTIL_AI flags do not conflict with the native ones (c18490e)
 o Always use our own gai_strerror() replacement. (6810bdb)
 o Make RNG work when we have arc4random() but not arc4random_buf() (4ec8fea)
 o validate close cb on server when client connection closes (2f782af)
 o Fix two unlocked reads in evbuffer. (7116bf2)
 o When working without a current event base, don't try to use IOCP listeners (cb52838)
 o Fix getpid() usage on Windows (ff2a134)
 o Add a unit test for secure rng. (48a29b6)
 o Add some headers to fix freebsd compilation (b72be50)
 o When connect() succeeds immediately, don't invoke the callback immediately. (7515de9)
 o Suspend read/write on bufferevents during hostname lookup (db08f64)
 o Make bufferevent_free() clear all callbacks immediately. (b2fbeb3)
 o Fix some race conditions in persistent events and event_reinit (e2642f0)
 o Fix a bug in resetting timeouts on persistent events when IO triggers. (38ec0a7)
 o Add a test for timeouts on filtering bufferevents. (c02bfe1)
 o Add test for periodic timers that get activated for other reasons (8fcb7a1)
 o Use new timeval diff comparison function in bufferevent test (f3dfe46)
 o Delete stack-alloced event in new unit test before returning. (7ffd387)
 o Fix mingw compilation (23170a6)
 o Try to define a sane _EVENT_SIZEOF_SIZE_T for msvc compilation (1e14f82)
 o Fix arc4random compilation on MSVC. (98edb89)
 o deal with connect() failing immediately (7bc48bf)
 o Small cleanups on freebsd-connect-refused patch. (57b7248)

BUILD AND DISTRIBUTION CHANGES
 o Remove the contents of WIN32-Prj as unmaintained. (c69d5a5)
 o Allow the user to redirect the verbose output of test/test.sh to a file (c382de6)
 o Allow test.sh to be run as ./test/test.sh (7dfbe94)
 o Never believe that we have pthreads on win32, even if gcc thinks we do. (78ed097)
 o Make it compile under gcc --std=c89. (e2ca403)
 o Fix a number of warnings from gcc -pedantic (918e9c5)
 o Add the msvc-generated .lib files to .gitignore. (e244a2e)
 o Add the "compile" script to gitignore. (1ba6bed)

INTERNALS AND CODE CLEANUPS
 o Add a .gitignore file. (ba34071)
 o New EVTHREAD_TRY_LOCK function to try to grab a lock. (689fc09)
 o Add the abilitity to mark some buffer callbacks as never-deferred. (438f9ed)
 o Refactor our 'suspend operation' logic on bufferevents. (0d744aa)
 o Simplify the read high-watermark checking. (5846bf6)
 o Improve readability of evutil_unparse_protoname() (5a43df8 Jardel Weyrich)
 o Expose our cached gettimeofday value with a new interface (47854a8)
 o Whitespace fixes in test.sh (0b151a9)
 o Enable branch-prediction hints with EVUTIL_UNLIKELY. (eaaf27f)
 o Refactor code from evdns into a new internal "read a file" function. (0f7144f)
 o Comestic changes in evconnlistener_new(), new_accepting_socket(), accepted_socket_invoke_user_cb() and iocp_listener_enable(). (510ab6b Jardel Weyrich)
 o Add unit-test for bad_request bug fixed in 1.4 recently. (6cc79c6 Pavel Plesov) o Add a comment on evthread_enable_lock_debuging. (b9f43b2)
 o Fix test.sh on shells without echo -n (94131e9)
 o More unit tests for getaddrinfo_async: v4timeout and cancel. (a334b31)
 o Make http use evconnlistener. (ec34533)
 o move dns utility functions into a separate file so that we can use them for http testing (b822639)
 o add a test for evhttp_connection_base_new with a dns_base (26714ca)
 o forgot to add void to test function (78a50fe)
 o Add a forgotten header (changelist-internal.h) (4b9f307)
 o Remove some commented-out code in evutil (26e1b6f)
 o Remove a needless include of rpc_compat.h (70a4a3e)
 o Use less memory for each entry in a hashtable (a66e947)
 o Try to untangle the logic in server_port_flush(). (439aea0)
 o Use ev_[u]intptr_t types in place of [u]intptr_t (cef61a2)
 o Reduce windows header includes in our own headers. (da6135e)
 o clean up terminate_chunked test (e8a9782)
 o Increment the submicro version number. (63e868e)
 o Update event-config.h version number to match configure.in (aae7db5)
 o Clean up formatting: Disallow space-before-tab. (8fdf09c)
 o Clean up formatting: use tabs, not 8-spaces, to indent. (e5bbd40)
 o Clean up formatting: remove trailing spaces (e5cf987)
 o Clean up formatting: function/keyword spacing consistency. (4faeaea)



Changes in 2.0.3-alpha (20 Nov 2009):
 o Add a new code to support SSL/TLS on bufferevents, using the OpenSSL library (where available).
 o Fix a bug where we didn't allocate enough memory in event_get_supported_methods().
 o Avoid segfault during failed allocation of locked evdns_base. (Found by Rocco Carbone.)
 o Export new evutil_ascii_* functions to perform locale-independent character type operations.
 o Try to compile better with MSVC: patches from Brodie Thiesfield
 o New evconnlistener_get_fd function to expose a listener's associated socket.
 o Expose an ev_socklen_t type for consistent use across platforms.
 o Make bufferevent_socket_connect() work when the original fd was -1.
 o Fix a bug in bufferevent_socket_connect() when the connection succeeds too quickly.
 o Export an evutil_sockaddr_cmp() to compare to sockaddr objects for equality.
 o Add a bufferevent_get_enabled() to tell what a bufferevent has been configured to do.
 o Add an evbuffer_search_eol() function to locate the end of a line nondestructively.
 o Add an evbuffer_search_range() function to search a bounded range of a buffer.
 o Fix a rare crash bug in evdns.
 o Have bufferevent_socket_connect() with no arguments put a bufferevent into connecting mode.
 o Support sendfile on Solaris: patch from Caitlin Mercer.
 o New functions to explicitly reference a socket used by an evhttp object. Patches from David Reiss.
 o When we send a BEV_EVENT_CONNECTED to indicate connected status, we no longer invoke the write callback as well unless we actually wrote data too.
 o If the kernel tells us that there are a negative number of bytes to read from a socket, do not believe it.  Fixes bug 2841177; found by Alexander Pronchenkov.
 o Do not detect whether we have monotonic clock support every time a new event base is created: instead do it only once.  Patch taken from Chromium.
 o Do not allocate the maximum event queue for the epoll backend at startup.  Instead, start out accepting 32 events at a time, and double the queue's size when it seems that the OS is generating events faster than we're requesting them.  Saves up to 374K per epoll-based event_base.  Resolves bug 2839240.
 o Treat an event with a negative fd as valid but untriggerable by Libevent.  This is useful for applications that want to manually activate events.
 o Fix compilation on Android, which forgot to define fd_mask in its sys/select.h
 o Do not drop data from evbuffer when out of memory; reported by Jacek Masiulaniec
 o New event_base_got_exit() and event_base_got_break() functions to tell whether an event loop exited because of an event_base_loopexit() or an event_base_loopbreak().  Patch from Ka-Hing Cheung.
 o When adding or deleting an event from a non-main thread, only wake up the main thread when its behavior actually needs to change.
 o Fix some bugs when using the old evdns interfaces to initialize the evdns module.
 o Detect errors during bufferevent_connect().  Patch from Christopher Davis.
 o Fix compilation for listener.h for C++ - missing extern "C".  Patch from Ferenc Szalai.
 o Make the event_base_loop() family of functions respect thread-safety better.  This should clear up a few hard-to-debug race conditions.
 o Fix a bug when using a specialized memory allocator on win32.
 o Have the win32 select() backend label TCP-socket-connected events as EV_WRITE, not EV_READ.  This should bring it in line with the other backends, and improve portability.  Patch from Christopher Davis.
 o Stop using enums as arguments or return values when what we mean is a bitfield of enum values.  C++ doesn't believe that you can OR two enum values together and get another enum, and C++ takes its typing seriously.  Patch from Christopher Davis.
 o Add an API to replace all fatal calls to exit() with a user-provided panic function.
 o Replace all assert() calls with a variant that is aware of the user-provided logging and panic functions.
 o Add a return value to event_assign so that it can fail rather than asserting when the user gives it bad input.  event_set still dies on bad input.
 o The event_base_new() and event_base_new_with_config() functions now never call exit() on failure.  For backward "compatibility", event_init() still does, but more consistently.
 o Remove compat/sys/_time.h.  It interfered with system headers on HPUX, and its functionality has been subsumed by event2/util.h and util-internal.h.
 o Add a new bufferevent_socket_connect_hostname() to encapsulate the resolve-then-connect operation.
 o Build kqueue.c correctly on GNU/kFreeBSD platforms. Patch pulled upstream from Debian.
 o Alternative queue-based timeout algorithm for programs that use a large number of timeouts with the same value.
 o New event_base_config option to disable the timeval cache entirely.
 o Make EV_PERSIST timeouts more accurate: schedule the next event based on the scheduled time of the previous event, not based on the current time.
 o Allow http.c to handle cases where getaddrinfo returns an IPv6 address.  Patch from Ryan Phillips.
 o Fix a problem with excessive memory allocation when using multiple event priorities.
 o Default to using arc4random for DNS transaction IDs on systems that have it; from OpenBSD.
 o Never check the environment when we're running setuid or setgid; from OpenBSD.
 o Options passed to evdns_set_option() no longer need to end with a colon.
 o Add an evutil_getaddrinfo() function to clone getaddrinfo on platforms that don't have it.
 o Add an evdns_getaddrinfo() function to provide a nonblocking getaddrinfo using evdns, so programs can perform useful hostname lookup.
 o Finally expose the IOCP-based bufferevent backend.  It passes its unit tests, but probably still has some bugs remaining.  Code by Nick Mathewson and Christopher Davis.
 o Numerous other bugfixes.
 o On FreeBSD and other OSes, connect can return ECONREFUSED immediately; instead of failing the function call, pretend with faileld in the callback.
 o Fix a race condition in the pthreads test case; found by Nick Mathewson
 o Remove most calls to event_err() in http and deal with memory errors instead



Changes in 2.0.2-alpha (25 Jul 2009):
 o Add a new flag to bufferevents to make all callbacks automatically deferred.
 o Make evdns functionality locked, and automatically defer dns callbacks.
 o Fix a possible free(NULL) when freeing an event_base with no signals.
 o Add a flag to disable checking environment varibles when making an event_base
 o Disallow setting less than 1 priority.
 o Fix a bug when removing a timeout from the heap. [Patch from Marko Kreen]
 o Use signal.h, not sys/signal.h. [Patch from mmadia]
 o Try harder to build with certain older c99 compilers.
 o Make sure that an event_config's flags field is always initialized to 0. [Bug report from Victor Goya]
 o Avoid data corruption when reading data entirely into the second-to-last chain of an evbuffer. [Bug report from Victor Goya]
 o Make sendfile work on FreeBSD
 o Do not use vararg macros for accessing evrpc structures; this is not backwards compatible, but we did not promise any backwards compatibility for the rpc code.
 o Actually define the event_config_set_flag() function.
 o Try harder to compile with Visual C++.
 o Move event_set() and its allies to event2/event_compat.h where they belong.
 o Remove the event_gotsig code, which has long been deprecated and unused.
 o Add an event_get_base() function to return the base assigned to an event.
 o New function to automate connecting on a socket-based bufferevent.
 o New functions to automate listening for incoming TCP connections.
 o Do case-insensitive checks with a locale-independent comparison function.
 o Rename the evbuffercb and everrorcb callbacks to bufferevent_data_cb and bufferevent_event_cb respectively.  The old names are available in bufferevent_compat.h.
 o Rename the EVBUFFER_* codes used by bufferevent event callbacks to BEV_EVENT_*, to avoid namespace collision with evbuffer flags.  The old names are available in bufferevent_compat.h.
 o Move the EVBUFFER_INPUT and EVBUFFER_OUTPUT macros to bufferevent_compat.h
 o Add a bufferevent_getfd() function to mirror bufferevent_setfd()
 o Make bufferevent_setfd() return an error code if the operation is not successful.
 o Shave 22 bytes off struct event on 32-bit platforms by shrinking and re-ordering fields.  The savings on 64-bit platforms is likely higher.
 o Cap the maximum number of priorities at 256.
 o Change the semantics of evbuffer_cb_set_flags() to be set-flag only; add a new evbuffer_cb_clear_flags() to remove set flags.
 o Change the interface of evbuffer_add_reference so that the cleanup callback gets more information
 o Revise the new evbuffer_reserve_space/evbuffer_commit_space() interfaces so that you can use them without causing extraneous copies or leaving gaps in the evbuffer.
 o Add a new evbuffer_peek() interface to inspect data in an evbuffer without removing it.
 o Fix a deadlock when suspending reads in a bufferevent due to a full buffer. (Spotted by Joachim Bauch.)
 o Fix a memory error when freeing a thread-enabled event base with registered events. (Spotted by Joachim Bauch.)
 o Try to contain degree of failure when running on a win32 version so heavily firewalled that we can't fake a socketpair.
 o Activate fd events in a pseudorandom order with O(N) backends, so that we don't systematically favor low fds (select) or earlier-added fds (poll, win32).
 o Replace some read()/write() instances with send()/recv() to work properly on win32.
 o Set truncated flag correctly in evdns server replies.
 o Raise RpcGenError in event_rpcgen.py; from jmanison and Zack Weinberg
 o Fix preamble of rpcgen-generated files to rely on event2 includes; based on work by jmansion; patch from Zack Weinberg.
 o Allow specifying the output filename for rpcgen; based on work by jmansion; patch from Zack Weinberg.
 o Allow C identifiers as struct names; allow multiple comments in .rpc files; from Zack Weinberg
 o Mitigate a race condition when using socket bufferevents in multiple threads.
 o Use AC_SEARCH_LIBS, not AC_CHECK_LIB to avoid needless library use.
 o Do not allow event_del(ev) to return while that event's callback is executing in another thread.  This fixes a nasty race condition.
 o event_get_supported_methods() now lists methods that have been disabled with the EVENT_NO* environment options.
 o Rename encode_int[64] to evtag_encode_int[64] to avoid polluting the global namespace.  The old method names are still available as macros in event2/tag_compat.h.



Changes in 2.0.1-alpha (17 Apr 2009):
 o free minheap on event_base_free(); from Christopher Layne
 o debug cleanups in signal.c; from Christopher Layne
 o provide event_base_new() that does not set the current_base global
 o bufferevent_write now uses a const source argument; report from Charles Kerr
 o improve documentation on event_base_loopexit; patch from Scott Lamb
 o New function, event_{base_}loopbreak.  Like event_loopexit, it makes an event loop stop executing and return.  Unlike event_loopexit, it keeps subsequent pending events from getting executed.  Patch from Scott Lamb
 o Check return value of event_add in signal.c
 o provide event_reinit() to reintialize an event_base after fork
 o New function event_set_mem_functinons.  It allows the user to give libevent replacement functions to use for memory management in place of malloc(), free(), etc.  This should be generally useful for memory instrumentation, specialized allocators, and so on.
 o The kqueue implementation now catches signals that are raised after event_add() is called but before the event_loop() call.  This makes it match the other implementations.
 o The kqueue implementation now restores original signal handlers correctly when its signal events are removed.
 o Check return value of event_add in signal.c
 o Add a more powerful evbuffer_readln as a replacement for evbuffer_readline.  The new function handles more newline styles, and is more useful with buffers that may contain a nul characters.
 o Do not mangle socket handles on 64-bit windows.
 o The configure script now takes an --enable-gcc-warnigns option that turns on many optional gcc warnings.  (Nick has been building with these for a while, but they might be useful to other developers.)
 o move EV_PERSIST handling out of the event backends
 o small improvements to evhttp documentation
 o always generate Date and Content-Length headers for HTTP/1.1 replies
 o set the correct event base for HTTP close events
 o When building with GCC, use the "format" attribute to verify type correctness of calls to printf-like functions.
 o Rewrite win32.c backend to be O(n lg n) rather than O(n^2).
 o Removed obsoleted recalc code
 o support for 32-bit tag numbers in rpc structures; this is wire compatible, but changes the API slightly.
 o pull setters/getters out of RPC structures into a base class to which we just need to store a pointer; this reduces the memory footprint of these structures.
 o prefix {encode,decode}_tag functions with evtag to avoid collisions
 o fix a bug with event_rpcgen for integers
 o Correctly handle DNS replies with no answers set (Fixes bug 1846282)
 o add -Wstrict-aliasing to warnings and more cleanup
 o removed linger from http server socket; reported by Ilya Martynov
 o event_rpcgen now allows creating integer arrays
 o support string arrays in event_rpcgen
 o change evrpc hooking to allow pausing of RPCs; this will make it possible for the hook to do some meaning ful work; this is not backwards compatible.
 o allow an http request callback to take ownership of a request structure
 o allow association of meta data with RPC requests for hook processing
 o associate more context for hooks to query such as the connection object
 o remove pending timeouts on event_base_free()
 o also check EAGAIN for Solaris' event ports; from W.C.A. Wijngaards
 o devpoll and evport need reinit; tested by W.C.A Wijngaards
 o event_base_get_method; from Springande Ulv
 o Send CRLF after each chunk in HTTP output, for compliance with RFC2626.  Patch from "propanbutan".  Fixes bug 1894184.
 o Add a int64_t parsing function, with unit tests, so we can apply Scott Lamb's fix to allow large HTTP values.
 o Use a 64-bit field to hold HTTP content-lengths.  Patch from Scott Lamb.
 o Allow regression code to build even without Python installed
 o remove NDEBUG ifdefs from evdns.c
 o detect integer types properly on platforms without stdint.h
 o udpate documentation of event_loop and event_base_loop; from Tani Hosokawa.
 o simplify evbuffer by removing orig_buffer
 o do not insert event into list when evsel->add fails
 o add support for PUT/DELETE requests; from Josh Rotenberg
 o introduce evhttp_accept_socket() to accept from an already created socket
 o include Content-Length in reply for HTTP/1.0 requests with keep-alive
 o increase listen queue for http sockets to 128; if that is not enough the evhttp_accpet_socket() api can be used with a prepared socket.
 o Patch from Tani Hosokawa: make some functions in http.c threadsafe.
 o test support for PUT/DELETE requests; from Josh Rotenberg
 o rewrite of the evbuffer code to reduce memory copies
 o Some older Solaris versions demand that _REENTRANT be defined to get strtok_r(); do so.
 o Do not free the kqop file descriptor in other processes, also allow it to be 0; from Andrei Nigmatulin
 o Provide OpenSSL style support for multiple threads accessing the same event_base
 o make event_rpcgen.py generate code include event-config.h; reported by Sam Banks.
 o switch thread support so that locks get allocated as they are needed.
 o make event methods static so that they are not exported; from Andrei Nigmatulin
 o make RPC replies use application/octet-stream as mime type
 o do not delete uninitialized timeout event in evdns
 o Correct the documentation on buffer printf functions.
 o Don't warn on unimplemented epoll_create(): this isn't a problem, just a reason to fall back to poll or select.
 o Correctly handle timeouts larger than 35 minutes on Linux with epoll.c.  This is probably a kernel defect, but we'll have to support old kernels anyway even if it gets fixed.
 o Make name_from_addr() threadsafe in http.c
 o Add new thread-safe interfaces to evdns functions.
 o Make all event_tagging interfaces threadsafe.
 o Rename internal memory management functions.
 o New functions (event_assign, event_new, event_free) for use by apps that want to be safely threadsafe, or want to remain ignorant of the contents of struct event.
 o introduce bufferevent_read_buffer; allows reading without memory copy.
 o expose bufferevent_setwatermark via header files and fix high watermark on read
 o fix a bug in buffrevent read water marks and add a test for them
 o fix a bug in which bufferevent_write_buffer would not schedule a write event
 o provide bufferevent_input and bufferevent_output without requiring knowledge of the structure
 o introduce bufferevent_setcb and bufferevent_setfd to allow better manipulation of bufferevents
 o convert evhttp_connection to use bufferevents.
 o use libevent's internal timercmp on all platforms, to avoid bugs on old platforms where timercmp(a,b,<=) is buggy.
 o Remove the never-exported, never-used evhttp_hostportfile function.
 o Support input/output filters for bufferevents; somewhat similar to libio's model.  This will allow us to implement SSL, compression, etc, transparently to users of bufferevents such as the http layer.
 o allow connections to be removed from an rpc pool
 o add new evtimer_assign, signal_assign, evtimer_new, and signal_new functions to manipulate timer and signal events, analagous to the now-recommended event_assign and event_new
 o switch internal uses of event_set over to use event_assign.
 o introduce evbuffer_contiguous_space() api that tells a user how much data is available in the first buffer chain
 o introduce evbuffer_reserve_space() and evbuffer_commit_space() to make processing in filters more efficient.
 o reduce system calls for getting current time by caching it.
 o separate signal events from io events; making the code less complex.
 o support for periodic timeouts
 o support for virtual HTTP hosts.
 o turn event_initialized() into a function, and add function equivalents to EVENT_SIGNAL and EVENT_FD so that people don't need to include event_struct.h
 o Build test directory correctly with CPPFLAGS set.
 o Provide an API for retrieving the supported event mechanisms.
 o event_base_new_with_config() and corresponding config APIs.
 o migrate the evhttp header to event2/ but accessors are still missing.
 o deprecate timeout_* event functions by moving them to event_compat.h
 o Move	windows gettimeofday replacement into a new evutil_gettimeofday().
 o Make configure script work on IRIX.
 o provide a method for canceling ongoing http requests.
 o Make vsnprintf() returns consistent on win32.
 o Fix connection keep-alive behavior for HTTP/1.0
 o Fix use of freed memory in event_reinit; pointed out by Peter Postma
 o constify struct timeval * where possible
 o make event_get_supported_methods obey environment variables
 o support for edge-triggered events on epoll and kqueue backends: patch from Valery Kholodkov
 o support for selecting event backends by their features, and for querying the features of a backend.
 o change failing behavior of event_base_new_with_config: if a config is provided and no backend is selected, return NULL instead of aborting.
 o deliver partial data to request callbacks when chunked callback is set even if there is no chunking on the http level; allows cancelation of requests from within the chunked callback; from Scott Lamb.
 o allow min_heap_erase to be called on removed members; from liusifan.
 o Rename INPUT and OUTPUT to EVRPC_INPUT and EVRPC_OUTPUT.  Retain INPUT/OUTPUT aliases on on-win32 platforms for backwards compatibility.
 o Do not use SO_REUSEADDR when connecting
 o Support 64-bit integers in RPC structs
 o Correct handling of trailing headers in chunked replies; from Scott Lamb.
 o Support multi-line HTTP headers; based on a patch from Moshe Litvin
 o Reject negative Content-Length headers; anonymous bug report
 o Detect CLOCK_MONOTONIC at runtime for evdns; anonymous bug report	
 o Various HTTP correctness fixes from Scott Lamb
 o Fix a bug where deleting signals with the kqueue backend would cause subsequent adds to fail
 o Support multiple events listening on the same signal; make signals regular events that go on the same event queue; problem report by Alexander Drozdov.
 o Fix a problem with epoll() and reinit; problem report by Alexander Drozdov.	
 o Fix off-by-one errors in devpoll; from Ian Bell
 o Make event_add not change any state if it fails; reported by Ian Bell.
 o Fix a bug where headers arriving in multiple packets were not parsed; fix from Jiang Hong; test by me.
 o Match the query in DNS replies to the query in the request; from Vsevolod Stakhov.
 o Add new utility functions to correctly observe and log winsock errors.
 o Do not remove Accept-Encoding header
 o Clear the timer cache on entering the event loop; reported by Victor Chang
 o Only bind the socket on connect when a local address has been provided; reported by Alejo Sanchez
 o Allow setting of local port for evhttp connections to support millions of connections from a single system; from Richard Jones.
 o Clear the timer cache when leaving the event loop; reported by Robin Haberkorn
 o Fix a typo in setting the global event base; reported by lance.
 o Set the 0x20 bit on outgoing alphabetic characters in DNS requests randomly, and insist on a match in replies.  This helps resist DNS poisoning attacks.
 o Make the http connection close detection work properly with bufferevents and fix a potential memory leak associated with it.
 o Restructure the event backends so that they do not need to keep track of events themselves, as a side effect multiple events can use the same fd or signal.
 o Add generic implementations for parsing and emiting IPv6 addresses on platforms that do not have inet_ntop and/or inet_pton.
 o Allow DNS servers that have IPv6 addresses.
 o Add an evbuffer_write_atmost() function to write a limited number of bytes to an fd.
 o Refactor internal notify-main-thread logic to prefer eventfd to pipe, then pipe to socketpair, and only use socketpairs as a last resort.
 o Try harder to pack all evbuffer reads into as few chains as possible, using readv/WSARecv as appropriate.
 o New evthread_use_windows_threads() and evthread_use_pthreads() functions to set up the evthread callbacks with reasonable defaults.
 o Change the semantics of timeouts in conjunction with EV_PERSIST; timeouts in that case will now repeat until deleted.
 o sendfile, mmap and memory reference support for evbuffers.
 o New evutil_make_listen_socket_reuseable() to abstract SO_REUSEADDR.
 o New bind-to option to allow DNS clients to bind to an arbitrary port for outgoing requests.
 o evbuffers can now be "frozen" to prevent operations at one or both ends.
 o Bufferevents now notice external attempts to add data to an inbuf or remove it from an outbuf, and stop them.
 o Fix parsing of queries where the encoded queries contained \r, \n or +
 o Do not allow internal events to starve lower-priority events.

Changes in 1.4.0:
 o allow \r or \n individually to separate HTTP headers instead of the standard "\r\n"; from Charles Kerr.
 o demote most http warnings to debug messages
 o Fix Solaris compilation; from Magne Mahre
 o Add a "Date" header to HTTP responses, as required by HTTP 1.1.
 o Support specifying the local address of an evhttp_connection using set_local_address
 o Fix a memory leak in which failed HTTP connections whould not free the request object
 o Make adding of array members in event_rpcgen more efficient, but doubling memory allocation
 o Fix a memory leak in the DNS server
 o Fix compilation when DNS_USE_OPENSSL_FOR_ID is enabled
 o Fix buffer size and string generation in evdns_resolve_reverse_ipv6().
 o Respond to nonstandard DNS queries with "NOTIMPL" rather than by ignoring them.
 o In DNS responses, the CD flag should be preserved, not the TC flag.
 o Fix http.c to compile properly with USE_DEBUG; from Christopher Layne
 o Handle NULL timeouts correctly on Solaris; from Trond Norbye
 o Recalculate pending events properly when reallocating event array on Solaris; from Trond Norbye
 o Add Doxygen documentation to header files; from Mark Heily
 o Add a evdns_set_transaction_id_fn() function to override the default
   transaction ID generation code.
 o Add an evutil module (with header evutil.h) to implement our standard cross-platform hacks, on the theory that somebody else would like to use them too.
 o Fix signals implementation on windows.
 o Fix http module on windows to close sockets properly.
 o Make autogen.sh script run correctly on systems where /bin/sh isn't bash. (Patch from Trond Norbye, rewritten by Hagne Mahre and then Hannah Schroeter.)
 o Skip calling gettime() in timeout_process if we are not in fact waiting for any events. (Patch from Trond Norbye)
 o Make test subdirectory compile under mingw.
 o Fix win32 buffer.c behavior so that it is correct for sockets (which do not like ReadFile and WriteFile).
 o Make the test.sh script run unit tests for the evpoll method.
 o Make the entire evdns.h header enclosed in "extern C" as appropriate.
 o Fix implementation of strsep on platforms that lack it
 o Fix implementation of getaddrinfo on platforms that lack it; mainly, this will make Windows http.c work better.  Original patch by Lubomir Marinov.
 o Fix evport implementation: port_disassociate called on unassociated events resulting in bogus errors; more efficient memory management; from Trond Norbye and Prakash Sangappa
 o support for hooks on rpc input and output; can be used to implement rpc independent processing such as compression or authentication.
 o use a min heap instead of a red-black tree for timeouts; as a result finding the min is a O(1) operation now; from Maxim Yegorushkin
 o associate an event base with an rpc pool
 o added two additional libraries: libevent_core and libevent_extra in addition to the regular libevent.  libevent_core contains only the event core whereas libevent_extra contains dns, http and rpc support
 o Begin using libtool's library versioning support correctly.  If we don't mess up, this will more or less guarantee binaries linked against old versions of libevent continue working when we make changes to libevent that do not break backward compatibility.
 o Fix evhttp.h compilation when TAILQ_ENTRY is not defined.
 o Small code cleanups in epoll_dispatch().
 o Increase the maximum number of addresses read from a packet in evdns to 32.
 o Remove support for the rtsig method: it hasn't compiled for a while, and nobody seems to miss it very much.  Let us know if there's a good reason to put it back in.
 o Rename the "class" field in evdns_server_request to dns_question_class, so that it won't break compilation under C++.  Use a macro so that old code won't break.  Mark the macro as deprecated.
 o Fix DNS unit tests so that having a DNS server with broken IPv6 support is no longer cause for aborting the unit tests.
 o Make event_base_free() succeed even if there are pending non-internal events on a base.  This may still leak memory and fds, but at least it no longer crashes.
 o Post-process the config.h file into a new, installed event-config.h file that we can install, and whose macros will be safe to include in header files.
 o Remove the long-deprecated acconfig.h file.
 o Do not require #include <sys/types.h> before #include <event.h>.
 o Add new evutil_timer* functions to wrap (or replace) the regular timeval manipulation functions.
 o Fix many build issues when using the Microsoft C compiler.
 o Remove a bash-ism in autogen.sh
 o When calling event_del on a signal, restore the signal handler's previous value rather than setting it to SIG_DFL. Patch from Christopher Layne.
 o Make the logic for active events work better with internal events; patch from Christopher Layne.
 o We do not need to specially remove a timeout before calling event_del; patch from Christopher Layne.
