summaryrefslogtreecommitdiff
path: root/libgomp/config/linux/affinity.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2010-04-20 15:37:51 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2010-04-20 15:37:51 +0000
commit3fef88f8e3dfa5d7e3b8bc3bc0f540d7b84eaa7b (patch)
treef290c50df00f07577021b710e347cd10c8be0b82 /libgomp/config/linux/affinity.c
parentc3e85a5791bb5b6a4afb9748029b9f804666d0b2 (diff)
downloadgcc-3fef88f8e3dfa5d7e3b8bc3bc0f540d7b84eaa7b.tar.gz
PR libgomp/43706
* config/linux/affinity.c (gomp_init_affinity): Decrease gomp_available_cpus if affinity mask confines the process to fewer CPUs. * config/linux/proc.c (get_num_procs): If gomp_cpu_affinity is non-NULL, just return gomp_available_cpus. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158565 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgomp/config/linux/affinity.c')
-rw-r--r--libgomp/config/linux/affinity.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/libgomp/config/linux/affinity.c b/libgomp/config/linux/affinity.c
index 40519e8896a..da9f3d8fdcb 100644
--- a/libgomp/config/linux/affinity.c
+++ b/libgomp/config/linux/affinity.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
Contributed by Jakub Jelinek <jakub@redhat.com>.
This file is part of the GNU OpenMP Library (libgomp).
@@ -39,8 +39,9 @@ static unsigned int affinity_counter;
void
gomp_init_affinity (void)
{
- cpu_set_t cpuset;
+ cpu_set_t cpuset, cpusetnew;
size_t idx, widx;
+ unsigned long cpus = 0;
if (pthread_getaffinity_np (pthread_self (), sizeof (cpuset), &cpuset))
{
@@ -51,10 +52,18 @@ gomp_init_affinity (void)
return;
}
+ CPU_ZERO (&cpusetnew);
for (widx = idx = 0; idx < gomp_cpu_affinity_len; idx++)
if (gomp_cpu_affinity[idx] < CPU_SETSIZE
&& CPU_ISSET (gomp_cpu_affinity[idx], &cpuset))
- gomp_cpu_affinity[widx++] = gomp_cpu_affinity[idx];
+ {
+ if (! CPU_ISSET (gomp_cpu_affinity[idx], &cpusetnew))
+ {
+ cpus++;
+ CPU_SET (gomp_cpu_affinity[idx], &cpusetnew);
+ }
+ gomp_cpu_affinity[widx++] = gomp_cpu_affinity[idx];
+ }
if (widx == 0)
{
@@ -66,6 +75,8 @@ gomp_init_affinity (void)
}
gomp_cpu_affinity_len = widx;
+ if (cpus < gomp_available_cpus)
+ gomp_available_cpus = cpus;
CPU_ZERO (&cpuset);
CPU_SET (gomp_cpu_affinity[0], &cpuset);
pthread_setaffinity_np (pthread_self (), sizeof (cpuset), &cpuset);