X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/92f6e64a6da763c45ff9f4ab5eafcab3d8766dcb..b60166b327a9108b07e3069fa6568a451529ffd9:/lunaix-os/usr/libc/src/pthread.c diff --git a/lunaix-os/usr/libc/src/pthread.c b/lunaix-os/usr/libc/src/pthread.c new file mode 100644 index 0000000..08c82e0 --- /dev/null +++ b/lunaix-os/usr/libc/src/pthread.c @@ -0,0 +1,66 @@ +#include +#include + +static void* +__pthread_routine_wrapper(void *(*start_routine)(void*), void* arg) +{ + void* ret = start_routine(arg); + + do_lunaix_syscall(__SYSCALL_th_exit, ret); + + return ret; // should not reach +} + +int +pthread_create(pthread_t* thread, + const pthread_attr_t* attr, + void *(*start_routine)(void*), void* arg) +{ + // FIXME attr currently not used + + struct uthread_info th_info; + int ret = do_lunaix_syscall(__SYSCALL_th_create, thread, &th_info, __pthread_routine_wrapper, NULL); + + if (ret) { + return ret; + } + + // FIXME we should encapsulate these parameter into struct + // and pass it as a single thread param. + + void** th_stack = (void**) th_info.th_stack_top; + th_stack[1] = (void*)start_routine; + th_stack[2] = arg; + + return ret; +} + +int +pthread_detach(pthread_t thread) +{ + return do_lunaix_syscall(__SYSCALL_th_detach, thread); +} + +void +pthread_exit(void *value_ptr) +{ + do_lunaix_syscall(__SYSCALL_th_exit, value_ptr); +} + +int +pthread_join(pthread_t thread, void **value_ptr) +{ + return do_lunaix_syscall(__SYSCALL_th_join, thread, value_ptr); +} + +int +pthread_kill(pthread_t thread, int sig) +{ + return do_lunaix_syscall(__SYSCALL_th_kill, thread, sig); +} + +pthread_t +pthread_self(void) +{ + return do_lunaix_syscall(__SYSCALL_th_self); +}