Fix #1425 - Use physical core count API on FreeBSD
Similar to Apple, use the native physical core count sysctl, when available. This is a little repetitive (it's basically the __APPLE__ method plus the otherBSD method concatenated together) but seemed clearer than any way that would totally eliminate repetition. The __FreeBSD_version check only tests the version of the FreeBSD kernel that zstd is compiled on; importantly, it may be run on a different version. So the compile-time check is a little naive and needs to be able to fallback to work on older versions of FreeBSD. For a similar reason, it may make sense to simply eliminate the __FreeBSD_version check entirely. The tradeoff is that a spurious sysctlbyname would be issued when -T0 is used on older kernels.
This commit is contained in:
parent
b174809fcc
commit
fe82637069
@ -640,10 +640,42 @@ failed:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
|
#elif defined(__FreeBSD__)
|
||||||
|
|
||||||
/* Use apple-provided syscall
|
#include <sys/param.h>
|
||||||
* see: man 3 sysctl */
|
#include <sys/sysctl.h>
|
||||||
|
|
||||||
|
/* Use physical core sysctl when available
|
||||||
|
* see: man 4 smp, man 3 sysctl */
|
||||||
|
int UTIL_countPhysicalCores(void)
|
||||||
|
{
|
||||||
|
static int numPhysicalCores = 0; /* freebsd sysctl is native int sized */
|
||||||
|
if (numPhysicalCores != 0) return numPhysicalCores;
|
||||||
|
|
||||||
|
#if __FreeBSD_version >= 1300008
|
||||||
|
{ size_t size = sizeof(numPhysicalCores);
|
||||||
|
int ret = sysctlbyname("kern.smp.cores", &numPhysicalCores, &size, NULL, 0);
|
||||||
|
if (ret == 0) return numPhysicalCores;
|
||||||
|
if (errno != ENOENT) {
|
||||||
|
perror("zstd: can't get number of physical cpus");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* sysctl not present, fall through to older sysconf method */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
numPhysicalCores = (int)sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
|
if (numPhysicalCores == -1) {
|
||||||
|
/* value not queryable, fall back on 1 */
|
||||||
|
numPhysicalCores = 1;
|
||||||
|
}
|
||||||
|
return numPhysicalCores;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
|
||||||
|
|
||||||
|
/* Use POSIX sysconf
|
||||||
|
* see: man 3 sysconf */
|
||||||
int UTIL_countPhysicalCores(void)
|
int UTIL_countPhysicalCores(void)
|
||||||
{
|
{
|
||||||
static int numPhysicalCores = 0;
|
static int numPhysicalCores = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user