Reviewed-by: Roland Scheidegger <srol...@vmware.com> Am 07.11.2014 um 17:52 schrieb jfons...@vmware.com: > From: José Fonseca <jfons...@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-sta...@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 */ >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev