]> git.sesse.net Git - vlc/blobdiff - src/misc/cpu.c
"#if HAVE_FOO" -> "#ifdef HAVE_FOO"
[vlc] / src / misc / cpu.c
index 11dd5cf9d826b4a3555c61832746b6d69d228904..fc6e437ed6dda7c176e54dff259a9a2cc3f5ba0d 100644 (file)
@@ -70,7 +70,7 @@ static bool check_OS_capability( const char *psz_capability, pid_t pid )
     return false;
 }
 
-#  define check_capability(name, flag, code)  \
+#  define check_capability(name, flag, code)   \
      do {                                      \
         pid_t pid = fork();                    \
         if( pid == 0 )                         \
@@ -84,7 +84,8 @@ static bool check_OS_capability( const char *psz_capability, pid_t pid )
      } while(0)
 
 # else /* WIN32 */
-# define check_capability(name, flag, code) (void)0
+#  define check_capability(name, flag, code)   \
+        i_capabilities |= (flag);
 # endif
 #endif
 
@@ -270,6 +271,7 @@ out:
     pid_t pid = fork();
     if( pid == 0 )
     {
+        signal(SIGILL, SIG_DFL);
         asm volatile ("mtspr 256, %0\n\t"
                       "vand %%v0, %%v0, %%v0"
                       :
@@ -309,13 +311,51 @@ const struct
     { CPU_CAPABILITY_SSE,     "sse" },
 #endif
 #if defined (__ppc__) || defined (__ppc64__) || defined (__powerpc__)
-    { CPU_CAPABILITY_ALTIVEC, "altivec" },
+    { CPU_CAPABILITY_ALTIVEC, "altivec" },
 #endif
 #if defined (__arm__)
     { CPU_CAPABILITY_NEON,    "arm_neon" },
 #endif
 };
 
+/**
+ * Return the number of available logical CPU.
+ */
+unsigned vlc_GetCPUCount(void)
+{
+#if defined(WIN32) && !defined(UNDER_CE)
+    DWORD process_mask;
+    DWORD system_mask;
+    if (!GetProcessAffinityMask(GetCurrentProcess(), &process_mask, &system_mask))
+        return 1;
+
+    unsigned count = 0;
+    while (system_mask) {
+        count++;
+        system_mask >>= 1;
+    }
+    return count;
+#elif defined(HAVE_SCHED_GETAFFINITY)
+    cpu_set_t cpu;
+    CPU_ZERO(&cpu);
+    if (sched_getaffinity(0, sizeof(cpu), &cpu) < 0)
+        return 1;
+    unsigned count = 0;
+    for (unsigned i = 0; i < CPU_SETSIZE; i++)
+        count += CPU_ISSET(i, &cpu) != 0;
+    return count;
+#elif defined(__APPLE__)
+    int count;
+    size_t size = sizeof(count) ;
+    if (sysctlbyname("hw.ncpu", &count, &size, NULL, 0))
+        return 1; /* Failure */
+    return count;
+#else
+#   warning "vlc_GetCPUCount is not implemented for your platform"
+    return 1;
+#endif
+}
+
 /**
  * Check if a directory name contains usable plugins w.r.t. the hardware
  * capabilities. Loading a plugin when the hardware has insufficient