[gcc/devel/omp/gcc-16] libgomp: Move internal NUMA function to a separate file [PR125940]

Sandra Loosemore via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:f5237a8bd316cdbb9525b0ed03199d2e226dafd4

commit f5237a8bd316cdbb9525b0ed03199d2e226dafd4
Author: Tobias Burnus <[email protected]>
Date:   Wed Jun 24 07:15:04 2026 +0200

    libgomp: Move internal NUMA function to a separate file [PR125940]
    
    At the previous location (affinity.c), the real and the fallback
    implementation of the NUMA functions were both in that file when
    HAVE_PTHREAD_AFFINITY_NP was unset. Solved by moving the internal
    NUMA functions into a separate file. Follow up to commit
    r17-1702-g8af1592882509f.
    
    libgomp/ChangeLog:
    
            PR libgomp/125940
    
            * Makefile.am (libgomp_la_SOURCES): Add numa.c.
            * Makefile.in: Regenerate.
            * affinity.c (gomp_get_current_numa_node,
            gomp_get_numa_distance): Move to ...
            * numa.c: ... this new file.
            * config/linux/affinity.c (gomp_get_current_numa_node,
            gomp_get_numa_distance): Move to ...
            * config/linux/numa.c: ... this new file.
    
    (cherry picked from commit 8ce473f8a26142a39487a0adac10570761f8ed90)

Diff:
---
 libgomp/Makefile.am             |  11 +++--
 libgomp/Makefile.in             |  17 +++----
 libgomp/affinity.c              |  14 ------
 libgomp/config/linux/affinity.c |  68 --------------------------
 libgomp/config/linux/numa.c     | 104 ++++++++++++++++++++++++++++++++++++++++
 libgomp/numa.c                  |  40 ++++++++++++++++
 6 files changed, 159 insertions(+), 95 deletions(-)

diff --git a/libgomp/Makefile.am b/libgomp/Makefile.am
index 0902164b5009..de9cad6c7d3e 100644
--- a/libgomp/Makefile.am
+++ b/libgomp/Makefile.am
@@ -66,11 +66,12 @@ libgomp_la_LINK = $(LINK) $(libgomp_la_LDFLAGS)
 libgomp_la_SOURCES = alloc.c atomic.c barrier.c critical.c env.c error.c \
 	icv.c icv-device.c iter.c iter_ull.c loop.c loop_ull.c ordered.c \
 	parallel.c scope.c sections.c single.c task.c team.c work.c lock.c \
-	mutex.c proc.c sem.c bar.c ptrlock.c time.c fortran.c affinity.c \
-	target.c splay-tree.c libgomp-plugin.c oacc-parallel.c oacc-host.c \
-	oacc-init.c oacc-mem.c oacc-async.c oacc-plugin.c oacc-cuda.c \
-	priority_queue.c affinity-fmt.c teams.c allocator.c simple-allocator.c \
-	oacc-profiling.c oacc-target.c target-indirect.c target-cxa-dso-dtor.c
+	mutex.c numa.c proc.c sem.c bar.c ptrlock.c time.c fortran.c \
+	affinity.c target.c splay-tree.c libgomp-plugin.c oacc-parallel.c \
+	oacc-host.c oacc-init.c oacc-mem.c oacc-async.c oacc-plugin.c \
+	oacc-cuda.c priority_queue.c affinity-fmt.c teams.c allocator.c \
+	simple-allocator.c oacc-profiling.c oacc-target.c target-indirect.c \
+	target-cxa-dso-dtor.c
 
 include $(top_srcdir)/plugin/Makefrag.am
 
diff --git a/libgomp/Makefile.in b/libgomp/Makefile.in
index 99ec575e3d59..b5291ab9731d 100644
--- a/libgomp/Makefile.in
+++ b/libgomp/Makefile.in
@@ -218,7 +218,7 @@ am_libgomp_la_OBJECTS = alloc.lo atomic.lo barrier.lo critical.lo \
 	env.lo error.lo icv.lo icv-device.lo iter.lo iter_ull.lo \
 	loop.lo loop_ull.lo ordered.lo parallel.lo scope.lo \
 	sections.lo single.lo task.lo team.lo work.lo lock.lo mutex.lo \
-	proc.lo sem.lo bar.lo ptrlock.lo time.lo fortran.lo \
+	numa.lo proc.lo sem.lo bar.lo ptrlock.lo time.lo fortran.lo \
 	affinity.lo target.lo splay-tree.lo libgomp-plugin.lo \
 	oacc-parallel.lo oacc-host.lo oacc-init.lo oacc-mem.lo \
 	oacc-async.lo oacc-plugin.lo oacc-cuda.lo priority_queue.lo \
@@ -553,13 +553,13 @@ libgomp_la_LINK = $(LINK) $(libgomp_la_LDFLAGS)
 libgomp_la_SOURCES = alloc.c atomic.c barrier.c critical.c env.c \
 	error.c icv.c icv-device.c iter.c iter_ull.c loop.c loop_ull.c \
 	ordered.c parallel.c scope.c sections.c single.c task.c team.c \
-	work.c lock.c mutex.c proc.c sem.c bar.c ptrlock.c time.c \
-	fortran.c affinity.c target.c splay-tree.c libgomp-plugin.c \
-	oacc-parallel.c oacc-host.c oacc-init.c oacc-mem.c \
-	oacc-async.c oacc-plugin.c oacc-cuda.c priority_queue.c \
-	affinity-fmt.c teams.c allocator.c simple-allocator.c \
-	oacc-profiling.c oacc-target.c target-indirect.c \
-	target-cxa-dso-dtor.c $(am__append_3)
+	work.c lock.c mutex.c numa.c proc.c sem.c bar.c ptrlock.c \
+	time.c fortran.c affinity.c target.c splay-tree.c \
+	libgomp-plugin.c oacc-parallel.c oacc-host.c oacc-init.c \
+	oacc-mem.c oacc-async.c oacc-plugin.c oacc-cuda.c \
+	priority_queue.c affinity-fmt.c teams.c allocator.c \
+	simple-allocator.c oacc-profiling.c oacc-target.c \
+	target-indirect.c target-cxa-dso-dtor.c $(am__append_3)
 
 # Nvidia PTX OpenACC plugin.
 @PLUGIN_NVPTX_TRUE@libgomp_plugin_nvptx_version_info = -version-info $(libtool_VERSION)
@@ -770,6 +770,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loop.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loop_ull.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mutex.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/numa.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oacc-async.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oacc-cuda.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oacc-host.Plo@am__quote@
diff --git a/libgomp/affinity.c b/libgomp/affinity.c
index 060fefbe540a..a194ba97ba35 100644
--- a/libgomp/affinity.c
+++ b/libgomp/affinity.c
@@ -152,19 +152,5 @@ gomp_display_affinity_place (char *buffer, size_t size, size_t *ret,
   gomp_display_string (buffer, size, ret, buf, strlen (buf));
 }
 
-int
-gomp_get_current_numa_node ()
-{
-  return -1;
-}
-
-int
-gomp_get_numa_distance (int node1, int node2)
-{
-  (void) node1;
-  (void) node2;
-  return -1;
-}
-
 ialias(omp_get_place_num_procs)
 ialias(omp_get_place_proc_ids)
diff --git a/libgomp/config/linux/affinity.c b/libgomp/config/linux/affinity.c
index ca14be9690e9..d30187b60643 100644
--- a/libgomp/config/linux/affinity.c
+++ b/libgomp/config/linux/affinity.c
@@ -30,14 +30,12 @@
 #endif
 #include "libgomp.h"
 #include "proc.h"
-#include <dirent.h>
 #include <errno.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
 #include <limits.h>
-#include <sys/syscall.h>
 
 #ifdef HAVE_PTHREAD_AFFINITY_NP
 
@@ -626,69 +624,3 @@ ialias(omp_get_place_proc_ids)
 #include "../../affinity.c"
 
 #endif
-
-static int num_numa_nodes = 0;
-static int *numa_distances = NULL;
-
-int
-gomp_get_current_numa_node ()
-{
-  int node;
-  syscall (SYS_getcpu, NULL /* cpu */, &node, NULL /* no longer used */);
-  return node;
-}
-
-int
-gomp_get_numa_distance (int node1, int node2)
-{
-  if (node1 < 0 || node2 < 0 || num_numa_nodes < 0)
-    return -1;
-
-  if (numa_distances == NULL)
-    {
-      num_numa_nodes = -1;
-      DIR *dir = opendir ("/sys/devices/system/node");
-      if (!dir)
-        return -1;
-      struct dirent *dp;
-      int cnt = 0;
-      errno = 0;
-      while ((dp = readdir(dir)) != NULL)
-	if (strncmp ("node", dp->d_name, 4 /* strlen ("node") */) == 0)
-	  cnt++;
-	else if (errno)
-	  {
-	    closedir (dir);
-	    return -1;
-	  }
-      closedir (dir);
-      numa_distances = (int *) gomp_malloc (sizeof (int) * cnt * cnt);
-
-      constexpr int len = sizeof ("/sys/devices/system/node/node12345/"
-                                  "distance");
-      char filename[len];
-
-      for (int i = 0; i < cnt; i++)
-	{
-	  if (len < snprintf (filename, sizeof (filename),
-			      "/sys/devices/system/node/node%d/distance", i))
-	    return -1;
-	  int distance = -1;
-	  FILE *in = fopen (filename, "r");
-	  for (int j = 0; j < cnt; j++)
-	    {
-	      fscanf (in, "%d", &distance);
-	      if (distance == -1)
-		{
-		  fclose (in);
-		  free (numa_distances);
-		  return -1;
-		}
-	      numa_distances[i * cnt + j] = distance;
-	    }
-	  fclose (in);
-	}
-      num_numa_nodes = cnt;
-    }
-  return numa_distances[node1 * num_numa_nodes + node2];
-}
diff --git a/libgomp/config/linux/numa.c b/libgomp/config/linux/numa.c
new file mode 100644
index 000000000000..d43b34b98dd1
--- /dev/null
+++ b/libgomp/config/linux/numa.c
@@ -0,0 +1,104 @@
+/* Copyright (C) 2026 Free Software Foundation, Inc.
+   Contributed by Tobias Burnus <[email protected]>
+
+   This file is part of the GNU Offloading and Multi Processing Library
+   (libgomp).
+
+   Libgomp is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
+   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+   more details.
+
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* Linux specific version of internally used NUMA information routines.  */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+#include "libgomp.h"
+#include <dirent.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+
+static int num_numa_nodes = 0;
+static int *numa_distances = NULL;
+
+int
+gomp_get_current_numa_node ()
+{
+  int node;
+  syscall (SYS_getcpu, NULL /* cpu */, &node, NULL /* no longer used */);
+  return node;
+}
+
+int
+gomp_get_numa_distance (int node1, int node2)
+{
+  if (node1 < 0 || node2 < 0 || num_numa_nodes < 0)
+    return -1;
+
+  if (numa_distances == NULL)
+    {
+      num_numa_nodes = -1;
+      DIR *dir = opendir ("/sys/devices/system/node");
+      if (!dir)
+	return -1;
+      struct dirent *dp;
+      int cnt = 0;
+      errno = 0;
+      while ((dp = readdir(dir)) != NULL)
+	if (strncmp ("node", dp->d_name, 4 /* strlen ("node") */) == 0)
+	  cnt++;
+	else if (errno)
+	  {
+	    closedir (dir);
+	    return -1;
+	  }
+      closedir (dir);
+      numa_distances = (int *) gomp_malloc (sizeof (int) * cnt * cnt);
+
+      constexpr int len = sizeof ("/sys/devices/system/node/node12345/"
+				  "distance");
+      char filename[len];
+
+      for (int i = 0; i < cnt; i++)
+	{
+	  if (len < snprintf (filename, sizeof (filename),
+			      "/sys/devices/system/node/node%d/distance", i))
+	    return -1;
+	  int distance = -1;
+	  FILE *in = fopen (filename, "r");
+	  for (int j = 0; j < cnt; j++)
+	    {
+	      fscanf (in, "%d", &distance);
+	      if (distance == -1)
+		{
+		  fclose (in);
+		  free (numa_distances);
+		  return -1;
+		}
+	      numa_distances[i * cnt + j] = distance;
+	    }
+	  fclose (in);
+	}
+      num_numa_nodes = cnt;
+    }
+  return numa_distances[node1 * num_numa_nodes + node2];
+}
diff --git a/libgomp/numa.c b/libgomp/numa.c
new file mode 100644
index 000000000000..37d790d18bc2
--- /dev/null
+++ b/libgomp/numa.c
@@ -0,0 +1,40 @@
+/* Copyright (C) 2026 Free Software Foundation, Inc.
+   Contributed by Tobias Burnus <[email protected]>
+
+   This file is part of the GNU Offloading and Multi Processing Library
+   (libgomp).
+
+   Libgomp is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
+   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+   more details.
+
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* Stub version of internally used NUMA information routines.  */
+
+int
+gomp_get_current_numa_node ()
+{
+  return -1;
+}
+
+int
+gomp_get_numa_distance (int node1, int node2)
+{
+  (void) node1;
+  (void) node2;
+  return -1;
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.