#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); }