diff options
-rw-r--r-- | Changes | 7 | ||||
-rw-r--r-- | ev.c | 19 | ||||
-rw-r--r-- | ev.pod | 15 |
3 files changed, 31 insertions, 10 deletions
@@ -1,5 +1,7 @@ Revision history for libev, a high-performance and full-featured event loop. + - event_base_loopexit should return 0 on success + (W.C.A. Wijngaards). - added linux eventfd support. - try to autodetect epoll and inotify support by libc header version if not using autoconf. @@ -7,8 +9,9 @@ Revision history for libev, a high-performance and full-featured event loop. - declare functions defined in ev.h as inline if C99 or gcc are available. - enable inlining with gcc versions 2 and 3. - - event_base_loopexit should return 0 on success - (W.C.A. Wijngaards). + - work around a bug in realloc on openbsd and darwin, + also makes the errornous valgrind complaints + go away (noted by various people). 3.2 Wed Apr 2 17:11:19 CEST 2008 - fix a 64 bit overflow issue in the select backend, @@ -362,7 +362,22 @@ syserr (const char *msg) } } -static void *(*alloc)(void *ptr, long size); +static void * +ev_realloc_emul (void *ptr, long size) +{ + /* some systems, notably openbsd and darwin, fail to properly + * implement realloc (x, 0) (as required by both ansi c-98 and + * the single unix specification, so work around them here. + */ + + if (size) + return realloc (ptr, size); + + free (ptr); + return 0; +} + +static void *(*alloc)(void *ptr, long size) = ev_realloc_emul; void ev_set_allocator (void *(*cb)(void *ptr, long size)) @@ -373,7 +388,7 @@ ev_set_allocator (void *(*cb)(void *ptr, long size)) inline_speed void * ev_realloc (void *ptr, long size) { - ptr = alloc ? alloc (ptr, size) : realloc (ptr, size); + ptr = alloc (ptr, size); if (!ptr && size) { @@ -198,18 +198,21 @@ See the description of C<ev_embed> watchers for more info. =item ev_set_allocator (void *(*cb)(void *ptr, long size)) Sets the allocation function to use (the prototype is similar - the -semantics is identical - to the realloc C function). It is used to -allocate and free memory (no surprises here). If it returns zero when -memory needs to be allocated, the library might abort or take some -potentially destructive action. The default is your system realloc -function. +semantics are identical to the C<realloc> C89/SuS/POSIX function). It is +used to allocate and free memory (no surprises here). If it returns zero +when memory needs to be allocated (C<size != 0>), the library might abort +or take some potentially destructive action. + +Since some systems (at least OpenBSD and Darwin) fail to implement +correct C<realloc> semantics, libev will use a wrapper around the system +C<realloc> and C<free> functions by default. You could override this function in high-availability programs to, say, free some memory if it cannot allocate memory, to use a special allocator, or even to sleep a while and retry until some memory is available. Example: Replace the libev allocator with one that waits a bit and then -retries). +retries (example requires a standards-compliant C<realloc>). static void * persistent_realloc (void *ptr, size_t size) |