[Mesa-dev] [PATCH] llvmpipe: Avoid deadlock when unloading opengl32.dll

Roland Scheidegger sroland at vmware.com
Fri Nov 7 09:14:58 PST 2014


Reviewed-by: Roland Scheidegger <sroland at vmware.com>

Am 07.11.2014 um 17:52 schrieb jfonseca at vmware.com:
> From: José Fonseca <jfonseca at vmware.com>
> 
> On Windows, DllMain calls and thread creation/destruction are
> serialized, so when llvmpipe is destroyed from DllMain waiting for the
> rasterizer threads to finish will deadlock.
> 
> So, instead of waiting for rasterizer threads to have finished, simply wait for the
> rasterizer threads to notify they are just about to finish.
> 
> Verified with this very simple program:
> 
>    #include <windows.h>
>    int main() {
>       HMODULE hModule = LoadLibraryA("opengl32.dll");
>       FreeLibrary(hModule);
>    }
> 
> Fixes https://bugs.freedesktop.org/show_bug.cgi?id=76252
> 
> Cc: 10.2 10.3 <mesa-stable at lists.freedesktop.org>
> ---
>  src/gallium/drivers/llvmpipe/lp_rast.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c
> index a3420a2..6b54d43 100644
> --- a/src/gallium/drivers/llvmpipe/lp_rast.c
> +++ b/src/gallium/drivers/llvmpipe/lp_rast.c
> @@ -800,6 +800,8 @@ static PIPE_THREAD_ROUTINE( thread_function, init_data )
>        pipe_semaphore_signal(&task->work_done);
>     }
>  
> +   pipe_semaphore_signal(&task->work_done);
> +
>     return 0;
>  }
>  
> @@ -885,9 +887,11 @@ void lp_rast_destroy( struct lp_rasterizer *rast )
>        pipe_semaphore_signal(&rast->tasks[i].work_ready);
>     }
>  
> -   /* Wait for threads to terminate before cleaning up per-thread data */
> +   /* Wait for threads to terminate before cleaning up per-thread data.
> +    * We don't actually call pipe_thread_wait to avoid dead lock on Windows
> +    * per https://bugs.freedesktop.org/show_bug.cgi?id=76252 */
>     for (i = 0; i < rast->num_threads; i++) {
> -      pipe_thread_wait(rast->threads[i]);
> +      pipe_semaphore_wait(&rast->tasks[i].work_done);
>     }
>  
>     /* Clean up per-thread data */
> 



More information about the mesa-dev mailing list