[BZ #2684]
authorUlrich Drepper <drepper@redhat.com>
Mon, 28 Aug 2006 00:58:32 +0000 (00:58 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 28 Aug 2006 00:58:32 +0000 (00:58 +0000)
2006-08-27  Ulrich Drepper  <drepper@redhat.com>
[BZ #2684]
* malloc/malloc.c (public_rEALLOc): Try harder by using other
arenas if allocation failed.
Patch mostly by Jan Edler <jan.edler@indexengines.com>.

ChangeLog
malloc/malloc.c

index 61a0696..3975e02 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-08-27  Ulrich Drepper  <drepper@redhat.com>
+
+       [BZ #2684]
+       * malloc/malloc.c (public_rEALLOc): Try harder by using other
+       arenas if allocation failed.
+       Patch mostly by Jan Edler <jan.edler@indexengines.com>.
+
 2006-08-26  Ulrich Drepper  <drepper@redhat.com>
 
        * malloc/malloc.c (bin_at): Rewrite to be more clear and to not
index 5813b41..d37e521 100644 (file)
@@ -3625,6 +3625,29 @@ public_rEALLOc(Void_t* oldmem, size_t bytes)
   (void)mutex_unlock(&ar_ptr->mutex);
   assert(!newp || chunk_is_mmapped(mem2chunk(newp)) ||
         ar_ptr == arena_for_chunk(mem2chunk(newp)));
+
+  if (newp == NULL)
+    {
+      /* Try harder to allocate memory in other arenas.  */
+      newp = public_mALLOc(bytes);
+      if (newp != NULL)
+       {
+         MALLOC_COPY (newp, oldmem, oldsize - 2 * SIZE_SZ);
+#if THREAD_STATS
+         if(!mutex_trylock(&ar_ptr->mutex))
+           ++(ar_ptr->stat_lock_direct);
+         else {
+           (void)mutex_lock(&ar_ptr->mutex);
+           ++(ar_ptr->stat_lock_wait);
+         }
+#else
+         (void)mutex_lock(&ar_ptr->mutex);
+#endif
+         _int_free(ar_ptr, oldmem);
+         (void)mutex_unlock(&ar_ptr->mutex);
+       }
+    }
+
   return newp;
 }
 #ifdef libc_hidden_def