This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] [gomp] Simplify thread pool initialization


Move the thread pool initialization from the team start to the team
creation.  This eliminates one conditional expression.  In addition this
is a preparation patch to enable shared thread pools which I would like
to use for RTEMS later.  No unexpected failures on
x86_64-unknown-linux-gnu.

libgomp/ChangeLog
2015-07-22  Sebastian Huber  <sebastian.huber@embedded-brains.de>

	* team.c (gomp_new_thread_pool): Delete and move content to ...
	(gomp_get_thread_pool): ... new function.  Allocate and
	initialize thread pool on demand.
	(get_last_team): Use gomp_get_thread_pool().
	(gomp_team_start): Delete thread pool initialization.
---
 libgomp/team.c | 56 +++++++++++++++++++++++++++-----------------------------
 1 file changed, 27 insertions(+), 29 deletions(-)

diff --git a/libgomp/team.c b/libgomp/team.c
index 7671b05..5c56182 100644
--- a/libgomp/team.c
+++ b/libgomp/team.c
@@ -134,22 +134,39 @@ gomp_thread_start (void *xdata)
   return NULL;
 }
 
+/* Get the thread pool, allocate and initialize it on demand.  */
+
+static struct gomp_thread_pool *
+gomp_get_thread_pool (struct gomp_thread *thr, unsigned nthreads)
+{
+  struct gomp_thread_pool *pool = thr->thread_pool;
+  if (__builtin_expect (pool == NULL, 0))
+    {
+      pool = gomp_malloc (sizeof (*pool));
+      pool->threads = NULL;
+      pool->threads_size = 0;
+      pool->threads_used = 0;
+      pool->last_team = NULL;
+      pool->threads_busy = nthreads;
+      thr->thread_pool = pool;
+      pthread_setspecific (gomp_thread_destructor, thr);
+    }
+  return pool;
+}
+
 static inline struct gomp_team *
 get_last_team (unsigned nthreads)
 {
   struct gomp_thread *thr = gomp_thread ();
   if (thr->ts.team == NULL)
     {
-      struct gomp_thread_pool *pool = thr->thread_pool;
-      if (pool != NULL)
-	{
-	  struct gomp_team *last_team = pool->last_team;
-	  if (last_team != NULL && last_team->nthreads == nthreads)
-	    {
-	      pool->last_team = NULL;
-	      return last_team;
-	    }
-	}
+      struct gomp_thread_pool *pool = gomp_get_thread_pool (thr, nthreads);
+      struct gomp_team *last_team = pool->last_team;
+      if (last_team != NULL && last_team->nthreads == nthreads)
+        {
+          pool->last_team = NULL;
+          return last_team;
+        }
     }
   return NULL;
 }
@@ -219,19 +236,6 @@ free_team (struct gomp_team *team)
   free (team);
 }
 
-/* Allocate and initialize a thread pool. */
-
-static struct gomp_thread_pool *gomp_new_thread_pool (void)
-{
-  struct gomp_thread_pool *pool
-    = gomp_malloc (sizeof(struct gomp_thread_pool));
-  pool->threads = NULL;
-  pool->threads_size = 0;
-  pool->threads_used = 0;
-  pool->last_team = NULL;
-  return pool;
-}
-
 static void
 gomp_free_pool_helper (void *thread_pool)
 {
@@ -316,12 +320,6 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
 
   thr = gomp_thread ();
   nested = thr->ts.team != NULL;
-  if (__builtin_expect (thr->thread_pool == NULL, 0))
-    {
-      thr->thread_pool = gomp_new_thread_pool ();
-      thr->thread_pool->threads_busy = nthreads;
-      pthread_setspecific (gomp_thread_destructor, thr);
-    }
   pool = thr->thread_pool;
   task = thr->task;
   icv = task ? &task->icv : &gomp_global_icv;
-- 
1.8.4.5


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]