Architectural Support: x86_64 (#37)
[lunaix-os.git] / lunaix-os / usr / libc / src / pthread.c
index 08c82e0e538f37d0a9b78537888d882fe48a08bf..26d6abfb18c4f50a8bdc3fd5015094ba0853fb95 100644 (file)
@@ -1,37 +1,21 @@
 #include <lunaix/syscall.h>
 #include <pthread.h>
 
-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
+    int ret;
+    struct uthread_param th_param;
 
-    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;
+    th_param.th_handler = start_routine;
+    th_param.arg1 = arg;
 
+    extern void th_trampoline();
+    ret = do_lunaix_syscall(__SYSCALL_th_create, thread, 
+                            &th_param, th_trampoline);
     return ret;
 }