diff options
Diffstat (limited to 'frontend/3ds/pthread.h')
-rw-r--r-- | frontend/3ds/pthread.h | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/frontend/3ds/pthread.h b/frontend/3ds/pthread.h new file mode 100644 index 0000000..2c2bf6b --- /dev/null +++ b/frontend/3ds/pthread.h @@ -0,0 +1,56 @@ + +#ifndef _3DS_PTHREAD_WRAP__ +#define _3DS_PTHREAD_WRAP__ + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include "3ds_utils.h" + +#define CTR_PTHREAD_STACK_SIZE 0x10000 + +typedef struct +{ + int32_t handle; + uint32_t* stack; +}pthread_t; +typedef int pthread_attr_t; + +static inline int pthread_create(pthread_t *thread, + const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg) +{ + + thread->stack = linearMemAlign(CTR_PTHREAD_STACK_SIZE, 8); + + svcCreateThread(&thread->handle, start_routine, arg, + (uint32_t*)((uint32_t)thread->stack + CTR_PTHREAD_STACK_SIZE), + 0x25, 1); + + return 1; +} + + +static inline int pthread_join(pthread_t thread, void **retval) +{ + (void)retval; + + if(svcWaitSynchronization(thread.handle, INT64_MAX)) + return -1; + + linearFree(thread.stack); + + return 0; +} + + +static inline void pthread_exit(void *retval) +{ + (void)retval; + + svcExitThread(); +} + + +#endif //_3DS_PTHREAD_WRAP__ + |