]> granicus.if.org Git - xz/commitdiff
Windows: Add Windows support to tuklib_cpucores().
authorLasse Collin <lasse.collin@tukaani.org>
Sat, 3 Aug 2013 10:52:58 +0000 (13:52 +0300)
committerLasse Collin <lasse.collin@tukaani.org>
Sat, 3 Aug 2013 10:52:58 +0000 (13:52 +0300)
It is used for Cygwin too. I'm not sure if that is
a good or bad idea.

Thanks to Vincent Torri.

m4/tuklib_cpucores.m4
src/common/tuklib_cpucores.c

index 9e295c8f62accdc65b53f2efd3692c40ebd269fa..64a6b43c91d06f015c19c53588605e37b1a6513b 100644 (file)
@@ -9,8 +9,10 @@
 #   This information is used by tuklib_cpucores.c.
 #
 #   Supported methods:
+#     - GetSystemInfo(): Windows (including Cygwin)
 #     - sysctl(): BSDs, OS/2
-#     - sysconf(): GNU/Linux, Solaris, Tru64, IRIX, AIX, Cygwin
+#     - sysconf(): GNU/Linux, Solaris, Tru64, IRIX, AIX, Cygwin (but
+#       GetSystemInfo() is used on Cygwin)
 #     - pstat_getdynamic(): HP-UX
 #
 # COPYING
@@ -30,6 +32,19 @@ AC_CHECK_HEADERS([sys/param.h])
 AC_CACHE_CHECK([how to detect the number of available CPU cores],
        [tuklib_cv_cpucores_method], [
 
+# Maybe checking $host_os would be enough but this matches what
+# tuklib_cpucores.c does.
+#
+# NOTE: IRIX has a compiler that doesn't error out with #error, so use
+# a non-compilable text instead of #error to generate an error.
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#if defined(_WIN32) || defined(__CYGWIN__)
+int main(void) { return 0; }
+#else
+compile error
+#endif
+]])], [tuklib_cv_cpucores_method=special], [
+
 # Look for sysctl() solution first, because on OS/2, both sysconf()
 # and sysctl() pass the tests in this file, but only sysctl()
 # actually works.
@@ -82,7 +97,7 @@ main(void)
 ]])], [tuklib_cv_cpucores_method=pstat_getdynamic], [
 
        tuklib_cv_cpucores_method=unknown
-])])])])
+])])])])])
 
 case $tuklib_cv_cpucores_method in
        sysctl)
index 1da13df7f5f673db65857f1451beb7f04a08e8ba..93413a3c5dbead1b3654973f94853b5a25fc749e 100644 (file)
 
 #include "tuklib_cpucores.h"
 
+#if defined(_WIN32) || defined(__CYGWIN__)
+#      ifndef _WIN32_WINNT
+#              define _WIN32_WINNT 0x0500
+#      endif
+#      include <windows.h>
+
 #if defined(TUKLIB_CPUCORES_SYSCTL)
 #      ifdef HAVE_SYS_PARAM_H
 #              include <sys/param.h>
@@ -33,7 +39,12 @@ tuklib_cpucores(void)
 {
        uint32_t ret = 0;
 
-#if defined(TUKLIB_CPUCORES_SYSCTL)
+#if defined(_WIN32) || defined(__CYGWIN__)
+       SYSTEM_INFO sysinfo;
+       GetSystemInfo(&sysinfo);
+       ret = sysinfo.dwNumberOfProcessors;
+
+#elif defined(TUKLIB_CPUCORES_SYSCTL)
        int name[2] = { CTL_HW, HW_NCPU };
        int cpus;
        size_t cpus_size = sizeof(cpus);