File: 0002-fix-imcompatible-cast.patch

package info (click to toggle)
wasix-libc 2025.07.07.1%2Bds-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 16,600 kB
  • sloc: ansic: 107,747; asm: 6,698; sh: 1,108; makefile: 978; awk: 301; python: 80; cpp: 29; sed: 9
file content (53 lines) | stat: -rw-r--r-- 1,508 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
diff --git a/libc-top-half/musl/src/thread/thrd_create.c b/libc-top-half/musl/src/thread/thrd_create.c
index d6f7879..d2fcfbb 100644
--- a/libc-top-half/musl/src/thread/thrd_create.c
+++ b/libc-top-half/musl/src/thread/thrd_create.c
@@ -1,12 +1,40 @@
 #include "pthread_impl.h"
 #include <threads.h>
 
-int thrd_create(thrd_t *thr, thrd_start_t func, void *arg)
-{
-	int ret = __pthread_create(thr, __ATTRP_C11_THREAD, (void *(*)(void *))(void *)func, arg);
-	switch (ret) {
-	case 0:      return thrd_success;
-	case EAGAIN: return thrd_nomem;
-	default:     return thrd_error;
-	}
+typedef struct {
+    thrd_start_t func;
+    void *arg;
+} thrd_wrapper_args_t;
+
+static void *thrd_wrapper(void *p) {
+    thrd_wrapper_args_t *args = (thrd_wrapper_args_t *)p;
+    thrd_start_t original_func = args->func;
+    void *original_arg = args->arg;
+
+    int result = original_func(original_arg);
+
+    free(args);
+
+    (void)result;
+
+    return NULL;
+}
+
+int thrd_create(thrd_t *thr, thrd_start_t func, void *arg) {
+    thrd_wrapper_args_t *wrapper_args = (thrd_wrapper_args_t *)malloc(sizeof(thrd_wrapper_args_t));
+    if (wrapper_args == NULL) {
+        return thrd_nomem;
+    }
+    wrapper_args->func = func;
+    wrapper_args->arg = arg;
+
+    int ret = __pthread_create(thr, __ATTRP_C11_THREAD, thrd_wrapper, wrapper_args);
+
+    if (ret == 0) {
+        return thrd_success;
+    } else if (ret == EAGAIN) {
+        return thrd_nomem;
+    } else {
+        return thrd_error;
+    }
 }