<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Oct 1, 2019 at 12:17 AM Hans-Kristian Arntzen <<a href="mailto:post@arntzen-software.no">post@arntzen-software.no</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+typedef struct pthread<br>
+{<br>
+    HANDLE thread;<br>
+    DWORD id;<br>
+} pthread_t;<br>
+<br>
+typedef struct pthread_mutex<br>
+{<br>
+    CRITICAL_SECTION *lock;<br>
+} pthread_mutex_t;<br>
+<br>
+typedef struct pthread_cond<br>
+{<br>
+    CONDITION_VARIABLE *cond;<br>
+} pthread_cond_t;<br>
+<br>
+struct vkd3d_pthread_wrapper_struct<br>
+{<br>
+    void * (*routine)(void *);<br>
+    void *arg;<br>
+};<br>
+<br>
+static DWORD WINAPI win32_thread_wrapper_routine(struct vkd3d_pthread_wrapper_struct *wrapper)<br>
+{<br>
+    struct vkd3d_pthread_wrapper_struct tmp = *wrapper;<br>
+    vkd3d_free(wrapper);<br>
+    tmp.routine(tmp.arg);<br>
+    return 0;<br>
+}<br>
<br></blockquote><div><br></div><div>FWIW, ZStandard avoids complications with thread wrapping by declaring the function pointer and arg within its pthread_t struct:</div><div><a href="https://github.com/facebook/zstd/blob/dev/lib/common/threading.h">https://github.com/facebook/zstd/blob/dev/lib/common/threading.h</a></div></div></div>