Merged into lttng-ust master, 2.11, 2.10, 2.9, thanks! Mathieu
----- On Mar 20, 2019, at 11:07 AM, Michael Jeanson mjean...@efficios.com wrote: > On MUSL libc the _SC_NPROCESSORS_CONF sysconf will report the number of > CPUs allocated to the task based on the affinity mask instead of the > total number of CPUs configured on the system. > > Signed-off-by: Michael Jeanson <mjean...@efficios.com> > --- > libringbuffer/smp.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 66 insertions(+) > > diff --git a/libringbuffer/smp.c b/libringbuffer/smp.c > index 9e7114be..656a75da 100644 > --- a/libringbuffer/smp.c > +++ b/libringbuffer/smp.c > @@ -2,6 +2,7 @@ > * libringbuffer/smp.c > * > * Copyright (C) 2011-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> > + * Copyright (C) 2019 Michael Jeanson <mjean...@efficios.com> > * > * This library is free software; you can redistribute it and/or > * modify it under the terms of the GNU Lesser General Public > @@ -26,6 +27,7 @@ > > int __num_possible_cpus; > > +#if (defined(__GLIBC__) || defined( __UCLIBC__)) > void _get_num_possible_cpus(void) > { > int result; > @@ -43,3 +45,67 @@ void _get_num_possible_cpus(void) > return; > __num_possible_cpus = result; > } > + > +#else > + > +/* > + * The MUSL libc implementation of the _SC_NPROCESSORS_CONF sysconf does not > + * return the number of configured CPUs in the system but relies on the cpu > + * affinity mask of the current task. > + * > + * So instead we use a strategy similar to GLIBC's, counting the cpu > + * directories in "/sys/devices/system/cpu" and fallback on the value from > + * sysconf if it fails. > + */ > + > +#include <dirent.h> > +#include <limits.h> > +#include <stdlib.h> > +#include <string.h> > +#include <sys/types.h> > + > +#define __max(a,b) ((a)>(b)?(a):(b)) > + > +void _get_num_possible_cpus(void) > +{ > + int result, count = 0; > + DIR *cpudir; > + struct dirent *entry; > + > + cpudir = opendir("/sys/devices/system/cpu"); > + if (cpudir == NULL) > + goto end; > + > + /* > + * Count the number of directories named "cpu" followed by and > + * integer. This is the same strategy as glibc uses. > + */ > + while ((entry = readdir(cpudir))) { > + if (entry->d_type == DT_DIR && > + strncmp(entry->d_name, "cpu", 3) == 0) { > + > + char *endptr; > + unsigned long cpu_num; > + > + cpu_num = strtoul(entry->d_name + 3, &endptr, 10); > + if ((cpu_num < ULONG_MAX) && (endptr != entry->d_name + > 3) > + && (*endptr == '\0')) { > + count++; > + } > + } > + } > + > +end: > + /* > + * Get the sysconf value as a fallback. Keep the highest number. > + */ > + result = __max(sysconf(_SC_NPROCESSORS_CONF), count); > + > + /* > + * If both methods failed, don't store the value. > + */ > + if (result < 1) > + return; > + __num_possible_cpus = result; > +} > +#endif > -- > 2.17.1 -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev