Module: wine Branch: master Commit: b5d225e4524adc90197ae152946537226965124f URL: http://source.winehq.org/git/wine.git/?a=commit;h=b5d225e4524adc90197ae15294...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed Apr 19 23:40:50 2017 +0200
wined3d: Avoid unmapping the module while the CS thread is still running.
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/cs.c | 12 +++++++++++- dlls/wined3d/wined3d_private.h | 1 + 2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 43352eb..a579503 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -2451,7 +2451,7 @@ static DWORD WINAPI wined3d_cs_run(void *ctx)
queue->tail = queue->head = 0; TRACE("Stopped.\n"); - return 0; + FreeLibraryAndExitThread(cs->wined3d_module, 0); }
struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) @@ -2490,9 +2490,19 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) goto fail; }
+ if (!(GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, + (const WCHAR *)wined3d_cs_run, &cs->wined3d_module))) + { + ERR("Failed to get wined3d module handle.\n"); + CloseHandle(cs->event); + HeapFree(GetProcessHeap(), 0, cs->data); + goto fail; + } + if (!(cs->thread = CreateThread(NULL, 0, wined3d_cs_run, cs, 0, NULL))) { ERR("Failed to create wined3d command stream thread.\n"); + FreeLibrary(cs->wined3d_module); CloseHandle(cs->event); HeapFree(GetProcessHeap(), 0, cs->data); goto fail; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index cd90eb8..578060a 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3253,6 +3253,7 @@ struct wined3d_cs struct wined3d_device *device; struct wined3d_fb_state fb; struct wined3d_state state; + HMODULE wined3d_module; HANDLE thread; DWORD thread_id;