X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Futil.c;fp=src%2Futil.c;h=f22d451e6e8f4b4fd08c5a023dbaecb90ea62017;hp=242280961d634fbcee28def2272df4ef64dec741;hb=f0b5b16920d4478d053e48db08014e5d57f11263;hpb=944944f4627d18da3b4124ec34df15706baf0d9b diff --git a/src/util.c b/src/util.c index 24228096..f22d451e 100644 --- a/src/util.c +++ b/src/util.c @@ -23,12 +23,18 @@ # include "config.h" #endif +#include #include #include #include +#ifdef HAVE_SYS_SYSCTL_H +# include +#endif +#include #include "wimlib.h" #include "wimlib/assert.h" +#include "wimlib/error.h" #include "wimlib/timestamp.h" #include "wimlib/util.h" #include "wimlib/xml.h" @@ -205,3 +211,41 @@ randomize_byte_array(u8 *p, size_t n) while (n--) *p++ = rand(); } + +#ifndef __WIN32__ +unsigned +get_available_cpus(void) +{ + long n = sysconf(_SC_NPROCESSORS_ONLN); + if (n < 1 || n >= UINT_MAX) { + WARNING("Failed to determine number of processors; assuming 1."); + return 1; + } + return n; +} +#endif /* !__WIN32__ */ + +#ifndef __WIN32__ +u64 +get_available_memory(void) +{ +#if defined(_SC_PAGESIZE) && defined(_SC_PHYS_PAGES) + long page_size = sysconf(_SC_PAGESIZE); + long num_pages = sysconf(_SC_PHYS_PAGES); + if (page_size <= 0 || num_pages <= 0) + goto default_size; + return ((u64)page_size * (u64)num_pages); +#else + int mib[2] = {CTL_HW, HW_MEMSIZE}; + u64 memsize; + size_t len = sizeof(memsize); + if (sysctl(mib, ARRAY_LEN(mib), &memsize, &len, NULL, 0) < 0 || len != 8) + goto default_size; + return memsize; +#endif + +default_size: + WARNING("Failed to determine available memory; assuming 1 GiB"); + return (u64)1 << 30; +} +#endif /* !__WIN32__ */