diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/kit/threads.posix.c | 28 | ||||
-rw-r--r-- | source/kit/threads.win32.c | 42 |
2 files changed, 39 insertions, 31 deletions
diff --git a/source/kit/threads.posix.c b/source/kit/threads.posix.c index f8c20f9..9628bc7 100644 --- a/source/kit/threads.posix.c +++ b/source/kit/threads.posix.c @@ -40,6 +40,7 @@ # include <stdlib.h> # include <unistd.h> +# include "allocator.h" # include "threads.h" /* @@ -61,14 +62,15 @@ Implementation limits: - Conditionally emulation for "mutex with timeout" (see EMULATED_THREADS_USE_NATIVE_TIMEDLOCK macro) */ -struct impl_thrd_param { - thrd_start_t func; - void *arg; -}; +typedef struct { + thrd_start_t func; + void *arg; + kit_allocator_t alloc; +} impl_thrd_param_t; static void *impl_thrd_routine(void *p) { - struct impl_thrd_param pack = *((struct impl_thrd_param *) p); - free(p); + impl_thrd_param_t pack = *((impl_thrd_param_t *) p); + pack.alloc.deallocate(pack.alloc.state, p); return (void *) (intptr_t) pack.func(pack.arg); } @@ -230,16 +232,18 @@ int mtx_unlock(mtx_t *mtx) { /*------------------- 7.25.5 Thread functions -------------------*/ // 7.25.5.1 int thrd_create(thrd_t *thr, thrd_start_t func, void *arg) { - struct impl_thrd_param *pack; + impl_thrd_param_t *pack; assert(thr != NULL); - pack = (struct impl_thrd_param *) malloc( - sizeof(struct impl_thrd_param)); + kit_allocator_t alloc = kit_alloc_default(); + pack = (impl_thrd_param_t *) alloc.allocate( + alloc.state, sizeof(impl_thrd_param_t)); if (!pack) return thrd_nomem; - pack->func = func; - pack->arg = arg; + pack->func = func; + pack->arg = arg; + pack->alloc = alloc; if (pthread_create(thr, NULL, impl_thrd_routine, pack) != 0) { - free(pack); + alloc.deallocate(alloc.state, pack); return thrd_error; } return thrd_success; diff --git a/source/kit/threads.win32.c b/source/kit/threads.win32.c index faac143..ce77fab 100644 --- a/source/kit/threads.win32.c +++ b/source/kit/threads.win32.c @@ -39,6 +39,7 @@ # include <stdbool.h> # include <stdlib.h> +# include "allocator.h" # include "threads.h" # include "threads.win32.h" @@ -93,11 +94,12 @@ Implementation limits: - Emulated `mtx_timelock()' with mtx_trylock() + *busy loop* */ -struct impl_thrd_param { - thrd_start_t func; - void *arg; - thrd_t thrd; -}; +typedef struct { + thrd_start_t func; + void *arg; + thrd_t thrd; + kit_allocator_t alloc; +} impl_thrd_param_t; struct thrd_state { thrd_t thrd; @@ -107,13 +109,13 @@ struct thrd_state { static thread_local struct thrd_state impl_current_thread = { 0 }; static unsigned __stdcall impl_thrd_routine(void *p) { - struct impl_thrd_param *pack_p = (struct impl_thrd_param *) p; - struct impl_thrd_param pack; - int code; + impl_thrd_param_t *pack_p = (impl_thrd_param_t *) p; + impl_thrd_param_t pack; + int code; impl_current_thread.thrd = pack_p->thrd; impl_current_thread.handle_need_close = false; - memcpy(&pack, pack_p, sizeof(struct impl_thrd_param)); - free(p); + memcpy(&pack, pack_p, sizeof(impl_thrd_param_t)); + pack.alloc.deallocate(pack.alloc.state, p); code = pack.func(pack.arg); return (unsigned) code; } @@ -321,19 +323,21 @@ void __threads_win32_tls_callback(void) { /*------------------- 7.25.5 Thread functions -------------------*/ // 7.25.5.1 int thrd_create(thrd_t *thr, thrd_start_t func, void *arg) { - struct impl_thrd_param *pack; - uintptr_t handle; + impl_thrd_param_t *pack; + uintptr_t handle; assert(thr != NULL); - pack = (struct impl_thrd_param *) malloc( - sizeof(struct impl_thrd_param)); + kit_allocator_t alloc = kit_alloc_default(); + pack = (impl_thrd_param_t *) alloc.allocate( + alloc.state, (sizeof(impl_thrd_param_t))); if (!pack) return thrd_nomem; - pack->func = func; - pack->arg = arg; - handle = _beginthreadex(NULL, 0, impl_thrd_routine, pack, - CREATE_SUSPENDED, NULL); + pack->func = func; + pack->arg = arg; + pack->alloc = alloc; + handle = _beginthreadex(NULL, 0, impl_thrd_routine, pack, + CREATE_SUSPENDED, NULL); if (handle == 0) { - free(pack); + alloc.deallocate(alloc.state, pack); if (errno == EAGAIN || errno == EACCES) return thrd_nomem; return thrd_error; |