]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
* malloc/malloc.c (bin_at): Rewrite to be more clear and to not
authorUlrich Drepper <drepper@redhat.com>
Sun, 27 Aug 2006 04:38:05 +0000 (04:38 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 27 Aug 2006 04:38:05 +0000 (04:38 +0000)
waste bins[0..1].
(malloc_state): Reduce bins size by 2.
(_int_malloc): Fix test for large enough buffer for early termination.
When no unsorted block matches perfectly and an exiting block has
to be split, use full list insert and not shortcut which assumes
the list is empty.

ChangeLog
malloc/malloc.c

index 7680f124a0c27a76b36e0f77af6d3c3e2a730941..61a0696850cfee68c6d80d9873750557582ad7e9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2006-08-26  Ulrich Drepper  <drepper@redhat.com>
 
+       * malloc/malloc.c (bin_at): Rewrite to be more clear and to not
+       waste bins[0..1].
+       (malloc_state): Reduce bins size by 2.
+       (_int_malloc): Fix test for large enough buffer for early termination.
+       When no unsorted block matches perfectly and an exiting block has
+       to be split, use full list insert and not shortcut which assumes
+       the list is empty.
+
        * locale/programs/ld-ctype.c (ctype_read): Better patch for read
        failure.
 
index 6de1409c4fc6bd0b80b53e110833aa978defe000..5813b419c7f0916988bde5c0b18a1d634396a07b 100644 (file)
@@ -2061,7 +2061,9 @@ nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 typedef struct malloc_chunk* mbinptr;
 
 /* addressing -- note that bin_at(0) does not exist */
-#define bin_at(m, i) ((mbinptr)((char*)&((m)->bins[(i)<<1]) - (SIZE_SZ<<1)))
+#define bin_at(m, i) \
+  (mbinptr) (((char *) &((m)->bins[((i) - 1) * 2]))                          \
+            - offsetof (struct malloc_chunk, fd))
 
 /* analog of ++bin */
 #define next_bin(b)  ((mbinptr)((char*)(b) + (sizeof(mchunkptr)<<1)))
@@ -2301,7 +2303,7 @@ struct malloc_state {
   mchunkptr        last_remainder;
 
   /* Normal bins packed as described above */
-  mchunkptr        bins[NBINS * 2];
+  mchunkptr        bins[NBINS * 2 - 2];
 
   /* Bitmap of bins */
   unsigned int     binmap[BINMAPSIZE];
@@ -4168,7 +4170,7 @@ _int_malloc(mstate av, size_t bytes)
       fwd->bk = victim;
       bck->fd = victim;
 
-      if (size >= nb)
+      if (size >= nb + MINSIZE)
        any_larger = true;
 #define MAX_ITERS      10000
       if (++iters >= MAX_ITERS)
@@ -4291,8 +4293,15 @@ _int_malloc(mstate av, size_t bytes)
         else {
           remainder = chunk_at_offset(victim, nb);
 
-          unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
-          remainder->bk = remainder->fd = unsorted_chunks(av);
+         /* We cannot assume the unsorted list is empty and therefore
+            have to perform a complete insert here.  */
+         bck = unsorted_chunks(av);
+         fwd = bck->fd;
+         remainder->bk = bck;
+         remainder->fd = fwd;
+         bck->fd = remainder;
+         fwd->bk = remainder;
+
           /* advertise as last remainder */
           if (in_smallbin_range(nb))
             av->last_remainder = remainder;