Add reallocf to the library. This function is simliar to realloc, but

when it returns NULL to indicate failure, it will also free the memory
that was passed to it, if that was non-null.

This does not change the semantics of realloc.

A second commit will be done to commit the conversion of those places in
the code that can safely use this to avoid memory leaks when confronted
with low memory situations.

Beaten-to-death-but-finally-approved-in: -current
This commit is contained in:
Warner Losh 1998-09-14 20:34:34 +00:00
parent d6e5b04f99
commit 94ad719cf4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=39191
4 changed files with 43 additions and 13 deletions

View file

@ -163,6 +163,7 @@ int radixsort __P((const unsigned char **, int, const unsigned char *,
int sradixsort __P((const unsigned char **, int, const unsigned char *, int sradixsort __P((const unsigned char **, int, const unsigned char *,
unsigned)); unsigned));
long random __P((void)); long random __P((void));
void *reallocf __P((void *, size_t));
char *realpath __P((const char *, char resolved_path[])); char *realpath __P((const char *, char resolved_path[]));
char *setstate __P((char *)); char *setstate __P((char *));
void srandom __P((unsigned long)); void srandom __P((unsigned long));

View file

@ -1,5 +1,5 @@
# from @(#)Makefile.inc 8.3 (Berkeley) 2/4/95 # from @(#)Makefile.inc 8.3 (Berkeley) 2/4/95
# $Id: Makefile.inc,v 1.14 1998/02/20 08:41:46 jb Exp $ # $Id: Makefile.inc,v 1.15 1998/05/08 05:41:56 jb Exp $
# machine-independent stdlib sources # machine-independent stdlib sources
.PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/stdlib ${.CURDIR}/../libc/stdlib .PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/stdlib ${.CURDIR}/../libc/stdlib
@ -8,7 +8,7 @@ MISRCS+=abort.c abs.c atexit.c atof.c atoi.c atol.c bsearch.c calloc.c div.c \
exit.c getenv.c getopt.c getsubopt.c heapsort.c labs.c ldiv.c \ exit.c getenv.c getopt.c getsubopt.c heapsort.c labs.c ldiv.c \
malloc.c merge.c putenv.c qsort.c radixsort.c rand.c random.c \ malloc.c merge.c putenv.c qsort.c radixsort.c rand.c random.c \
realpath.c setenv.c strhash.c strtol.c strtoq.c strtoul.c \ realpath.c setenv.c strhash.c strtol.c strtoq.c strtoul.c \
strtouq.c system.c strtouq.c system.c reallocf.c
.if ${MACHINE_ARCH} == "alpha" .if ${MACHINE_ARCH} == "alpha"
# XXX Temporary until the assumption that a long is 32-bits is resolved # XXX Temporary until the assumption that a long is 32-bits is resolved
@ -35,5 +35,5 @@ MLINKS+=random.3 initstate.3 random.3 setstate.3 random.3 srandom.3 \
random.3 srandomdev.3 random.3 srandomdev.3
MLINKS+=strtol.3 strtoq.3 MLINKS+=strtol.3 strtoq.3
MLINKS+=strtoul.3 strtouq.3 MLINKS+=strtoul.3 strtouq.3
MLINKS+=malloc.3 calloc.3 malloc.3 free.3 malloc.3 realloc.3 MLINKS+=malloc.3 calloc.3 malloc.3 free.3 malloc.3 realloc.3 malloc.3 reallocf.3
.endif .endif

View file

@ -34,13 +34,13 @@
.\" SUCH DAMAGE. .\" SUCH DAMAGE.
.\" .\"
.\" @(#)malloc.3 8.1 (Berkeley) 6/4/93 .\" @(#)malloc.3 8.1 (Berkeley) 6/4/93
.\" $Id: malloc.3,v 1.14 1997/08/27 06:40:34 phk Exp $ .\" $Id: malloc.3,v 1.15 1997/09/18 06:51:22 charnier Exp $
.\" .\"
.Dd August 27, 1996 .Dd August 27, 1996
.Dt MALLOC 3 .Dt MALLOC 3
.Os FreeBSD 2 .Os FreeBSD 2
.Sh NAME .Sh NAME
.Nm malloc, calloc, realloc, free .Nm malloc, calloc, realloc, free, reallocf
.Nd general purpose memory allocation functions .Nd general purpose memory allocation functions
.Sh SYNOPSIS .Sh SYNOPSIS
.Fd #include <stdlib.h> .Fd #include <stdlib.h>
@ -54,6 +54,8 @@
.Fn free "void *ptr" .Fn free "void *ptr"
.Ft char * .Ft char *
.Va malloc_options; .Va malloc_options;
.Ft void *
.Fn reallocf "void *ptr" "size_t size"
.Sh DESCRIPTION .Sh DESCRIPTION
The The
.Fn malloc .Fn malloc
@ -109,6 +111,14 @@ function behaves identically to
for the specified size. for the specified size.
.Pp .Pp
The The
.Fn reallocf
function call is identical to the realloc function call, except that it
will free the passed pointer when the requested memory cannot be allocated.
This is a FreeBSD
specific API designed to ease the problems with traditional coding styles
for realloc causing memory leaks in libraries.
.Pp
The
.Fn free .Fn free
function causes the allocated memory referenced by function causes the allocated memory referenced by
.Fa ptr .Fa ptr
@ -141,13 +151,15 @@ The process will call
in these cases. in these cases.
.It J .It J
Each byte of new memory allocated by Each byte of new memory allocated by
.Fn malloc .Fn malloc ,
.Fn realloc
or or
.Fn realloc .Fn freealloc
as well as all memory returned by as well as all memory returned by
.Fn free .Fn free ,
or
.Fn realloc .Fn realloc
or
.Fn reallocf
will be initialized to 0xd0. will be initialized to 0xd0.
This options also sets the This options also sets the
.Dq R .Dq R
@ -158,9 +170,11 @@ Pass a hint to the kernel about pages unused by the allocation functions.
This will help performance if the system is paging excessively. This This will help performance if the system is paging excessively. This
option is on by default. option is on by default.
.It R .It R
Cause the Causes the
.Fn realloc .Fn realloc
function to always reallocate memory even if the initial allocation was and
.Fn reallocf
functions to always reallocate memory even if the initial allocation was
sufficiently large. sufficiently large.
This can substantially aid in compacting memory. This can substantially aid in compacting memory.
.It U .It U
@ -247,7 +261,9 @@ a NULL pointer is returned.
.Pp .Pp
The The
.Fn realloc .Fn realloc
function returns a pointer, possibly identical to and
.Fn reallocf
functions return a pointer, possibly identical to
.Fa ptr , .Fa ptr ,
to the allocated memory to the allocated memory
if successful; otherwise a NULL pointer is returned, in which case the if successful; otherwise a NULL pointer is returned, in which case the
@ -421,4 +437,5 @@ The present allocation implementation started out as a filesystem for a
drum attached to a 20bit binary challenged computer which was built drum attached to a 20bit binary challenged computer which was built
with discrete germanium transistors. It has since graduated to with discrete germanium transistors. It has since graduated to
handle primary storage rather than secondary. handle primary storage rather than secondary.
It first appeared in its new shape and ability in FreeBSD release 2.2. It first appeared in its new shape and ability in
.Fx 2.2 .

View file

@ -0,0 +1,12 @@
#include <stdlib.h>
void *
reallocf(void *ptr, size_t size)
{
void *nptr;
nptr = realloc(ptr, size);
if (!nptr && ptr)
free(ptr);
return (nptr);
}