diff options
| author | root <root> | 2010-03-09 08:46:16 +0000 | 
|---|---|---|
| committer | root <root> | 2010-03-09 08:46:16 +0000 | 
| commit | 2d932586ceeb88f6691b08c80b741a3bffa04b3c (patch) | |
| tree | 85edb6ac78f08123f7aa254076b11329b8609b12 | |
| parent | ca720a782c7de23c2738672ceb40f9056f7ccc6c (diff) | |
ev_avoid_stdio
| -rw-r--r-- | Changes | 3 | ||||
| -rw-r--r-- | ev.c | 60 | ||||
| -rw-r--r-- | ev.pod | 32 | 
3 files changed, 75 insertions, 20 deletions
| @@ -11,6 +11,9 @@ Revision history for libev, a high-performance and full-featured event loop.            and analyzed by Aivars Kalvans).          - improve header file compatibility of the standalone eventfd code            in an obscure case. +        - implement EV_AVOID_STDIO option. +        - do not use sscanf to parse linux version number (smaller, faster, +          no sscanf dependency).  3.9  Thu Dec 31 07:59:59 CET 2009  	- signalfd is no longer used by default and has to be requested @@ -544,7 +544,15 @@ ev_syserr (const char *msg)      syserr_cb (msg);    else      { +#if EV_AVOID_STDIO +      write (STDERR_FILENO, msg, strlen (msg)); +      write (STDERR_FILENO, ": ", 2); +      msg = strerror (errno); +      write (STDERR_FILENO, msg, strlen (msg)); +      write (STDERR_FILENO, "\n", 1); +#else        perror (msg); +#endif        abort ();      }  } @@ -579,7 +587,12 @@ ev_realloc (void *ptr, long size)    if (!ptr && size)      { +#if EV_AVOID_STDIO +      write (STDERR_FILENO, "libev: memory allocation failed, aborting.", +                    sizeof ("libev: memory allocation failed, aborting.") - 1); +#else        fprintf (stderr, "libev: cannot allocate %ld bytes, aborting.", size); +#endif        abort ();      } @@ -2994,24 +3007,45 @@ infy_cb (EV_P_ ev_io *w, int revents)      }  } -inline_size void -check_2625 (EV_P) +inline_size unsigned int +ev_linux_version (void)  { -  /* kernels < 2.6.25 are borked -   * http://www.ussg.indiana.edu/hypermail/linux/kernel/0711.3/1208.html -   */    struct utsname buf; -  int major, minor, micro; +  unsigned int v; +  int i; +  char *p = buf.release;    if (uname (&buf)) -    return; +    return 0; -  if (sscanf (buf.release, "%d.%d.%d", &major, &minor, µ) != 3) -    return; +  for (i = 3+1; --i; ) +    { +      unsigned int c = 0; -  if (major < 2 -      || (major == 2 && minor < 6) -      || (major == 2 && minor == 6 && micro < 25)) +      for (;;) +        { +          if (*p >= '0' && *p <= '9') +            c = c * 10 + *p++ - '0'; +          else +            { +              p += *p == '.'; +              break; +            } +        } + +      v = (v << 8) | c; +    } + +  return v; +} + +inline_size void +ev_check_2625 (EV_P) +{ +  /* kernels < 2.6.25 are borked +   * http://www.ussg.indiana.edu/hypermail/linux/kernel/0711.3/1208.html +   */ +  if (ev_linux_version () < 0x020619)      return;    fs_2625 = 1; @@ -3036,7 +3070,7 @@ infy_init (EV_P)    fs_fd = -1; -  check_2625 (EV_A); +  ev_check_2625 (EV_A);    fs_fd = infy_newfd (); @@ -3619,12 +3619,19 @@ For this of course you need the m4 file:  =head2 PREPROCESSOR SYMBOLS/MACROS  Libev can be configured via a variety of preprocessor symbols you have to -define before including any of its files. The default in the absence of -autoconf is documented for every option. +define before including (or compiling) any of its files. The default in +the absence of autoconf is documented for every option. + +Symbols marked with "(h)" do not change the ABI, and can have different +values when compiling libev vs. including F<ev.h>, so it is permissible +to redefine them before including F<ev.h> without breakign compatibility +to a compiled library. All other symbols change the ABI, which means all +users of libev and the libev code itself must be compiled with compatible +settings.  =over 4 -=item EV_STANDALONE +=item EV_STANDALONE (h)  Must always be C<1> if you do not use autoconf configuration, which  keeps libev from including F<config.h>, and it also defines dummy @@ -3784,24 +3791,24 @@ as well as for signal and thread safety in C<ev_async> watchers.  In the absence of this define, libev will use C<sig_atomic_t volatile>  (from F<signal.h>), which is usually good enough on most platforms. -=item EV_H +=item EV_H (h)  The name of the F<ev.h> header file used to include it. The default if  undefined is C<"ev.h"> in F<event.h>, F<ev.c> and F<ev++.h>. This can be  used to virtually rename the F<ev.h> header file in case of conflicts. -=item EV_CONFIG_H +=item EV_CONFIG_H (h)  If C<EV_STANDALONE> isn't C<1>, this variable can be used to override  F<ev.c>'s idea of where to find the F<config.h> file, similarly to  C<EV_H>, above. -=item EV_EVENT_H +=item EV_EVENT_H (h)  Similarly to C<EV_H>, this macro can be used to override F<event.c>'s idea  of how the F<event.h> header can be found, the default is C<"event.h">. -=item EV_PROTOTYPES +=item EV_PROTOTYPES (h)  If defined to be C<0>, then F<ev.h> will not define any function  prototypes, but still define all the structs and other symbols. This is @@ -3883,6 +3890,17 @@ provide a bare-bones event library. See C<ev.h> for details on what parts  of the API are still available, and do not complain if this subset changes  over time. +=item EV_AVOID_STDIO + +If this is set to C<1> at compiletime, then libev will avoid using stdio +functions (printf, scanf, perror etc.). This will increase the codesize +somewhat, but if your program doesn't otherwise depend on stdio and your +libc allows it, this avoids linking in the stdio library which is quite +big. + +Note that error messages might become less precise when this option is +enabled. +  =item EV_NSIG  The highest supported signal number, +1 (or, the number of | 
