X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fcpu.c;h=71aed9dc16187a0e401e7bef1c73bdb039975ffe;hb=fd907c9abaa6304442ced84809bdb53600c922ca;hp=a11a62876dca94f2f306b715574f8921e919a284;hpb=9c4f46a63990e9fad33991eb12f90945b36e0bab;p=vlc diff --git a/src/misc/cpu.c b/src/misc/cpu.c index a11a62876d..71aed9dc16 100644 --- a/src/misc/cpu.c +++ b/src/misc/cpu.c @@ -41,13 +41,21 @@ #else #include #endif +#include #include "libvlc.h" -#if defined(__APPLE__) && (defined(__ppc__) || defined(__ppc64__)) +#if defined(__APPLE__) #include #endif +#if defined(__SunOS) +#include +#include +#include +#include +#endif + #if defined( __i386__ ) || defined( __x86_64__ ) || defined( __powerpc__ ) \ || defined( __ppc__ ) || defined( __ppc64__ ) || defined( __powerpc64__ ) # ifndef WIN32 @@ -70,7 +78,7 @@ static bool check_OS_capability( const char *psz_capability, pid_t pid ) return false; } -# define check_capability(name, flag, code) \ +# define check_capability(name, flag, code) \ do { \ pid_t pid = fork(); \ if( pid == 0 ) \ @@ -84,7 +92,8 @@ static bool check_OS_capability( const char *psz_capability, pid_t pid ) } while(0) # else /* WIN32 */ -# define check_capability(name, flag, code) (void)0 +# define check_capability(name, flag, code) \ + i_capabilities |= (flag); # endif #endif @@ -310,13 +319,71 @@ const struct { CPU_CAPABILITY_SSE, "sse" }, #endif #if defined (__ppc__) || defined (__ppc64__) || defined (__powerpc__) - { CPU_CAPABILITY_ALTIVEC, "altivec" }, + { CPU_CAPABILITY_ALTIVEC, "altivec" }, #endif #if defined (__arm__) { CPU_CAPABILITY_NEON, "arm_neon" }, #endif }; +/** + * 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 +} + /** * Check if a directory name contains usable plugins w.r.t. the hardware * capabilities. Loading a plugin when the hardware has insufficient @@ -366,3 +433,32 @@ void *vlc_memset (void *tgt, int c, size_t n) { return pf_vlc_memset (tgt, c, n); } + +/** + * Returned an aligned pointer on newly allocated memory. + * \param alignment must be a power of 2 and a multiple of sizeof(void*) + * \param size is the size of the usable memory returned. + * + * It must not be freed directly, *base must. + */ +void *vlc_memalign(void **base, size_t alignment, size_t size) +{ + assert(alignment >= sizeof(void*)); + for (size_t t = alignment; t > 1; t >>= 1) + assert((t&1) == 0); +#if defined(HAVE_POSIX_MEMALIGN) + if (posix_memalign(base, alignment, size)) { + *base = NULL; + return NULL; + } + return *base; +#elif defined(HAVE_MEMALIGN) + return *base = memalign(alignment, size); +#else + unsigned char *p = *base = malloc(size + alignment - 1); + if (!p) + return NULL; + return (void*)((uintptr_t)(p + alignment - 1) & ~(alignment - 1)); +#endif +} +