# endif
VLC_API unsigned vlc_CPU( void );
-VLC_API unsigned vlc_GetCPUCount( void );
/** Are floating point operations fast?
* If this bit is not set, you should try to use fixed-point instead.
VLC_API void vlc_timer_schedule(vlc_timer_t, bool, mtime_t, mtime_t);
VLC_API unsigned vlc_timer_getoverrun(vlc_timer_t) VLC_USED;
+VLC_API unsigned vlc_GetCPUCount(void);
+
#ifndef LIBVLC_USE_PTHREAD_CANCEL
enum {
VLC_CLEANUP_PUSH,
#include "libvlc.h"
-#if defined(__APPLE__)
-#include <sys/sysctl.h>
-#endif
-
-#if defined(__OpenBSD__)
-#include <sys/param.h>
-#include <sys/sysctl.h>
-#include <machine/cpu.h>
-#endif
-
-#if defined(__SunOS)
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/processor.h>
-#include <sys/pset.h>
-#endif
-
#if defined( __i386__ ) || defined( __x86_64__ ) || defined( __powerpc__ ) \
|| defined( __ppc__ ) || defined( __ppc64__ ) || defined( __powerpc64__ )
# ifndef WIN32
return cpu_flags;
}
-/**
- * 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(__SYMBIAN32__)
- return 1;
-#elif defined(HAVE_SCHED_GETAFFINITY)
- cpu_set_t cpu;
- CPU_ZERO(&cpu);
- if (sched_getaffinity(getpid(), 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(__OpenBSD__)
- int selectors[2] = { CTL_HW, HW_NCPU };
- int count;
- size_t size = sizeof(count) ;
- if (sysctl(selectors, 2, &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
-}
-
static vlc_memcpy_t pf_vlc_memcpy = memcpy;
void vlc_fastmem_register (vlc_memcpy_t cpy)
return (void*)((uintptr_t)(p + alignment - 1) & ~(alignment - 1));
#endif
}
-
#ifdef __APPLE__
# include <sys/time.h> /* gettimeofday in vlc_cond_timedwait */
# include <mach/mach_init.h> /* mach_task_self in semaphores */
+# include <sys/sysctl.h>
#endif
+#if defined(__OpenBSD__)
+# include <sys/param.h>
+# include <sys/sysctl.h>
+# include <machine/cpu.h>
+#endif
+
+#if defined(__SunOS)
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/processor.h>
+# include <sys/pset.h>
+#endif
+
+
/**
* Print a backtrace to the standard error for debugging purpose.
*/
{
return vlc_atomic_swap (&timer->overruns, 0);
}
+
+
+/**
+ * Count CPUs.
+ * @return number of available (logical) CPUs.
+ */
+unsigned vlc_GetCPUCount(void)
+{
+#if defined(HAVE_SCHED_GETAFFINITY)
+ cpu_set_t cpu;
+
+ CPU_ZERO(&cpu);
+ if (sched_getaffinity (getpid(), 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(__OpenBSD__)
+ int selectors[2] = { CTL_HW, HW_NCPU };
+ int count;
+ size_t size = sizeof(count);
+
+ if (sysctl (selectors, 2, &count, &size, NULL, 0))
+ return 1; /* Failure */
+ return count;
+
+#elif defined(__SunOS)
+ unsigned count = 0;
+ int type;
+ u_int numcpus;
+ processor_info_t cpuinfo;
+
+ processorid_t *cpulist = malloc (sizeof (*cpulist) * sysconf(_SC_NPROCESSORS_MAX));
+ if (unlikely(cpulist == NULL))
+ 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) == 0)
+ count += (cpuinfo.pi_state == P_ONLINE);
+ }
+ else
+ count = sysconf (_SC_NPROCESSORS_ONLN);
+ free (cpulist);
+ return count ? count : 1;
+
+#else
+# warning "vlc_GetCPUCount is not implemented for your platform"
+ return 1;
+#endif
+}
(void)timer;
return 0;
}
+
+
+/*** CPU ***/
+unsigned vlc_GetCPUCount (void)
+{
+#ifndef UNDER_CE
+ DWORD process;
+ DWORD system;
+
+ if (GetProcessAffinityMask (GetCurrentProcess(), &process, &system))
+ {
+ unsigned count = 0;
+ while (system)
+ {
+ count++;
+ system >>= 1;
+ }
+ return count;
+ }
+#endif
+ return 1;
+}