From: Søren Sandmann Pedersen <s...@redhat.com> Get rid of the initialized and have_vmx static variables in pixman-ppc.c There is no point to them since CPU detection only happens once per process.
On Linux, just read /proc/self/auxv instead of generating the filename with getpid() and don't bother with the stack buffer. Instead just read the aux entries one by one. --- pixman/pixman-ppc.c | 113 +++++++++++++++++---------------------------------- 1 file changed, 38 insertions(+), 75 deletions(-) diff --git a/pixman/pixman-ppc.c b/pixman/pixman-ppc.c index 786f204..f1bea1e 100644 --- a/pixman/pixman-ppc.c +++ b/pixman/pixman-ppc.c @@ -31,26 +31,20 @@ * "-maltivec -mabi=altivec", as gcc would try to save vector register * across function calls causing SIGILL on cpus without Altivec/vmx. */ -static pixman_bool_t initialized = FALSE; -static volatile pixman_bool_t have_vmx = TRUE; - #ifdef __APPLE__ #include <sys/sysctl.h> static pixman_bool_t pixman_have_vmx (void) { - if (!initialized) - { - size_t length = sizeof(have_vmx); - int error = - sysctlbyname ("hw.optional.altivec", &have_vmx, &length, NULL, 0); + size_t length = sizeof(have_vmx); + int error, have_mmx; - if (error) - have_vmx = FALSE; + sysctlbyname ("hw.optional.altivec", &have_vmx, &length, NULL, 0); + + if (error) + return FALSE; - initialized = TRUE; - } return have_vmx; } @@ -62,22 +56,20 @@ pixman_have_vmx (void) static pixman_bool_t pixman_have_vmx (void) { - if (!initialized) - { - int mib[2] = { CTL_MACHDEP, CPU_ALTIVEC }; - size_t length = sizeof(have_vmx); - int error = - sysctl (mib, 2, &have_vmx, &length, NULL, 0); + int mib[2] = { CTL_MACHDEP, CPU_ALTIVEC }; + size_t length = sizeof(have_vmx); + int error, have_vmx; - if (error != 0) - have_vmx = FALSE; + error = sysctl (mib, 2, &have_vmx, &length, NULL, 0); + + if (error != 0) + return FALSE; - initialized = TRUE; - } return have_vmx; } #elif defined (__linux__) + #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> @@ -89,51 +81,27 @@ pixman_have_vmx (void) static pixman_bool_t pixman_have_vmx (void) { - if (!initialized) + int have_vmx = FALSE; + int fd; + struct { - char fname[64]; - unsigned long buf[64]; - ssize_t count = 0; - pid_t pid; - int fd, i; + unsigned long type; + unsigned long value; + } aux; - pid = getpid (); - snprintf (fname, sizeof(fname) - 1, "/proc/%d/auxv", pid); - - fd = open (fname, O_RDONLY); - if (fd >= 0) + fd = open ("/proc/self/auxv", O_RDONLY); + if (fd >= 0) + { + while (read (fd, &aux, sizeof (aux)) == sizeof (aux)) { - for (i = 0; i <= (count / sizeof(unsigned long)); i += 2) + if (aux.type == AT_HWCAP && (aux.value & PPC_FEATURE_HAS_ALTIVEC)) { - /* Read more if buf is empty... */ - if (i == (count / sizeof(unsigned long))) - { - count = read (fd, buf, sizeof(buf)); - if (count <= 0) - break; - i = 0; - } - - if (buf[i] == AT_HWCAP) - { - have_vmx = !!(buf[i + 1] & PPC_FEATURE_HAS_ALTIVEC); - initialized = TRUE; - break; - } - else if (buf[i] == AT_NULL) - { - break; - } + have_vmx = TRUE; + break; } - close (fd); } - } - if (!initialized) - { - /* Something went wrong. Assume 'no' rather than playing - fragile tricks with catching SIGILL. */ - have_vmx = FALSE; - initialized = TRUE; + + close (fd); } return have_vmx; @@ -159,22 +127,17 @@ pixman_have_vmx (void) struct sigaction sa, osa; int jmp_result; - if (!initialized) + sa.sa_flags = SA_SIGINFO; + sigemptyset (&sa.sa_mask); + sa.sa_sigaction = vmx_test; + sigaction (SIGILL, &sa, &osa); + jmp_result = setjmp (jump_env); + if (jmp_result == 0) { - sa.sa_flags = SA_SIGINFO; - sigemptyset (&sa.sa_mask); - sa.sa_sigaction = vmx_test; - sigaction (SIGILL, &sa, &osa); - jmp_result = setjmp (jump_env); - if (jmp_result == 0) - { - asm volatile ( "vor 0, 0, 0" ); - } - sigaction (SIGILL, &osa, NULL); - have_vmx = (jmp_result == 0); - initialized = TRUE; + asm volatile ( "vor 0, 0, 0" ); } - return have_vmx; + sigaction (SIGILL, &osa, NULL); + return (jmp_result == 0); } #endif /* __APPLE__ */ -- 1.7.10.4 _______________________________________________ Pixman mailing list Pixman@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/pixman