Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Feb 2001 23:23:48 -0800
From:      Farooq Mela <fmela0@sm.socccd.cc.ca.us>
To:        Peter Seebach <seebs@plethora.net>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Setting memory allocators for library functions.
Message-ID:  <3A961004.723691C9@sm.socccd.cc.ca.us>
References:  <200102230627.f1N6Rk618467@guild.plethora.net>

next in thread | previous in thread | raw e-mail | index | archive | help
Peter Seebach wrote:

> It is a mistake to believe that you "don't have to worry about running
> out of memory".  You should always check, every time, and exit as gracefully
> as you can.
> 
> -s

Of course I realize that allocating memory can fail. That is why I use
xmalloc and friends - so that I can avoid having to check for failure
each time I want to allocate memory. I don't believe you understand what
I am proposing. Consider the following inside libc:

void *(*libc_malloc)(size_t)=malloc;
void *(*libc_calloc)(size_t, size_t)=calloc;
void *(*libc_realloc)(void *, size_t)=realloc;

void
set_allocator(void *(*func)(size_t))
{
	libc_malloc=func;
}

/* Same type of functions for calloc and realloc.. */

Now, consider some other function that is part of libc, such as
getaddrinfo. Say it does the following:

/* code ... */

foo=malloc(128);
if (foo==NULL) {
	/* do clean-up.. */
	errno=ENOMEM;
	return(NULL);
}

This would be replaced by:

foo=(*libc_malloc)(128);
if (foo=NULL) {
	/* do clean-up */
	errno=ENOMEM;
	return(NULL);
}

It will still have to check for the allocation failing. But if this were
to be done, an application which installs its own allocators will not
have to worry about anything inside libc running out of memory, and will
not have to handle that error condition. Furthermore, inside the
user-defined allocator (xmalloc etc), other types of cleanup can be
handled if the real malloc() returns NULL. (Atexit can only do so much.)

Hope this clears it up.

-Farooq

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3A961004.723691C9>