Under MacOS, getc is not a macro, only getc_unlocked is. This patch does two things: 1) it makes getdelim use getc_unlocked if it can wrap the calls with flockfile/funlockfile; 2) it makes getdelim omit the locking altogether if unlocked-io is in effect. It speeds up sed by almost 2x in very simple scripts with very little regular expression matching (such as '/^something/!d').
Ok? Paolo 2008-08-27 Paolo Bonzini <[EMAIL PROTECTED]> * lib/getdelim.c (flockfile, funlockfile): Make all of them dummy if one is not available. Do not touch them if USE_UNLOCKED_IO, instead letting unlocked-io.h do that. (getc_maybe_unlocked): New. * m4/getdelim.m4 (gl_PREREQ_GETDELIM): Check for getc_unlocked. diff --git a/lib/getdelim.c b/lib/getdelim.c index 2e127fc..bcbc192 100644 --- a/lib/getdelim.c +++ b/lib/getdelim.c @@ -33,13 +33,18 @@ #ifndef SSIZE_MAX # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) #endif -#if !HAVE_FLOCKFILE + +#if USE_UNLOCKED_IO +# include "unlocked-io.h" +# define getc_maybe_unlocked(fp) getc(fp) +#if !HAVE_FLOCKFILE || !HAVE_FUNLOCKFILE || !HAVE_DECL_GETC_UNLOCKED # undef flockfile -# define flockfile(x) ((void) 0) -#endif -#if !HAVE_FUNLOCKFILE # undef funlockfile +# define flockfile(x) ((void) 0) # define funlockfile(x) ((void) 0) +# define getc_maybe_unlocked(fp) getc(fp) +#else +# define getc_maybe_unlocked(fp) getc_unlocked(fp) #endif /* Read up to (and including) a DELIMITER from FP into *LINEPTR (and @@ -79,7 +84,7 @@ getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) { int i; - i = getc (fp); + i = getc_maybe_unlocked (fp); if (i == EOF) { result = -1; diff --git a/m4/getdelim.m4 b/m4/getdelim.m4index 18b96be..b6ffc39 100644 --- a/m4/getdelim.m4 +++ b/m4/getdelim.m4 @@ -31,4 +31,5 @@ AC_DEFUN([gl_FUNC_GETDELIM], AC_DEFUN([gl_PREREQ_GETDELIM], [ AC_CHECK_FUNCS([flockfile funlockfile]) + AC_CHECK_DECLS_ONCE([getc_unlocked]) ])