[vlc-devel] commit: CPU: get rid of signal(SIGILL) - not thread-safe (in LibVLC) ( Rémi Denis-Courmont )
xxcv
xxcv07 at gmail.com
Sat Aug 22 04:12:31 CEST 2009
git version control wrote:
> vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri Aug 21 22:26:51 2009 +0300| [3a372aa5038f4237e6aa2ed4dd47c9bb14e91fee] | committer: Rémi Denis-Courmont
>
> CPU: get rid of signal(SIGILL) - not thread-safe (in LibVLC)
>
> This also gets rid of one user of setjmp(), but it is still found in
> the (stupid?) PNG codec and OS X interfaces.
>
>
>> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3a372aa5038f4237e6aa2ed4dd47c9bb14e91fee
>>
> ---
>
> src/misc/cpu.c | 121 +++++++++++++++++++++----------------------------------
> 1 files changed, 46 insertions(+), 75 deletions(-)
>
> diff --git a/src/misc/cpu.c b/src/misc/cpu.c
> index b5d0e47..7ddf541 100644
> --- a/src/misc/cpu.c
> +++ b/src/misc/cpu.c
> @@ -32,8 +32,12 @@
>
> #include <vlc_common.h>
>
> +#include <sys/types.h>
> #include <signal.h> /* SIGHUP, SIGINT, SIGKILL */
> -#include <setjmp.h> /* longjmp, setjmp */
> +#ifndef WIN32
> +#include <unistd.h>
> +#include <sys/wait.h>
> +#endif
>
> #include "libvlc.h"
>
> @@ -41,24 +45,33 @@
> #include <sys/sysctl.h>
> #endif
>
> -/*****************************************************************************
> - * Local prototypes
> - *****************************************************************************/
> -static void SigHandler ( int );
> +#if defined( __i386__ ) || defined( __x86_64__ ) \
> + || defined( __ppc__ ) || defined( __ppc64__ )
> +static bool check_OS_capability( const char *psz_capability, pid_t pid )
>
what is the point checking os cap if you are cross compiling ?!
> +{
> +#ifndef WIN32
> + int status;
>
> -/*****************************************************************************
> - * Global variables - they're needed for signal handling
> - *****************************************************************************/
> -static jmp_buf env;
> -static int i_illegal;
> + if( pid == -1 )
> + return false; /* fail safe :-/ */
> +
> + while( waitpid( pid, &status, 0 ) == -1 );
> +
> + if( WIFEXITED( status ) && WEXITSTATUS( status ) == 0 )
> + return true;
>
> -#if defined( __i386__ ) || defined( __x86_64__ )
> -static void warn_cap( const char *psz_capability )
> -{
> fprintf( stderr, "warning: your CPU has %s instructions, but not your "
> "operating system.\n", psz_capability );
> fprintf( stderr, " some optimizations will be disabled unless "
> "you upgrade your OS\n" );
> + return false;
> +#else
> +# warning FIXME!
> +# define fork() (errno = ENOSYS, -1)
> + (void)pid;
> + (void)psz_capability;
> + return true;
> +#endif
> }
> #endif
>
> @@ -69,11 +82,11 @@ static void warn_cap( const char *psz_capability )
> *****************************************************************************/
> uint32_t CPUCapabilities( void )
> {
> - volatile uint32_t i_capabilities = CPU_CAPABILITY_NONE;
> + uint32_t i_capabilities = CPU_CAPABILITY_NONE;
>
> #if defined( __i386__ ) || defined( __x86_64__ )
> - volatile unsigned int i_eax, i_ebx, i_ecx, i_edx;
> - volatile bool b_amd;
> + unsigned int i_eax, i_ebx, i_ecx, i_edx;
> + bool b_amd;
>
> /* Needed for x86 CPU capabilities detection */
> # if defined( __x86_64__ )
> @@ -100,10 +113,6 @@ uint32_t CPUCapabilities( void )
> : "cc" );
> # endif
>
> -# if defined( CAN_COMPILE_SSE ) || defined ( CAN_COMPILE_3DNOW )
> - void (*pf_sigill) (int) = signal( SIGILL, SigHandler );
> -# endif
> -
> i_capabilities |= CPU_CAPABILITY_FPU;
>
> # if defined( __i386__ )
> @@ -159,37 +168,31 @@ uint32_t CPUCapabilities( void )
>
> # ifdef CAN_COMPILE_SSE
> /* We test if OS supports the SSE instructions */
> - i_illegal = 0;
> -
> - if( setjmp( env ) == 0 )
> + pid_t pid = fork();
> + if( pid == 0 )
> {
> /* Test a SSE instruction */
> __asm__ __volatile__ ( "xorps %%xmm0,%%xmm0\n" : : );
> + exit(0);
> }
> -
> - if( i_illegal == 0 )
> + if( check_OS_capability( "SSE", pid ) )
> i_capabilities |= CPU_CAPABILITY_SSE;
> - else
> - warn_cap( "SSE" );
> # endif
> }
>
> if( i_edx & 0x04000000 )
> {
> # if defined(CAN_COMPILE_SSE)
> - /* We test if OS supports the SSE instructions */
> - i_illegal = 0;
> -
> - if( setjmp( env ) == 0 )
> + /* We test if OS supports the SSE2 instructions */
> + pid_t pid = fork();
> + if( pid == 0 )
> {
> /* Test a SSE2 instruction */
> __asm__ __volatile__ ( "movupd %%xmm0, %%xmm0\n" : : );
> + exit(0);
> }
> -
> - if( i_illegal == 0 )
> + if( check_OS_capability( "SSE2", pid ) )
> i_capabilities |= CPU_CAPABILITY_SSE2;
> - else
> - warn_cap( "SSE2" );
> # endif
> }
>
> @@ -205,18 +208,15 @@ uint32_t CPUCapabilities( void )
> # ifdef CAN_COMPILE_3DNOW
> if( i_edx & 0x80000000 )
> {
> - i_illegal = 0;
> -
> - if( setjmp( env ) == 0 )
> + pid_t pid = fork();
> + if( pid == 0 )
> {
> /* Test a 3D Now! instruction */
> __asm__ __volatile__ ( "pfadd %%mm0,%%mm0\n" "femms\n" : : );
> + exit(0);
> }
> -
> - if( i_illegal == 0 )
> + if( check_OS_capability( "3D Now!", pid ) )
> i_capabilities |= CPU_CAPABILITY_3DNOW;
> - else
> - warn_cap( "3D Now!" );
> }
> # endif
>
> @@ -224,11 +224,7 @@ uint32_t CPUCapabilities( void )
> {
> i_capabilities |= CPU_CAPABILITY_MMXEXT;
> }
> -
> out:
> -# if defined( CAN_COMPILE_SSE ) || defined ( CAN_COMPILE_3DNOW )
> - signal( SIGILL, pf_sigill );
> -# endif
>
> #elif defined( __arm__ )
> # if defined( __ARM_EABI__ ) && !defined( __SOFTFP__ )
> @@ -249,24 +245,19 @@ out:
> i_capabilities |= CPU_CAPABILITY_ALTIVEC;
>
> # elif defined( CAN_COMPILE_ALTIVEC )
> - void (*pf_sigill) (int) = signal( SIGILL, SigHandler );
> -
> - i_illegal = 0;
> -
> - if( setjmp( env ) == 0 )
> + pid_t pid = fork();
> + if( pid == 0 )
> {
> asm volatile ("mtspr 256, %0\n\t"
> "vand %%v0, %%v0, %%v0"
> :
> : "r" (-1));
> + exit(0);
> }
>
> - if( i_illegal == 0 )
> + if( check_OS_capability( "Altivec", pid ) )
> i_capabilities |= CPU_CAPABILITY_ALTIVEC;
>
> - signal( SIGILL, pf_sigill );
> -# else
> - (void)SigHandler; /* Don't complain about dead code here */
> # endif
>
> #elif defined( __sparc__ )
> @@ -279,26 +270,6 @@ out:
> return i_capabilities;
> }
>
> -/*****************************************************************************
> - * SigHandler: system signal handler
> - *****************************************************************************
> - * This function is called when an illegal instruction signal is received by
> - * the program. We use this function to test OS and CPU capabilities
> - *****************************************************************************/
> -static void SigHandler( int i_signal )
> -{
> - /* Acknowledge the signal received */
> - i_illegal = 1;
> -
> -#ifdef HAVE_SIGRELSE
> - sigrelse( i_signal );
> -#else
> - VLC_UNUSED( i_signal );
> -#endif
> - longjmp( env, 1 );
> -}
> -
> -
> uint32_t cpu_flags = 0;
>
>
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20090822/d45057b1/attachment.html>
More information about the vlc-devel
mailing list