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;
+ }
}
|