]> git.eshelyaron.com Git - emacs.git/commitdiff
Follow-up improvements for last change in gmalloc.c.
authorEli Zaretskii <eliz@gnu.org>
Tue, 4 Mar 2014 17:35:15 +0000 (19:35 +0200)
committerEli Zaretskii <eliz@gnu.org>
Tue, 4 Mar 2014 17:35:15 +0000 (19:35 +0200)
 src/gmalloc.c (aligned_alloc): Don't allocate more memory than
 needed, and don't reallocate if the initial allocation already
 fits the bill.  Suggested by Ken Brown <kbrown@cornell.edu>.

Fixes: debbugs:16901
src/ChangeLog
src/gmalloc.c

index 54ee0ffcc8a5d01f148a8b36df26ba02ce61f067..8aa6379ee7ef731d1ec5f083215a25369a91089c 100644 (file)
@@ -1,3 +1,9 @@
+2014-03-04  Eli Zaretskii  <eliz@gnu.org>
+
+       * gmalloc.c (aligned_alloc): Don't allocate more memory than
+       needed, and don't reallocate if the initial allocation already
+       fits the bill.  Suggested by Ken Brown <kbrown@cornell.edu>.
+
 2014-03-04  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
        * xterm.c (x_draw_stretch_glyph_string): Reset clipping.
index f8d0cfdc30a47cacf18f85d208711f8bdf6a069c..9fd624072859ef98a15753591cd0ab4fd7f83705 100644 (file)
@@ -38,6 +38,10 @@ License along with this library.  If not, see <http://www.gnu.org/licenses/>.
 #include <w32heap.h>   /* for sbrk */
 #endif
 
+#ifdef emacs
+extern void emacs_abort (void);
+#endif
+
 #ifdef __cplusplus
 extern "C"
 {
@@ -1594,24 +1598,33 @@ aligned_alloc (size_t alignment, size_t size)
   /* Figure out how much we will need to pad this particular block
      to achieve the required alignment.  */
   adj = (uintptr_t) result % alignment;
+  if (adj == 0)
+    adj = alignment;
 
-  do
+  if (adj != 1)
     {
-      /* Reallocate the block with only as much excess as it needs.  */
-      free (result);
-      result = malloc (size + alignment - adj);
-      if (result == NULL)      /* Impossible unless interrupted.  */
-       return NULL;
-
-      lastadj = adj;
-      adj = (uintptr_t) result % alignment;
-      /* It's conceivable we might have been so unlucky as to get a
-        different block with weaker alignment.  If so, this block is too
-        short to contain SIZE after alignment correction.  So we must
-        try again and get another block, slightly larger.  */
-    } while (adj < lastadj);
+      do
+       {
+         /* Reallocate the block with only as much excess as it
+            needs.  */
+         free (result);
+         result = malloc (size + alignment - adj);
+         if (result == NULL)   /* Impossible unless interrupted.  */
+           return NULL;
+
+         lastadj = adj;
+         adj = (uintptr_t) result % alignment;
+         if (adj == 0)
+           adj = alignment;
+         /* It's conceivable we might have been so unlucky as to get
+            a different block with weaker alignment.  If so, this
+            block is too short to contain SIZE after alignment
+            correction.  So we must try again and get another block,
+            slightly larger.  */
+       } while (adj < lastadj);
+    }
 
-  if (adj != 0)
+  if (adj != alignment)
     {
       /* Record this block in the list of aligned blocks, so that `free'
         can identify the pointer it is passed, which will be in the middle