Commit 497f9aff authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

vlc_GetCPUCount(): move to thread subsystem (cosmetic)

parent 13c9ba8e
......@@ -63,7 +63,6 @@
# 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.
......
......@@ -205,6 +205,8 @@ VLC_API void vlc_timer_destroy(vlc_timer_t);
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,
......
......@@ -45,23 +45,6 @@
#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
......@@ -317,73 +300,6 @@ unsigned vlc_CPU (void)
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)
......@@ -427,4 +343,3 @@ void *vlc_memalign(void **base, size_t alignment, size_t size)
return (void*)((uintptr_t)(p + alignment - 1) & ~(alignment - 1));
#endif
}
......@@ -50,8 +50,23 @@
#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.
*/
......@@ -1008,3 +1023,66 @@ unsigned vlc_timer_getoverrun (vlc_timer_t timer)
{
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
}
......@@ -906,3 +906,25 @@ unsigned vlc_timer_getoverrun (vlc_timer_t timer)
(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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment