])
dnl Check for non-standard system calls
-AC_CHECK_FUNCS([accept4 dup3 eventfd fstatfs vmsplice])
+AC_CHECK_FUNCS([accept4 dup3 eventfd fstatfs vmsplice sched_getaffinity])
AH_BOTTOM([#include <vlc_fixups.h>])
# endif
VLC_EXPORT( unsigned, vlc_CPU, ( void ) );
+VLC_EXPORT( unsigned, vlc_GetCPUCount, ( void ) );
/** Are floating point operations fast?
* If this bit is not set, you should try to use fixed-point instead.
#endif
};
+/**
+ * Return the number of available logical CPU.
+ */
+unsigned vlc_GetCPUCount(void)
+{
+#ifdef WIN32
+ 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 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;
+#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