From fa942450e3b289057881a60fd98a9d4b35d99604 Mon Sep 17 00:00:00 2001 From: Kerin Millar Date: Fri, 7 Jun 2024 14:00:01 +0100 Subject: Add the get_nprocs() function It stands a good chance of printing a useful value, even in the case that nproc(1) from coreutils is unavailable. Signed-off-by: Kerin Millar --- functions.sh | 20 ++++++++++++++++++++ test-functions | 12 ++++++++++++ 2 files changed, 32 insertions(+) diff --git a/functions.sh b/functions.sh index 504ee9e..60a4b2e 100644 --- a/functions.sh +++ b/functions.sh @@ -460,6 +460,26 @@ newest() _select_by_mtime -r "$@" } +# +# Tries to determine the number of available processors. Falls back to trying to +# determine the number of online processors in a way that is somewhat portable. +# +get_nprocs() +{ + if nproc 2>/dev/null; then + # The nproc(1) utility is provided by GNU coreutils. It has the + # advantage of acknowledging the effect of sched_setaffinity(2). + true + elif getconf _NPROCESSORS_ONLN 2>/dev/null; then + # This is a non-standard extension. Nevertheless, it works for + # glibc, musl-utils, macOS, FreeBSD, NetBSD and OpenBSD. + true + else + warn "get_nprocs: failed to determine the number of processors" + false + fi +} + # # Considers one or more pathnames and prints the one having the oldest # modification time. If at least one parameter is provided, all parameters shall diff --git a/test-functions b/test-functions index 813d524..c734141 100755 --- a/test-functions +++ b/test-functions @@ -544,6 +544,17 @@ test_whenceforth() { iterate_tests 4 "$@" } +test_get_nprocs() { + set -- eq 0 + + callback() { + shift + test_description="get_nprocs" + nproc=$(get_nprocs) && is_int "${nproc}" && test "${nproc}" -gt 0 + } + + iterate_tests 2 "$@" +} iterate_tests() { slice_width=$1 @@ -610,6 +621,7 @@ test_newest || rc=1 test_trim || rc=1 test_hr || rc=1 test_whenceforth || rc=1 +test_get_nprocs || rc=1 cleanup_tmpdir -- cgit v1.2.3-65-gdbad