From: Ken Brown Date: Tue, 4 Mar 2014 19:02:49 +0000 (-0500) Subject: Further follow-up to last change in gmalloc.c. X-Git-Tag: emacs-24.3.90~288 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=94a089b5f873837a369a176c114430e0fd0bee05;p=emacs.git Further follow-up to last change in gmalloc.c. * src/gmalloc.c (aligned_alloc): Clarify the code by making `adj' represent the actual adjustment needed for alignment. --- diff --git a/src/ChangeLog b/src/ChangeLog index 8aa6379ee7e..2f599191548 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2014-03-04 Ken Brown + + * gmalloc.c (aligned_alloc): Clarify the code by making `adj' + represent the actual adjustment needed for alignment. + 2014-03-04 Eli Zaretskii * gmalloc.c (aligned_alloc): Don't allocate more memory than diff --git a/src/gmalloc.c b/src/gmalloc.c index 9fd62407285..977abbdbbbd 100644 --- a/src/gmalloc.c +++ b/src/gmalloc.c @@ -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)