Austin Schuh | a273376 | 2015-09-06 17:46:50 -0700 | [diff] [blame] | 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 bufer 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 | |