malloc does not return null when out of memory
Gabor
gabor at vmunix.com
Thu Jul 24 11:01:08 PDT 2003
On Wed, Jul 23, 2003 at 03:22:30PM -0700, Darryl Okahata wrote:
# Barney Wolff <barney at databus.com> wrote:
#
# > Shouldn't malloc return 0 when out of memory rather than returning
# > an address that won't work? I believe that was the complaint. Presumably
# > having NO_SWAPPING has something to do with it, but filling the swap
# > might well do the same thing.
#
# Well, it goes against the man page, but FreeBSD typically never
# returns NULL [*] when you run out of VM. It's been this way for YEARS.
#
# [*] -- Yes, it's annoying as h*ll, but that's the way it works. I
# thought that there was a FAQ or handbook entry on this, but I
# couldn't find any.
Here is another test. This box has swap and I get a null pointer even
though ulimit -a says memory unlimited.
5230 0x27ef1000
5231 0x27f0a000
5232 0x27f23000
5233 0x27f3c000
5234 0x27f55000
5235 0x27f6e000
5236 0x27f87000
5237 0x27fa0000
5238 0x27fb9000
5239 0x27fd2000
5240 0x27feb000
5241 0x28004000
5242 0x2801d000
5243 0x0
No more mem
=0= 6g # ulimit -a
time(cpu-seconds) unlimited
file(blocks) unlimited
coredump(blocks) unlimited
data(kbytes) 524288
stack(kbytes) 65536
lockedmem(kbytes) unlimited
memory(kbytes) unlimited
nofiles(descriptors) 11095
processes 5547
vmemory(kbytes) unlimited
#include <stdlib.h>
int
main(int argc, char **argv)
{
char *p;
int cnt = 0;
while (1) {
p = malloc(100000);
printf("%d %p\n", ++cnt, p);
if (!p) {
puts("No more mem");
break;
}
}
return 0;
}
=0= 6g # sysctl vm.swap_enabled
vm.swap_enabled: 1
=0= 6g # sysctl hw.physmem
hw.physmem: 1061859328
=0= 6g # sysctl hw.usermem
hw.usermem: 906907648
=0= 6g # pstat -sk
Device 1K-blocks Used Avail Capacity Type
/dev/twed0s1b 1048448 0 1048448 0% Interleaved
More information about the freebsd-stable
mailing list