1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-26 23:31:55 -08:00

(lisp_align_malloc): Check for memory full when

allocating ablocks, which also avoids freeing a pointer into an
ablocks structure.
This commit is contained in:
Gerd Moellmann 2003-08-19 12:58:35 +00:00
parent c5788e99da
commit f4446bbf6f
2 changed files with 23 additions and 15 deletions

View file

@ -1,5 +1,11 @@
2003-08-19 Gerd Moellmann <gerd@gnu.org>
* alloc.c (lisp_align_malloc): Check for memory full when
allocating ablocks, which also avoids freeing a pointer into an
ablocks structure.
* puresize.h (BASE_PURESIZE): Increase to 1100000.
* buffer.c (Fmove_overlay): Set overlay's next pointer
unconditionally.

View file

@ -766,6 +766,23 @@ lisp_align_malloc (nbytes, type)
mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
#endif
/* If the memory just allocated cannot be addressed thru a Lisp
object's pointer, and it needs to be, that's equivalent to
running out of memory. */
if (type != MEM_TYPE_NON_LISP)
{
Lisp_Object tem;
char *end = (char *) base + ABLOCKS_BYTES - 1;
XSETCONS (tem, end);
if ((char *) XCONS (tem) != end)
{
lisp_malloc_loser = base;
free (base);
UNBLOCK_INPUT;
memory_full ();
}
}
/* Initialize the blocks and put them on the free list.
Is `base' was not properly aligned, we can't use the last block. */
for (i = 0; i < (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1); i++)
@ -788,21 +805,6 @@ lisp_align_malloc (nbytes, type)
val = free_ablock;
free_ablock = free_ablock->x.next_free;
/* If the memory just allocated cannot be addressed thru a Lisp
object's pointer, and it needs to be,
that's equivalent to running out of memory. */
if (val && type != MEM_TYPE_NON_LISP)
{
Lisp_Object tem;
XSETCONS (tem, (char *) val + nbytes - 1);
if ((char *) XCONS (tem) != (char *) val + nbytes - 1)
{
lisp_malloc_loser = val;
free (val);
val = 0;
}
}
#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
if (val && type != MEM_TYPE_NON_LISP)
mem_insert (val, (char *) val + nbytes, type);