[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