I ❤ µ-opts

This commit is contained in:
Marc Alexander Lehmann 2007-11-27 19:41:52 +00:00
parent 4e834d890e
commit 5c9aabea3d
5 changed files with 32 additions and 30 deletions

16
ev.3
View File

@ -242,13 +242,13 @@ might be supported on the current system, you would need to look at
recommended ones.
.Sp
See the description of \f(CW\*(C`ev_embed\*(C'\fR watchers for more info.
.IP "ev_set_allocator (void *(*cb)(void *ptr, long size))" 4
.IX Item "ev_set_allocator (void *(*cb)(void *ptr, long size))"
Sets the allocation function to use (the prototype is similar to the
realloc C function, the semantics are identical). 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.
.IP "ev_set_allocator (void *(*cb)(void *ptr, size_t size))" 4
.IX Item "ev_set_allocator (void *(*cb)(void *ptr, size_t size))"
Sets the allocation function to use (the prototype and semantics are
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.
.Sp
You could override this function in high-availability programs to, say,
free some memory if it cannot allocate memory, to use a special allocator,
@ -259,7 +259,7 @@ retries: better than mine).
.Sp
.Vb 6
\& static void *
\& persistent_realloc (void *ptr, long size)
\& persistent_realloc (void *ptr, size_t size)
\& {
\& for (;;)
\& {

12
ev.c
View File

@ -255,22 +255,22 @@ syserr (const char *msg)
}
}
static void *(*alloc)(void *ptr, long size);
static void *(*alloc)(void *ptr, size_t size) = realloc;
void
ev_set_allocator (void *(*cb)(void *ptr, long size))
ev_set_allocator (void *(*cb)(void *ptr, size_t size))
{
alloc = cb;
}
static void *
ev_realloc (void *ptr, long size)
inline_speed void *
ev_realloc (void *ptr, size_t size)
{
ptr = alloc ? alloc (ptr, size) : realloc (ptr, size);
ptr = alloc (ptr, size);
if (!ptr && size)
{
fprintf (stderr, "libev: cannot allocate %ld bytes, aborting.", size);
fprintf (stderr, "libev: cannot allocate %ld bytes, aborting.", (long)size);
abort ();
}

4
ev.h
View File

@ -66,6 +66,8 @@ typedef double ev_tstamp;
/*****************************************************************************/
#include <stddef.h> /* for size_t */
#if EV_STAT_ENABLE
# include <sys/stat.h>
#endif
@ -334,7 +336,7 @@ ev_tstamp ev_time (void);
* or take some potentially destructive action.
* The default is your system realloc function.
*/
void ev_set_allocator (void *(*cb)(void *ptr, long size));
void ev_set_allocator (void *(*cb)(void *ptr, size_t size));
/* set the callback function to call on a
* retryable syscall error

16
ev.html
View File

@ -6,7 +6,7 @@
<meta name="description" content="Pod documentation for libev" />
<meta name="inputfile" content="&lt;standard input&gt;" />
<meta name="outputfile" content="&lt;standard output&gt;" />
<meta name="created" content="Tue Nov 27 20:23:27 2007" />
<meta name="created" content="Tue Nov 27 20:38:24 2007" />
<meta name="generator" content="Pod::Xhtml 1.57" />
<link rel="stylesheet" href="http://res.tst.eu/pod.css"/></head>
<body>
@ -181,20 +181,20 @@ might be supported on the current system, you would need to look at
recommended ones.</p>
<p>See the description of <code>ev_embed</code> watchers for more info.</p>
</dd>
<dt>ev_set_allocator (void *(*cb)(void *ptr, long size))</dt>
<dt>ev_set_allocator (void *(*cb)(void *ptr, size_t size))</dt>
<dd>
<p>Sets the allocation function to use (the prototype is similar to the
realloc C function, the semantics are identical). 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.</p>
<p>Sets the allocation function to use (the prototype and semantics are
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.</p>
<p>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.</p>
<p>Example: replace the libev allocator with one that waits a bit and then
retries: better than mine).</p>
<pre> static void *
persistent_realloc (void *ptr, long size)
persistent_realloc (void *ptr, size_t size)
{
for (;;)
{

14
ev.pod
View File

@ -117,13 +117,13 @@ recommended ones.
See the description of C<ev_embed> watchers for more info.
=item ev_set_allocator (void *(*cb)(void *ptr, long size))
=item ev_set_allocator (void *(*cb)(void *ptr, size_t size))
Sets the allocation function to use (the prototype is similar to the
realloc C function, the semantics are identical). 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.
Sets the allocation function to use (the prototype and semantics are
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.
You could override this function in high-availability programs to, say,
free some memory if it cannot allocate memory, to use a special allocator,
@ -133,7 +133,7 @@ Example: replace the libev allocator with one that waits a bit and then
retries: better than mine).
static void *
persistent_realloc (void *ptr, long size)
persistent_realloc (void *ptr, size_t size)
{
for (;;)
{