Hi!

gomp_free_thread wasn't updating gomp_managed_threads count, so if a thread
that executed #pragma omp parallel terminated, we might be still using
throttled spin count instead of normal one unnecessarily.

Tested on x86_64-linux and i686-linux, committed to trunk and 4.7.

2012-11-21  Jakub Jelinek  <ja...@redhat.com>

        PR libgomp/55411
        * team.c (gomp_free_thread): Decrease gomp_managed_threads
        if pool had any threads_used.

--- libgomp/team.c.jj   2011-08-03 18:40:16.000000000 +0200
+++ libgomp/team.c      2012-11-21 11:21:42.188165545 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2011
+/* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2011, 2012
    Free Software Foundation, Inc.
    Contributed by Richard Henderson <r...@redhat.com>.
 
@@ -232,6 +232,15 @@ gomp_free_thread (void *arg __attribute_
          gomp_barrier_wait (&pool->threads_dock);
          /* Now it is safe to destroy the barrier and free the pool.  */
          gomp_barrier_destroy (&pool->threads_dock);
+
+#ifdef HAVE_SYNC_BUILTINS
+         __sync_fetch_and_add (&gomp_managed_threads,
+                               1L - pool->threads_used);
+#else
+         gomp_mutex_lock (&gomp_remaining_threads_lock);
+         gomp_managed_threads -= pool->threads_used - 1L;
+         gomp_mutex_unlock (&gomp_remaining_threads_lock);
+#endif
        }
       free (pool->threads);
       if (pool->last_team)

        Jakub

Reply via email to