From 33ef4de95f1785bb813b6992231a05c6d6159800 Mon Sep 17 00:00:00 2001 From: "Pedro F. Giffuni" Date: Tue, 28 Apr 2015 21:32:27 +0000 Subject: [PATCH] libgomp: bring initial BSD support from upstream. Initial support for FreeBSD specific routines related to counting online processors and dynamic load balancing. Fix "detection" of the header which upstream seems to have done wrong. Obtained from: GCC pre-4.4 branch (rev. 140497; LGPLv2.1+) --- contrib/gcclibs/libgomp/ChangeLog.gcc44 | 8 ++ contrib/gcclibs/libgomp/config.h.in | 3 + contrib/gcclibs/libgomp/config/bsd/proc.c | 117 ++++++++++++++++++++++ contrib/gcclibs/libgomp/configure | 2 +- contrib/gcclibs/libgomp/configure.ac | 2 +- contrib/gcclibs/libgomp/configure.tgt | 4 + gnu/lib/libgomp/config.h | 3 + 7 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 contrib/gcclibs/libgomp/ChangeLog.gcc44 create mode 100644 contrib/gcclibs/libgomp/config/bsd/proc.c diff --git a/contrib/gcclibs/libgomp/ChangeLog.gcc44 b/contrib/gcclibs/libgomp/ChangeLog.gcc44 new file mode 100644 index 00000000000..234d0102660 --- /dev/null +++ b/contrib/gcclibs/libgomp/ChangeLog.gcc44 @@ -0,0 +1,8 @@ +2008-09-19 Jakub Jelinek (r140497) + Andreas Tobler + + * config/bsd/proc.c: New file. + * configure.tgt (*-*-darwin*): Use config_path "darwin posix". + * configure.ac: Check for header + * configure: Regenerate. + * config.h.in: Likewise. diff --git a/contrib/gcclibs/libgomp/config.h.in b/contrib/gcclibs/libgomp/config.h.in index a80176f926a..fa4206b7d77 100644 --- a/contrib/gcclibs/libgomp/config.h.in +++ b/contrib/gcclibs/libgomp/config.h.in @@ -57,6 +57,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSCTL_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H diff --git a/contrib/gcclibs/libgomp/config/bsd/proc.c b/contrib/gcclibs/libgomp/config/bsd/proc.c new file mode 100644 index 00000000000..513d8df3910 --- /dev/null +++ b/contrib/gcclibs/libgomp/config/bsd/proc.c @@ -0,0 +1,117 @@ +/* Copyright (C) 2005, 2006, 2008 Free Software Foundation, Inc. + Contributed by Richard Henderson . + + This file is part of the GNU OpenMP Library (libgomp). + + Libgomp is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, 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 Lesser General Public License for + more details. + + You should have received a copy of the GNU Lesser General Public License + along with libgomp; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* As a special exception, if you link this library with other files, some + of which are compiled with GCC, to produce an executable, this library + does not by itself cause the resulting executable to be covered by the + GNU General Public License. This exception does not however invalidate + any other reasons why the executable file might be covered by the GNU + General Public License. */ + +/* This file contains system specific routines related to counting + online processors and dynamic load balancing. It is expected that + a system may well want to write special versions of each of these. + + The following implementation uses a mix of POSIX and BSD routines. */ + +#include "libgomp.h" +#include +#include +#ifdef HAVE_GETLOADAVG +# ifdef HAVE_SYS_LOADAVG_H +# include +# endif +#endif +#ifdef HAVE_SYS_SYSCTL_H +# include +#endif + +static int +get_num_procs (void) +{ +#ifdef _SC_NPROCESSORS_ONLN + return sysconf (_SC_NPROCESSORS_ONLN); +#elif defined HW_NCPU + int ncpus = 1; + size_t len = sizeof(ncpus); + sysctl((int[2]) {CTL_HW, HW_NCPU}, 2, &ncpus, &len, NULL, 0); + return ncpus; +#else + return 0; +#endif +} + +/* At startup, determine the default number of threads. It would seem + this should be related to the number of cpus online. */ + +void +gomp_init_num_threads (void) +{ + int ncpus = get_num_procs (); + + if (ncpus > 0) + gomp_global_icv.nthreads_var = ncpus; +} + +/* When OMP_DYNAMIC is set, at thread launch determine the number of + threads we should spawn for this team. */ +/* ??? I have no idea what best practice for this is. Surely some + function of the number of processors that are *still* online and + the load average. Here I use the number of processors online + minus the 15 minute load average. */ + +unsigned +gomp_dynamic_max_threads (void) +{ + unsigned n_onln, loadavg; + unsigned nthreads_var = gomp_icv (false)->nthreads_var; + + n_onln = get_num_procs (); + if (!n_onln || n_onln > nthreads_var) + n_onln = nthreads_var; + + loadavg = 0; +#ifdef HAVE_GETLOADAVG + { + double dloadavg[3]; + if (getloadavg (dloadavg, 3) == 3) + { + /* Add 0.1 to get a kind of biased rounding. */ + loadavg = dloadavg[2] + 0.1; + } + } +#endif + + if (loadavg >= n_onln) + return 1; + else + return n_onln - loadavg; +} + +int +omp_get_num_procs (void) +{ + int ncpus = get_num_procs (); + if (ncpus <= 0) + ncpus = gomp_icv (false)->nthreads_var; + return ncpus; +} + +ialias (omp_get_num_procs) diff --git a/contrib/gcclibs/libgomp/configure b/contrib/gcclibs/libgomp/configure index 8d63ae93bbe..a5cee6ac4db 100755 --- a/contrib/gcclibs/libgomp/configure +++ b/contrib/gcclibs/libgomp/configure @@ -13428,7 +13428,7 @@ fi -for ac_header in unistd.h semaphore.h sys/loadavg.h sys/time.h +for ac_header in unistd.h semaphore.h sys/loadavg.h sys/sysctl.h sys/time.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then diff --git a/contrib/gcclibs/libgomp/configure.ac b/contrib/gcclibs/libgomp/configure.ac index 8b7dd802e21..c43858dcac0 100644 --- a/contrib/gcclibs/libgomp/configure.ac +++ b/contrib/gcclibs/libgomp/configure.ac @@ -154,7 +154,7 @@ AC_SUBST(libtool_VERSION) # Check header files. AC_STDC_HEADERS AC_HEADER_TIME -AC_CHECK_HEADERS(unistd.h semaphore.h sys/loadavg.h sys/time.h) +AC_CHECK_HEADERS(unistd.h semaphore.h sys/loadavg.h sys/sysctl.h sys/time.h) GCC_HEADER_STDINT(gstdint.h) diff --git a/contrib/gcclibs/libgomp/configure.tgt b/contrib/gcclibs/libgomp/configure.tgt index 68115abf71d..a666943edb9 100644 --- a/contrib/gcclibs/libgomp/configure.tgt +++ b/contrib/gcclibs/libgomp/configure.tgt @@ -107,6 +107,10 @@ case "${target}" in XLDFLAGS="${XLDFLAGS} -lposix4" ;; + *-*-darwin*) + config_path="bsd posix" + ;; + *) ;; diff --git a/gnu/lib/libgomp/config.h b/gnu/lib/libgomp/config.h index 3a17657f777..547e6927db3 100644 --- a/gnu/lib/libgomp/config.h +++ b/gnu/lib/libgomp/config.h @@ -55,6 +55,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SYSCTL_H 1 + /* Define to 1 if you have the header file. */ #define HAVE_SYS_TIME_H 1