summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndre Heider <[email protected]>2018-11-06 09:27:12 +0100
committerAxel Davy <[email protected]>2018-11-09 22:37:26 +0100
commit10598c9667a9c5ea04ac8279549b1df8c026ef51 (patch)
tree4ad946ff7ee66829cc88dec5abd2ea8e1cd829be /src
parentd2b2364313c33cb27a97f1d6e257392cb4710935 (diff)
st/nine: fix stack corruption due to ABI mismatch
This fixes various crashes and hangs when using nine's 'thread_submit' feature. On 64bit, the thread function's data argument would just be NULL. On 32bit, the data argument would be garbage depending on the compiler flags (in my case -march>=core2). Fixes: f3fa7e3068512d ("st/nine: Use WINE thread for threadpool") Cc: [email protected] Signed-off-by: Andre Heider <[email protected]> Reviewed-by: Axel Davy <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/state_trackers/nine/threadpool.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/nine/threadpool.c b/src/gallium/state_trackers/nine/threadpool.c
index cc62fd25799..19721aab2dd 100644
--- a/src/gallium/state_trackers/nine/threadpool.c
+++ b/src/gallium/state_trackers/nine/threadpool.c
@@ -37,6 +37,7 @@
#include "os/os_thread.h"
#include "threadpool.h"
+/* POSIX thread function */
static void *
threadpool_worker(void *data)
{
@@ -76,6 +77,15 @@ threadpool_worker(void *data)
return NULL;
}
+/* Windows thread function */
+static DWORD NINE_WINAPI
+wthreadpool_worker(void *data)
+{
+ threadpool_worker(data);
+
+ return 0;
+}
+
struct threadpool *
_mesa_threadpool_create(struct NineSwapChain9 *swapchain)
{
@@ -87,7 +97,9 @@ _mesa_threadpool_create(struct NineSwapChain9 *swapchain)
pthread_mutex_init(&pool->m, NULL);
pthread_cond_init(&pool->new_work, NULL);
- pool->wthread = NineSwapChain9_CreateThread(swapchain, threadpool_worker, pool);
+ /* This uses WINE's CreateThread, so the thread function needs to use
+ * the Windows ABI */
+ pool->wthread = NineSwapChain9_CreateThread(swapchain, wthreadpool_worker, pool);
if (!pool->wthread) {
/* using pthread as fallback */
pthread_create(&pool->pthread, NULL, threadpool_worker, pool);