summaryrefslogtreecommitdiff
path: root/lib/common
diff options
context:
space:
mode:
authorWessel Dankers <wsl@fruit.je>2022-10-30 20:04:05 +0100
committerDavid Oberhollenzer <goliath@infraroot.at>2022-11-04 13:03:23 +0100
commitb7877c45fc7fe47709c963e15214a3dd5fc71e32 (patch)
tree1c183d0e5870495cdd8777ff0c0f779b2596a0a8 /lib/common
parentf3d87d9b78e28e2a6ad2676cce2b064f0bca6bd1 (diff)
Only use available CPUs
Not all CPUs may be available for the current process. Some CPUs may be offline, others may not be included in the process affinity mask. In such cases too many threads will be created, which will then compete unnecessarily for CPU time. Use sched_getaffinity() to determine the correct number of threads to create.
Diffstat (limited to 'lib/common')
-rw-r--r--lib/common/writer/init.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/common/writer/init.c b/lib/common/writer/init.c
index 06726ce..7940c3f 100644
--- a/lib/common/writer/init.c
+++ b/lib/common/writer/init.c
@@ -10,16 +10,20 @@
#include <string.h>
#include <stdlib.h>
+#include <unistd.h>
-#ifdef HAVE_SYS_SYSINFO_H
-#include <sys/sysinfo.h>
+#ifdef HAVE_SCHED_GETAFFINITY
+#include <sched.h>
static size_t os_get_num_jobs(void)
{
- int nprocs;
+ cpu_set_t cpu_set;
+ CPU_ZERO(&cpu_set);
- nprocs = get_nprocs_conf();
- return nprocs < 1 ? 1 : nprocs;
+ if (sched_getaffinity(0, sizeof cpu_set, &cpu_set) == -1)
+ return 1;
+ else
+ return CPU_COUNT(&cpu_set);
}
#else
static size_t os_get_num_jobs(void)