Added vlc_GetCPUCount() to retreive the number of available CPU.

It is implemented for win32 and when sched_getaffinity() is available.
This commit is contained in:
Laurent Aimar 2010-05-03 21:54:28 +02:00
parent 529a7a1af6
commit 933d6755d4
4 changed files with 35 additions and 1 deletions

View File

@ -556,7 +556,7 @@ AC_CHECK_FUNCS(fdatasync,,
])
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>])

View File

@ -63,6 +63,7 @@
# 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.

View File

@ -493,6 +493,7 @@ vlc_sem_destroy
vlc_sem_post
vlc_sem_wait
vlc_control_cancel
vlc_GetCPUCount
vlc_CPU
vlc_error
vlc_event_attach

View File

@ -318,6 +318,38 @@ const struct
#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