>From 3dfe86d1522029f12c84bec55c8fb3c6c9c561dc Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 31 Jan 2021 12:41:33 +0100 Subject: [PATCH 3/6] Make it possible to compile free.c separately, unconditionally. * m4/free.m4 (gl_FUNC_FREE): Define HAVE_FREE_POSIX. * lib/free.c: Don't define rpl_free if not needed. --- ChangeLog | 4 ++++ lib/free.c | 16 +++++++++++----- m4/free.m4 | 7 +++++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index e9e2b36..b8d5cd7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2021-01-31 Bruno Haible + Make it possible to compile free.c separately, unconditionally. + * m4/free.m4 (gl_FUNC_FREE): Define HAVE_FREE_POSIX. + * lib/free.c: Don't define rpl_free if not needed. + Make it possible to compile realloc.c separately, unconditionally. * modules/realloc-posix (configure.ac): Invoke gl_MODULE_INDICATOR. * lib/realloc.c: Don't define rpl_realloc if not needed. diff --git a/lib/free.c b/lib/free.c index 5c89787..3f5968c 100644 --- a/lib/free.c +++ b/lib/free.c @@ -19,15 +19,19 @@ #include +/* Specification. */ #include -#include +/* A function definition is only needed if HAVE_FREE_POSIX is not defined. */ +#if !HAVE_FREE_POSIX + +# include void rpl_free (void *p) -#undef free +# undef free { -#if defined __GNUC__ && !defined __clang__ +# if defined __GNUC__ && !defined __clang__ /* An invalid GCC optimization would optimize away the assignments in the code below, when link-time @@ -39,9 +43,11 @@ rpl_free (void *p) errno = 0; free (p); errno = err[errno == 0]; -#else +# else int err = errno; free (p); errno = err; -#endif +# endif } + +#endif diff --git a/m4/free.m4 b/m4/free.m4 index d671376..a7923b9 100644 --- a/m4/free.m4 +++ b/m4/free.m4 @@ -1,4 +1,4 @@ -# free.m4 serial 5 +# free.m4 serial 6 # Copyright (C) 2003-2005, 2009-2021 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -40,7 +40,10 @@ AC_DEFUN([gl_FUNC_FREE], ]) case $gl_cv_func_free_preserves_errno in - *yes) ;; + *yes) + AC_DEFINE([HAVE_FREE_POSIX], [1], + [Define if the 'free' function is guaranteed to preserve errno.]) + ;; *) REPLACE_FREE=1 ;; esac ]) -- 2.7.4