aboutsummaryrefslogtreecommitdiff
path: root/libgomp/team.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-04-04 17:44:20 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2007-04-04 17:44:20 +0200
commita0884cf09ee0b132930c5ad0f16736f9681f3b07 (patch)
treeac821b38fafbfdcd8c9ded3ac49ca98b9174d998 /libgomp/team.c
parent6acd883864e3cff5895962772cca141bbbf3d2ad (diff)
downloadgcc-a0884cf09ee0b132930c5ad0f16736f9681f3b07.zip
gcc-a0884cf09ee0b132930c5ad0f16736f9681f3b07.tar.gz
gcc-a0884cf09ee0b132930c5ad0f16736f9681f3b07.tar.bz2
libgomp.h (gomp_cpu_affinity, [...]): New extern decls.
* libgomp.h (gomp_cpu_affinity, gomp_cpu_affinity_len): New extern decls. (gomp_init_affinity, gomp_init_thread_affinity): New prototypes. * env.c (gomp_cpu_affinity, gomp_cpu_affinity_len): New variables. (parse_affinity): New function. (initialize_env): Call it and gomp_init_affinity. * team.c (gomp_team_start): If gomp_cpu_affinity != NULL, create new pthread_attr_t and call gomp_init_thread_affinity on it for each thread before passing the attribute to pthread_create. * config/linux/affinity.c: New file. * config/posix/affinity.c: New file. * configure.ac (HAVE_PTHREAD_AFFINITY_NP): New test. * configure: Rebuilt. * config.h.in: Rebuilt. * Makefile.am (libgomp_la_SOURCES): Add affinity.c. * Makefile.in: Rebuilt. From-SVN: r123494
Diffstat (limited to 'libgomp/team.c')
-rw-r--r--libgomp/team.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/libgomp/team.c b/libgomp/team.c
index 060f4ea..d114bb5 100644
--- a/libgomp/team.c
+++ b/libgomp/team.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
Contributed by Richard Henderson <rth@redhat.com>.
This file is part of the GNU OpenMP Library (libgomp).
@@ -183,6 +183,7 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
struct gomp_team *team;
bool nested;
unsigned i, n, old_threads_used = 0;
+ pthread_attr_t thread_attr, *attr;
thr = gomp_thread ();
nested = thr->ts.team != NULL;
@@ -265,6 +266,17 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
}
}
+ attr = &gomp_thread_attr;
+ if (gomp_cpu_affinity != NULL)
+ {
+ size_t stacksize;
+ pthread_attr_init (&thread_attr);
+ pthread_attr_setdetachstate (&thread_attr, PTHREAD_CREATE_DETACHED);
+ if (! pthread_attr_getstacksize (&thread_attr, &stacksize))
+ pthread_attr_setstacksize (&thread_attr, stacksize);
+ attr = &thread_attr;
+ }
+
start_data = gomp_alloca (sizeof (struct gomp_thread_start_data)
* (nthreads-i));
@@ -283,12 +295,17 @@ gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
start_data->fn_data = data;
start_data->nested = nested;
- err = pthread_create (&pt, &gomp_thread_attr,
- gomp_thread_start, start_data);
+ if (gomp_cpu_affinity != NULL)
+ gomp_init_thread_affinity (attr);
+
+ err = pthread_create (&pt, attr, gomp_thread_start, start_data);
if (err != 0)
gomp_fatal ("Thread creation failed: %s", strerror (err));
}
+ if (gomp_cpu_affinity != NULL)
+ pthread_attr_destroy (&thread_attr);
+
do_release:
gomp_barrier_wait (nested ? &team->barrier : &gomp_threads_dock);