2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-23 10:39:16 +00:00
bind/lib/isc/os.c
Petr Menšík f00f521e9c Use detected cache line size
IBM power architecture has L1 cache line size equal to 128.  Take
advantage of that on that architecture, do not force more common value
of 64.  When it is possible to detect higher value, use that value
instead.  Keep the default to be 64.
2022-01-27 13:02:23 +01:00

100 lines
2.2 KiB
C

/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#include <inttypes.h>
#include <isc/os.h>
#include <isc/types.h>
#include <isc/util.h>
#include "os_p.h"
static unsigned int isc__os_ncpus = 0;
static unsigned long isc__os_cacheline = ISC_OS_CACHELINE_SIZE;
#ifdef HAVE_SYSCONF
#include <unistd.h>
static inline long
sysconf_ncpus(void) {
#if defined(_SC_NPROCESSORS_ONLN)
return (sysconf((_SC_NPROCESSORS_ONLN)));
#elif defined(_SC_NPROC_ONLN)
return (sysconf((_SC_NPROC_ONLN)));
#else /* if defined(_SC_NPROCESSORS_ONLN) */
return (0);
#endif /* if defined(_SC_NPROCESSORS_ONLN) */
}
#endif /* HAVE_SYSCONF */
#if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME)
#include <sys/param.h> /* for NetBSD */
#include <sys/sysctl.h>
#include <sys/types.h> /* for FreeBSD */
static int
sysctl_ncpus(void) {
int ncpu, result;
size_t len;
len = sizeof(ncpu);
result = sysctlbyname("hw.ncpu", &ncpu, &len, 0, 0);
if (result != -1) {
return (ncpu);
}
return (0);
}
#endif /* if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) */
static void
ncpus_initialize(void) {
#if defined(HAVE_SYSCONF)
isc__os_ncpus = sysconf_ncpus();
#endif /* if defined(HAVE_SYSCONF) */
#if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME)
if (isc__os_ncpus <= 0) {
isc__os_ncpus = sysctl_ncpus();
}
#endif /* if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) */
if (isc__os_ncpus == 0) {
isc__os_ncpus = 1;
}
}
unsigned int
isc_os_ncpus(void) {
return (isc__os_ncpus);
}
unsigned long
isc_os_cacheline(void) {
return (isc__os_cacheline);
}
void
isc__os_initialize(void) {
ncpus_initialize();
#if defined(HAVE_SYSCONF) && defined(_SC_LEVEL1_DCACHE_LINESIZE)
long s = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
if (s > 0 && (unsigned long)s > isc__os_cacheline) {
isc__os_cacheline = s;
}
#endif
}
void
isc__os_shutdown(void) {
/* empty, but defined for completeness */;
}