+/**
+ * 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;
+#elif defined(__SunOS)
+ unsigned count = 0;
+ int type;
+ u_int numcpus;
+ processorid_t *cpulist;
+ processor_info_t cpuinfo;
+ cpulist = malloc(sizeof(processorid_t) * sysconf(_SC_NPROCESSORS_MAX));
+ if (!cpulist) return 1;
+ if (pset_info(PS_MYID, &type, &numcpus, cpulist)==0)
+ {
+ for (u_int i = 0; i < numcpus; i++)
+ {
+ if (!processor_info(cpulist[i], &cpuinfo))
+ count += (cpuinfo.pi_state == P_ONLINE)?1:0;
+ }
+ } else {
+ count = sysconf(_SC_NPROCESSORS_ONLN);
+ }
+ free(cpulist);
+ return (count>0)?count:1;
+#else
+# warning "vlc_GetCPUCount is not implemented for your platform"
+ return 1;
+#endif
+}
+