about summary refs log tree commit diff
path: root/malloc/malloc.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-07-31 13:33:18 +0000
committerJakub Jelinek <jakub@redhat.com>2007-07-31 13:33:18 +0000
commit32c075e1f01849e161724bbd400ba77244e482cc (patch)
tree5f083a3f352104f32bb6c902d57fa3f294bd8d4d /malloc/malloc.c
parentd6220e9ee38c1c9285221b023346201ec5f511b3 (diff)
downloadglibc-32c075e1f01849e161724bbd400ba77244e482cc.tar.gz
glibc-32c075e1f01849e161724bbd400ba77244e482cc.tar.xz
glibc-32c075e1f01849e161724bbd400ba77244e482cc.zip
.
Diffstat (limited to 'malloc/malloc.c')
-rw-r--r--malloc/malloc.c48
1 files changed, 9 insertions, 39 deletions
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 6427608a79..a369001520 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -1618,7 +1618,7 @@ static Void_t*   memalign_check(size_t alignment, size_t bytes,
 				const Void_t *caller);
 #ifndef NO_THREADS
 # ifdef _LIBC
-#  if USE___THREAD || !defined SHARED
+#  if USE___THREAD || (defined USE_TLS && !defined SHARED)
     /* These routines are never needed in this configuration.  */
 #   define NO_STARTER
 #  endif
@@ -2741,19 +2741,8 @@ static void do_check_malloc_state(mstate av)
   for (i = 0; i < NFASTBINS; ++i) {
     p = av->fastbins[i];
 
-    /* The following test can only be performed for the main arena.
-       While mallopt calls malloc_consolidate to get rid of all fast
-       bins (especially those larger than the new maximum) this does
-       only happen for the main arena.  Trying to do this for any
-       other arena would mean those arenas have to be locked and
-       malloc_consolidate be called for them.  This is excessive.  And
-       even if this is acceptable to somebody it still cannot solve
-       the problem completely since if the arena is locked a
-       concurrent malloc call might create a new arena which then
-       could use the newly invalid fast bins.  */
-
     /* all bins past max_fast are empty */
-    if (av == &main_arena && i > max_fast_bin)
+    if (i > max_fast_bin)
       assert(p == 0);
 
     while (p != 0) {
@@ -2896,13 +2885,7 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
       is one SIZE_SZ unit larger than for normal chunks, because there
       is no following chunk whose prev_size field could be used.
     */
-#if 1
-    /* See the front_misalign handling below, for glibc there is no
-       need for further alignments.  */
-    size = (nb + SIZE_SZ + pagemask) & ~pagemask;
-#else
     size = (nb + SIZE_SZ + MALLOC_ALIGN_MASK + pagemask) & ~pagemask;
-#endif
     tried_mmap = true;
 
     /* Don't try if size wraps around 0 */
@@ -2920,12 +2903,6 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
           address argument for later munmap in free() and realloc().
         */
 
-#if 1
-	/* For glibc, chunk2mem increases the address by 2*SIZE_SZ and
-	   MALLOC_ALIGN_MASK is 2*SIZE_SZ-1.  Each mmap'ed area is page
-	   aligned and therefore definitely MALLOC_ALIGN_MASK-aligned.  */
-        assert (((INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK) == 0);
-#else
         front_misalign = (INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK;
         if (front_misalign > 0) {
           correction = MALLOC_ALIGNMENT - front_misalign;
@@ -2933,12 +2910,10 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
           p->prev_size = correction;
           set_head(p, (size - correction) |IS_MMAPPED);
         }
-        else
-#endif
-	  {
-	    p = (mchunkptr)mm;
-	    set_head(p, size|IS_MMAPPED);
-	  }
+        else {
+          p = (mchunkptr)mm;
+          set_head(p, size|IS_MMAPPED);
+        }
 
         /* update statistics */
 
@@ -4122,6 +4097,7 @@ _int_malloc(mstate av, size_t bytes)
   for(;;) {
 
     int iters = 0;
+    bool any_larger = false;
     while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) {
       bck = victim->bk;
       if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)
@@ -4218,6 +4194,8 @@ _int_malloc(mstate av, size_t bytes)
       fwd->bk = victim;
       bck->fd = victim;
 
+      if (size >= nb + MINSIZE)
+	any_larger = true;
 #define MAX_ITERS	10000
       if (++iters >= MAX_ITERS)
 	break;
@@ -4706,15 +4684,7 @@ static void malloc_consolidate(av) mstate av;
       reused anyway.
     */
 
-#if 0
-    /* It is wrong to limit the fast bins to search using get_max_fast
-       because, except for the main arena, all the others might have
-       blocks in the high fast bins.  It's not worth it anyway, just
-       search all bins all the time.  */
     maxfb = &(av->fastbins[fastbin_index(get_max_fast ())]);
-#else
-    maxfb = &(av->fastbins[NFASTBINS - 1]);
-#endif
     fb = &(av->fastbins[0]);
     do {
       if ( (p = *fb) != 0) {