From: Jose Fonseca Date: Thu, 16 Apr 2015 12:08:56 +0000 (+0100) Subject: libgl-gdi: Prevent "pure virtual method called" error when. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8638e3ae1b33a887f24a6e50bdb722361ee9414c;p=mesa.git libgl-gdi: Prevent "pure virtual method called" error when. When running piglit w/ llvmpipe on Windows several tests terminate abnormally just when the test exits. The problem was that LLVMContextDispose was being called after LLVM global destructors. Reviewed-by: Roland Scheidegger --- diff --git a/src/gallium/targets/libgl-gdi/libgl_gdi.c b/src/gallium/targets/libgl-gdi/libgl_gdi.c index a2fb161c682..922c18667ee 100644 --- a/src/gallium/targets/libgl-gdi/libgl_gdi.c +++ b/src/gallium/targets/libgl-gdi/libgl_gdi.c @@ -38,6 +38,7 @@ #include "util/u_debug.h" #include "stw_winsys.h" +#include "stw_device.h" #include "gdi/gdi_sw_winsys.h" #include "softpipe/sp_texture.h" @@ -143,8 +144,12 @@ static const struct stw_winsys stw_winsys = { }; +EXTERN_C BOOL WINAPI +DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); + + BOOL WINAPI -DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) +DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: @@ -161,9 +166,22 @@ DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) break; case DLL_PROCESS_DETACH: - if (lpReserved == NULL) { + if (lpvReserved == NULL) { + // We're being unloaded from the process. stw_cleanup_thread(); stw_cleanup(); + } else { + // Process itself is terminating, and all threads and modules are + // being detached. + // + // The order threads (including llvmpipe rasterizer threads) are + // destroyed can not be relied up, so it's not safe to cleanup. + // + // However global destructors (e.g., LLVM's) will still be called, and + // if Microsoft OPENGL32.DLL's DllMain is called after us, it will + // still try to invoke DrvDeleteContext to destroys all outstanding, + // so set stw_dev to NULL to return immediately if that happens. + stw_dev = NULL; } break; }