-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Chia-I Wu wrote:
> Multiple threads might call _glapi_check_multithread at roughly the same
> time.  It is possbile that all of them are wrongly regarded as firstCall
> if there is no mutex.  This bug causes xeglthreads to crash sometimes.

Acked-by: Ian Romanick <[email protected]>

> ---
>  src/mesa/glapi/glapi.c |   29 +++++++++++++++--------------
>  1 files changed, 15 insertions(+), 14 deletions(-)
> 
> diff --git a/src/mesa/glapi/glapi.c b/src/mesa/glapi/glapi.c
> index 2b105d0..30aec20 100644
> --- a/src/mesa/glapi/glapi.c
> +++ b/src/mesa/glapi/glapi.c
> @@ -198,6 +198,7 @@ PUBLIC const void *_glapi_Context = NULL;
>  
>  #if defined(THREADS)
>  
> +_glthread_DECLARE_STATIC_MUTEX(ThreadCheckMutex);
>  static GLboolean ThreadSafe = GL_FALSE;  /**< In thread-safe mode? */
>  _glthread_TSD _gl_DispatchTSD;           /**< Per-thread dispatch pointer */
>  static _glthread_TSD ContextTSD;         /**< Per-thread context pointer */
> @@ -231,23 +232,23 @@ void
>  _glapi_check_multithread(void)
>  {
>  #if defined(THREADS) && !defined(GLX_USE_TLS)
> -   if (!ThreadSafe) {
> -      static unsigned long knownID;
> -      static GLboolean firstCall = GL_TRUE;
> -      if (firstCall) {
> -         knownID = _glthread_GetID();
> -         firstCall = GL_FALSE;
> -      }
> -      else if (knownID != _glthread_GetID()) {
> -         ThreadSafe = GL_TRUE;
> -         _glapi_set_dispatch(NULL);
> -         _glapi_set_context(NULL);
> -      }
> +   static unsigned long knownID;
> +   static GLboolean firstCall = GL_TRUE;
> +
> +   if (ThreadSafe)
> +      return;
> +
> +   _glthread_LOCK_MUTEX(ThreadCheckMutex);
> +   if (firstCall) {
> +      knownID = _glthread_GetID();
> +      firstCall = GL_FALSE;
>     }
> -   else if (!_glapi_get_dispatch()) {
> -      /* make sure that this thread's dispatch pointer isn't null */
> +   else if (knownID != _glthread_GetID()) {
> +      ThreadSafe = GL_TRUE;
>        _glapi_set_dispatch(NULL);
> +      _glapi_set_context(NULL);
>     }
> +   _glthread_UNLOCK_MUTEX(ThreadCheckMutex);
>  #endif
>  }
>  

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkpXjiEACgkQX1gOwKyEAw9OCQCeK7Vn+l01m3AHShHKQ9HP9ASO
q9UAoIKSlU5ZH3W/PPUTNDYHUDy6cxVp
=G/ic
-----END PGP SIGNATURE-----

------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to