On Thursday 03 May 2007 3:42 pm, [EMAIL PROTECTED] wrote:
> rdesktop.c:/* malloc; exit if out of memory */
> rdesktop.c:void *xmalloc(int size)

Note that the reason this is so common is that malloc returning nonzero 
doesn't tell you a darn thing about whether or not the allocation actually 
succeeded on any modern system with virtual memory.

What malloc does is allocates virtual memory and populates it with duplicate 
copy-on-write mappings of the zero page.  Attempts to actually write to it 
break the COW and allocate physical pages, so the malloc is only going to 
return NULL if it ran out of _virtual_ memory (which happens on 32-bit 
systems, but is much less common and not really something you can do anything 
useful about).

When the system truly runs out of memory first it'll swap thrash for a bit 
(true even if you have no swap file, because mmap()ed files can flush the 
file contents back to disk to free up the physical pages and both executables 
and shared libraries are mmap()ed, and then it'll either trigger the out of 
memory killer.  (If you've disabled the OOM killer it'll instead freeze the 
entire system solid, which some people do because they think that hanging the 
entire system is an improvement over killing individual processes in an 
emergency because killing processes is bad, m'kay.)

So the actual physical allocation happens when writing to memory, not via 
malloc(), and the OOM killer steps in and goes "bang" rather than giving you 
ar eturn value you can check.  Which causes the same sort of exit() that 
xmalloc() would.

Rob
_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://busybox.net/cgi-bin/mailman/listinfo/uclibc

Reply via email to