[PATCH 2/5] wined3d: Avoid unmapping the module while the CS thread is still running.

Henri Verbeet hverbeet at codeweavers.com
Wed Apr 19 16:40:50 CDT 2017


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 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;
 
-- 
2.1.4




More information about the wine-patches mailing list