<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>