mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-16 11:30:20 +01:00
llvmpipe: Avoid deadlock when unloading opengl32.dll
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
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Cc: 10.2 10.3 <mesa-stable@lists.freedesktop.org>
(cherry picked from commit 706ad3b649)
Squashed together with:
llvmpipe: Call pipe_thread_wait() on Linux.
To address http://lists.freedesktop.org/archives/mesa-dev/2014-November/070569.html
In short, revert 706ad3b649 for non-Windows
OSes.
(cherry picked from commit d5b1731178)
This commit is contained in:
parent
9cc26056ee
commit
f285c7eaaf
1 changed files with 11 additions and 1 deletions
|
|
@ -800,6 +800,10 @@ static PIPE_THREAD_ROUTINE( thread_function, init_data )
|
|||
pipe_semaphore_signal(&task->work_done);
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
pipe_semaphore_signal(&task->work_done);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -885,9 +889,15 @@ 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++) {
|
||||
#ifdef _WIN32
|
||||
pipe_semaphore_wait(&rast->tasks[i].work_done);
|
||||
#else
|
||||
pipe_thread_wait(rast->threads[i]);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Clean up per-thread data */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue