diff options
| author | Peter Wemm <peter@FreeBSD.org> | 2008-07-12 05:00:28 +0000 | 
|---|---|---|
| committer | Peter Wemm <peter@FreeBSD.org> | 2008-07-12 05:00:28 +0000 | 
| commit | a988131922df6e2093bf4391d6b1b021c07d6b3c (patch) | |
| tree | ceac31a567976fd5866cb5791b059781f6e045de /lib/isc/unix/os.c | |
| parent | 3104e2690b183ef5948f77893efb9ddc3f9edce2 (diff) | |
Notes
Diffstat (limited to 'lib/isc/unix/os.c')
| -rw-r--r-- | lib/isc/unix/os.c | 94 | 
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/isc/unix/os.c b/lib/isc/unix/os.c new file mode 100644 index 000000000000..6bbf0590bc48 --- /dev/null +++ b/lib/isc/unix/os.c @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2004, 2005  Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2000, 2001  Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id: os.c,v 1.13.18.3 2005/10/14 02:13:08 marka Exp $ */ + +#include <config.h> + +#include <isc/os.h> + + +#ifdef HAVE_SYSCONF + +#include <unistd.h> + +#ifndef __hpux +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 +	return (0); +#endif +} +#endif +#endif /* HAVE_SYSCONF */ + + +#ifdef __hpux + +#include <sys/pstat.h> + +static inline int +hpux_ncpus(void) { +	struct pst_dynamic psd; +	if (pstat_getdynamic(&psd, sizeof(psd), 1, 0) != -1) +		return (psd.psd_proc_cnt); +	else +		return (0); +} + +#endif /* __hpux */ + +#if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) +#include <sys/types.h>  /* for FreeBSD */ +#include <sys/param.h>  /* for NetBSD */ +#include <sys/sysctl.h> + +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 + +unsigned int +isc_os_ncpus(void) { +	long ncpus = 0; + +#ifdef __hpux +	ncpus = hpux_ncpus(); +#elif defined(HAVE_SYSCONF) +	ncpus = sysconf_ncpus(); +#endif +#if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) +	if (ncpus <= 0) +		ncpus = sysctl_ncpus(); +#endif +	if (ncpus <= 0) +		ncpus = 1; + +	return ((unsigned int)ncpus); +}  | 
