Alexandre Julliard : vkd3d: Add a create thread implementation for Windows.

Alexandre Julliard julliard at winehq.org
Mon Feb 7 15:55:37 CST 2022


Module: vkd3d
Branch: master
Commit: c78174f004d332609ef7e6c64cc090f7921e4b60
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=c78174f004d332609ef7e6c64cc090f7921e4b60

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Feb  7 13:54:35 2022 +0100

vkd3d: Add a create thread implementation for Windows.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>

---

 libs/vkd3d/device.c        | 42 ++++++++++++++++++++++++++++++++++++++++++
 libs/vkd3d/vkd3d_private.h | 14 ++++++++++----
 2 files changed, 52 insertions(+), 4 deletions(-)

diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index fe90eb3..3360fd6 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -4037,6 +4037,23 @@ void d3d12_device_mark_as_removed(struct d3d12_device *device, HRESULT reason,
     device->removed_reason = reason;
 }
 
+
+#ifdef _WIN32
+struct thread_data
+{
+    PFN_vkd3d_thread main_pfn;
+    void *data;
+};
+
+static DWORD WINAPI call_thread_main(void *data)
+{
+    struct thread_data *thread_data = data;
+    thread_data->main_pfn(thread_data->data);
+    vkd3d_free(thread_data);
+    return 0;
+}
+#endif
+
 HRESULT vkd3d_create_thread(struct vkd3d_instance *instance,
         PFN_vkd3d_thread thread_main, void *data, union vkd3d_thread_handle *thread)
 {
@@ -4053,11 +4070,27 @@ HRESULT vkd3d_create_thread(struct vkd3d_instance *instance,
     }
     else
     {
+#ifdef _WIN32
+        struct thread_data *thread_data;
+
+        if (!(thread_data = vkd3d_malloc(sizeof(*thread_data))))
+            return E_OUTOFMEMORY;
+
+        thread_data->main_pfn = thread_main;
+        thread_data->data = data;
+        if (!(thread->handle = CreateThread(NULL, 0, call_thread_main, thread_data, 0, NULL)))
+        {
+            ERR("Failed to create thread, error %d.\n", GetLastError());
+            vkd3d_free(thread_data);
+            hr = E_FAIL;
+        }
+#else
         if ((rc = pthread_create(&thread->pthread, NULL, thread_main, data)))
         {
             ERR("Failed to create thread, error %d.\n", rc);
             hr = hresult_from_errno(rc);
         }
+#endif
     }
 
     return hr;
@@ -4075,11 +4108,20 @@ HRESULT vkd3d_join_thread(struct vkd3d_instance *instance, union vkd3d_thread_ha
     }
     else
     {
+#ifdef _WIN32
+        if ((rc = WaitForSingleObject(thread->handle, INFINITE)) != WAIT_OBJECT_0)
+        {
+            ERR("Failed to wait for thread, ret %#x.\n", rc);
+            hr = E_FAIL;
+        }
+        CloseHandle(thread->handle);
+#else
         if ((rc = pthread_join(thread->pthread, NULL)))
         {
             ERR("Failed to join thread, error %d.\n", rc);
             hr = hresult_from_errno(rc);
         }
+#endif
     }
 
     return hr;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index ece1113..67989c1 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -40,7 +40,6 @@
 #include <assert.h>
 #include <inttypes.h>
 #include <limits.h>
-#include <pthread.h>
 #include <stdbool.h>
 
 #define VK_CALL(f) (vk_procs->f)
@@ -169,14 +168,13 @@ struct vkd3d_instance
     LONG refcount;
 };
 
+#ifdef _WIN32
+
 union vkd3d_thread_handle
 {
-    pthread_t pthread;
     void *handle;
 };
 
-#ifdef _WIN32
-
 struct vkd3d_mutex
 {
     CRITICAL_SECTION lock;
@@ -241,6 +239,14 @@ static inline int vkd3d_cond_destroy(struct vkd3d_cond *cond)
 
 #else  /* _WIN32 */
 
+#include <pthread.h>
+
+union vkd3d_thread_handle
+{
+    pthread_t pthread;
+    void *handle;
+};
+
 struct vkd3d_mutex
 {
     pthread_mutex_t lock;




More information about the wine-cvs mailing list