[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Bug-gnulib] requirements of 'malloc' module
From: |
Bruno Haible |
Subject: |
Re: [Bug-gnulib] requirements of 'malloc' module |
Date: |
Mon, 24 Nov 2003 13:31:09 +0100 |
User-agent: |
KMail/1.5 |
Hi,
Last week we were reminded about this unfortunate "#define malloc rpl_malloc"
thing. We already discussed it in
http://mail.gnu.org/archive/html/bug-gnulib/2003-01/msg00041.html
Here is a proposal to define a new module 'eealloc' ('e' because the letters
'c', 'n', 'z', 'g' are already taken). After this module is accepted, the
logical next step will be to change xmalloc to use it. This way
1. Link errors due to "#define malloc rpl_malloc" will no longer occur,
2. Code which need the ISO C semantics of malloc() are no longer forced to
choose between
a) using an overkill test for empty allocations that they don't need,
b) using a modified variant of xalloc (this is what gettext currently
does).
Comments?
Bruno
=========================== eealloc.h ===========================
/* Memory allocation with expensive empty allocations.
Copyright (C) 2003 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2003,
based on prior work by Jim Meyering.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef _EEALLOC_H
#define _EEALLOC_H
/* malloc() and realloc() are allowed to return NULL when asked to allocate
a memory block of 0 bytes; this is not an out-of-memory condition.
(See ISO C 99 section 7.20.3.) In some places, this is not welcome,
because it requires extra checking (so as not to confuse a zero-sized
allocation with an out-of-memory condition). This file provides
malloc()/realloc() workalikes which return non-NULL pointers for
succeeding zero-sized allocations. GNU libc already defines malloc()
and realloc() this way; on such platforms the workalikes are aliased
to the original malloc()/realloc() functions. */
#include <stdlib.h>
#if MALLOC_0_IS_NONNULL
# define eemalloc malloc
#else
static inline void *
eemalloc (size_t n)
{
/* If n is zero, allocate a 1-byte block. */
if (n == 0)
n = 1;
return malloc (n);
}
#endif
#if REALLOC_0_IS_NONNULL
# define eerealloc realloc
#else
static inline void *
eerealloc (void *p, size_t n)
{
/* If n is zero, allocate or keep a 1-byte block. */
if (n == 0)
n = 1;
return realloc (p, n);
}
#endif
/* Maybe we should also define variants
eenmalloc (size_t n, size_t s) - behaves like eemalloc (n * s)
eezalloc (size_t n) - like eemalloc followed by memset 0
eecalloc (size_t n, size_t s) - like eemalloc (n * s) followed by memset 0
eenrealloc (void *p, size_t n, size_t s) - like eerealloc (p, n * s)
If this would be useful in your application. please speak up. */
#endif /* _EEALLOC_H */
=========================== eealloc.m4 ===========================
# eealloc.m4 serial 1
dnl Copyright (C) 2003 Free Software Foundation, Inc.
dnl This file is free software, distributed under the terms of the GNU
dnl General Public License. As a special exception to the GNU General
dnl Public License, this file may be distributed as part of a program
dnl that contains a configuration script generated by Autoconf, under
dnl the same distribution terms as the rest of that program.
AC_DEFUN([gl_EEALLOC],
[
AC_REQUIRE([gl_EEMALLOC])
AC_REQUIRE([gl_EEREALLOC])
AC_REQUIRE([AC_C_INLINE])
])
AC_DEFUN([gl_EEMALLOC],
[
_AC_FUNC_MALLOC_IF(
[gl_cv_func_malloc_0_nonnull=1],
[gl_cv_func_malloc_0_nonnull=0])
AC_DEFINE_UNQUOTED([MALLOC_0_IS_NONNULL], $gl_cv_func_malloc_0_nonnull,
[If malloc(0) is != NULL, define this to 1. Otherwise define this
to 0.])
])
AC_DEFUN([gl_EEREALLOC],
[
_AC_FUNC_REALLOC_IF(
[gl_cv_func_realloc_0_nonnull=1],
[gl_cv_func_realloc_0_nonnull=0])
AC_DEFINE_UNQUOTED([REALLOC_0_IS_NONNULL], $gl_cv_func_realloc_0_nonnull,
[If realloc(NULL,0) is != NULL, define this to 1. Otherwise define this
to 0.])
])