+
+#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__ */