changeset 52256:36e112575ca8

(lisp_align_malloc): Check for memory full when allocating ablocks, which also avoids freeing a pointer into an ablocks structure.
author Gerd Moellmann <gerd@gnu.org>
date Tue, 19 Aug 2003 12:58:06 +0000
parents eb8d63124c39
children e82865497330
files src/alloc.c
diffstat 1 files changed, 17 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/alloc.c	Tue Aug 19 12:42:32 2003 +0000
+++ b/src/alloc.c	Tue Aug 19 12:58:06 2003 +0000
@@ -766,6 +766,23 @@
       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 @@
   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);