[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commits] r15770 - in /fsf/trunk/libc: ChangeLog malloc/arena.c



Author: eglibc
Date: Fri Nov 11 00:02:06 2011
New Revision: 15770

Log:
Import glibc-mainline for 2011-11-11

Modified:
    fsf/trunk/libc/ChangeLog
    fsf/trunk/libc/malloc/arena.c

Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Fri Nov 11 00:02:06 2011
@@ -1,3 +1,9 @@
+2011-11-10  Andreas Schwab  <schwab@xxxxxxxxxx>
+
+	* malloc/arena.c (_int_new_arena): Don't increment narenas.
+	(reused_arena): Don't check arena limit.
+	(arena_get2): Atomically check arena limit.
+
 2011-11-08  Ulrich Drepper  <drepper@xxxxxxxxx>
 
 	* locale/findlocale.c (_nl_find_locale): Use __strcasecmp_l.

Modified: fsf/trunk/libc/malloc/arena.c
==============================================================================
--- fsf/trunk/libc/malloc/arena.c (original)
+++ fsf/trunk/libc/malloc/arena.c Fri Nov 11 00:02:06 2011
@@ -747,8 +747,6 @@
   main_arena.next = a;
 
 #ifdef PER_THREAD
-  ++narenas;
-
   (void)mutex_unlock(&list_lock);
 #endif
 
@@ -786,30 +784,6 @@
 static mstate
 reused_arena (void)
 {
-  if (narenas <= mp_.arena_test)
-    return NULL;
-
-  static int narenas_limit;
-  if (narenas_limit == 0)
-    {
-      if (mp_.arena_max != 0)
-	narenas_limit = mp_.arena_max;
-      else
-	{
-	  int n  = __get_nprocs ();
-
-	  if (n >= 1)
-	    narenas_limit = NARENAS_FROM_NCORES (n);
-	  else
-	    /* We have no information about the system.  Assume two
-	       cores.  */
-	    narenas_limit = NARENAS_FROM_NCORES (2);
-	}
-    }
-
-  if (narenas < narenas_limit)
-    return NULL;
-
   mstate result;
   static mstate next_to_use;
   if (next_to_use == NULL)
@@ -844,10 +818,41 @@
   mstate a;
 
 #ifdef PER_THREAD
-  if ((a = get_free_list ()) == NULL
-      && (a = reused_arena ()) == NULL)
-    /* Nothing immediately available, so generate a new arena.  */
-    a = _int_new_arena(size);
+  static size_t narenas_limit;
+
+  a = get_free_list ();
+  if (a == NULL)
+    {
+      /* Nothing immediately available, so generate a new arena.  */
+      if (narenas_limit == 0)
+	{
+	  if (mp_.arena_max != 0)
+	    narenas_limit = mp_.arena_max;
+	  else
+	    {
+	      int n  = __get_nprocs ();
+
+	      if (n >= 1)
+		narenas_limit = NARENAS_FROM_NCORES (n);
+	      else
+		/* We have no information about the system.  Assume two
+		   cores.  */
+		narenas_limit = NARENAS_FROM_NCORES (2);
+	    }
+	}
+    repeat:;
+      size_t n = narenas;
+      if (__builtin_expect (n <= mp_.arena_test || n < narenas_limit, 0))
+	{
+	  if (catomic_compare_and_exchange_bool_acq(&narenas, n + 1, n))
+	    goto repeat;
+	  a = _int_new_arena (size);
+	  if (__builtin_expect (a != NULL, 1))
+	    return a;
+	  catomic_decrement(&narenas);
+	}
+      a = reused_arena ();
+    }
 #else
   if(!a_tsd)
     a = a_tsd = &main_arena;

_______________________________________________
Commits mailing list
Commits@xxxxxxxxxx
http://eglibc.org/cgi-bin/mailman/listinfo/commits