summaryrefslogtreecommitdiff
path: root/libgomp/team.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-04 15:44:20 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-04 15:44:20 +0000
commit8f697de691faf4ff96d6bef3c26760a3d8436404 (patch)
treeac821b38fafbfdcd8c9ded3ac49ca98b9174d998 /libgomp/team.c
parentf5b1f90b7b0020267c34487a1ab6da238c3712b3 (diff)
downloadgcc-8f697de691faf4ff96d6bef3c26760a3d8436404.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123494 138bc75d-0d04-0410-961f-82ee72b054a4
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 060f4ea2c6b..d114bb5de85 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);