1*4afad4b7Schristos /* $NetBSD: os.c,v 1.1 2024/02/18 20:57:57 christos Exp $ */ 2*4afad4b7Schristos 3*4afad4b7Schristos /* 4*4afad4b7Schristos * Copyright (C) Internet Systems Consortium, Inc. ("ISC") 5*4afad4b7Schristos * 6*4afad4b7Schristos * SPDX-License-Identifier: MPL-2.0 7*4afad4b7Schristos * 8*4afad4b7Schristos * This Source Code Form is subject to the terms of the Mozilla Public 9*4afad4b7Schristos * License, v. 2.0. If a copy of the MPL was not distributed with this 10*4afad4b7Schristos * file, you can obtain one at https://mozilla.org/MPL/2.0/. 11*4afad4b7Schristos * 12*4afad4b7Schristos * See the COPYRIGHT file distributed with this work for additional 13*4afad4b7Schristos * information regarding copyright ownership. 14*4afad4b7Schristos */ 15*4afad4b7Schristos 16*4afad4b7Schristos #include <isc/os.h> 17*4afad4b7Schristos 18*4afad4b7Schristos #ifdef HAVE_SYSCONF 19*4afad4b7Schristos 20*4afad4b7Schristos #include <unistd.h> 21*4afad4b7Schristos 22*4afad4b7Schristos static long sysconf_ncpus(void)23*4afad4b7Schristossysconf_ncpus(void) { 24*4afad4b7Schristos #if defined(_SC_NPROCESSORS_ONLN) 25*4afad4b7Schristos return (sysconf((_SC_NPROCESSORS_ONLN))); 26*4afad4b7Schristos #elif defined(_SC_NPROC_ONLN) 27*4afad4b7Schristos return (sysconf((_SC_NPROC_ONLN))); 28*4afad4b7Schristos #else /* if defined(_SC_NPROCESSORS_ONLN) */ 29*4afad4b7Schristos return (0); 30*4afad4b7Schristos #endif /* if defined(_SC_NPROCESSORS_ONLN) */ 31*4afad4b7Schristos } 32*4afad4b7Schristos #endif /* HAVE_SYSCONF */ 33*4afad4b7Schristos 34*4afad4b7Schristos #if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) 35*4afad4b7Schristos #include <sys/param.h> /* for NetBSD */ 36*4afad4b7Schristos #include <sys/sysctl.h> 37*4afad4b7Schristos #include <sys/types.h> /* for FreeBSD */ 38*4afad4b7Schristos 39*4afad4b7Schristos static int sysctl_ncpus(void)40*4afad4b7Schristossysctl_ncpus(void) { 41*4afad4b7Schristos int ncpu, result; 42*4afad4b7Schristos size_t len; 43*4afad4b7Schristos 44*4afad4b7Schristos len = sizeof(ncpu); 45*4afad4b7Schristos result = sysctlbyname("hw.ncpu", &ncpu, &len, 0, 0); 46*4afad4b7Schristos if (result != -1) { 47*4afad4b7Schristos return (ncpu); 48*4afad4b7Schristos } 49*4afad4b7Schristos return (0); 50*4afad4b7Schristos } 51*4afad4b7Schristos #endif /* if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) */ 52*4afad4b7Schristos 53*4afad4b7Schristos unsigned int isc_os_ncpus(void)54*4afad4b7Schristosisc_os_ncpus(void) { 55*4afad4b7Schristos long ncpus = 0; 56*4afad4b7Schristos 57*4afad4b7Schristos #if defined(HAVE_SYSCONF) 58*4afad4b7Schristos ncpus = sysconf_ncpus(); 59*4afad4b7Schristos #endif /* if defined(HAVE_SYSCONF) */ 60*4afad4b7Schristos #if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) 61*4afad4b7Schristos if (ncpus <= 0) { 62*4afad4b7Schristos ncpus = sysctl_ncpus(); 63*4afad4b7Schristos } 64*4afad4b7Schristos #endif /* if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) */ 65*4afad4b7Schristos if (ncpus <= 0) { 66*4afad4b7Schristos ncpus = 1; 67*4afad4b7Schristos } 68*4afad4b7Schristos 69*4afad4b7Schristos return ((unsigned int)ncpus); 70*4afad4b7Schristos } 71