]> git.eshelyaron.com Git - emacs.git/commitdiff
Further follow-up to last change in gmalloc.c.
authorKen Brown <kbrown@cornell.edu>
Tue, 4 Mar 2014 19:02:49 +0000 (14:02 -0500)
committerKen Brown <kbrown@cornell.edu>
Tue, 4 Mar 2014 19:02:49 +0000 (14:02 -0500)
* src/gmalloc.c (aligned_alloc): Clarify the code by making `adj'
represent the actual adjustment needed for alignment.

src/ChangeLog
src/gmalloc.c

index 8aa6379ee7ef731d1ec5f083215a25369a91089c..2f599191548f31e5c212f829c3b55d447ea55e7d 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-04  Ken Brown  <kbrown@cornell.edu>
+
+       * gmalloc.c (aligned_alloc): Clarify the code by making `adj'
+       represent the actual adjustment needed for alignment.
+
 2014-03-04  Eli Zaretskii  <eliz@gnu.org>
 
        * gmalloc.c (aligned_alloc): Don't allocate more memory than
index 9fd624072859ef98a15753591cd0ab4fd7f83705..977abbdbbbd2b664310434f96b25007fbdc4227d 100644 (file)
@@ -1597,34 +1597,34 @@ 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;
+  adj = alignment - (uintptr_t) result % alignment;
+  if (adj == alignment)
+    adj = 0;
 
-  if (adj != 1)
+  if (adj != alignment - 1)
     {
       do
        {
          /* Reallocate the block with only as much excess as it
             needs.  */
          free (result);
-         result = malloc (size + alignment - adj);
+         result = malloc (size + adj);
          if (result == NULL)   /* Impossible unless interrupted.  */
            return NULL;
 
          lastadj = adj;
-         adj = (uintptr_t) result % alignment;
-         if (adj == 0)
-           adj = alignment;
+         adj = alignment - (uintptr_t) result % alignment;
+         if (adj == alignment)
+           adj = 0;
          /* 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);
+       } while (adj > lastadj);
     }
 
-  if (adj != alignment)
+  if (adj != 0)
     {
       /* 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
@@ -1648,7 +1648,7 @@ aligned_alloc (size_t alignment, size_t size)
       if (l != NULL)
        {
          l->exact = result;
-         result = l->aligned = (char *) result + alignment - adj;
+         result = l->aligned = (char *) result + adj;
        }
       UNLOCK_ALIGNED_BLOCKS ();
       if (l == NULL)