begin unifying clone/thread management interface in preparation for porting
authorRich Felker <dalias@aerifal.cx>
Tue, 15 Feb 2011 08:24:58 +0000 (03:24 -0500)
committerRich Felker <dalias@aerifal.cx>
Tue, 15 Feb 2011 08:24:58 +0000 (03:24 -0500)
src/internal/pthread_impl.h
src/thread/i386/clone.s
src/thread/pthread_create.c

index b789210..d751f19 100644 (file)
 #define pthread __pthread
 
 struct pthread {
-       struct pthread *self, *join;
-       int errno_val;
+       struct pthread *self;
+       unsigned long tlsdesc[4];
        pid_t tid, pid;
+       int tsd_used, errno_val, *errno_ptr;
        volatile int canceldisable, cancelasync, cancelpoint, cancel;
        unsigned char *map_base;
        size_t map_size;
@@ -32,12 +33,9 @@ struct pthread {
        jmp_buf exit_jmp_buf;
        int detached;
        int exitlock;
-       unsigned long tlsdesc[4];
        struct __ptcb *cancelbuf;
        void **tsd;
-       int tsd_used;
        pthread_attr_t attr;
-       int *errno_ptr;
 };
 
 static inline struct pthread *__pthread_self()
index 4f33366..53405cf 100644 (file)
@@ -1,35 +1,27 @@
 .text
-.global __clone
-.type   __clone,%function
-__clone:
-       movl    8(%esp),%ecx
-       andl    $0xfffffff0, %ecx
-       subl    $28,%ecx
-       movl    16(%esp),%eax
-       movl    %eax,12(%ecx)
-       movl    4(%esp),%eax
-       movl    %eax,8(%ecx)
+.global __uniclone
+.type   __uniclone,%function
+__uniclone:
+       movl    4(%esp),%ecx
+       subl    $24,%ecx
+       movl    8(%esp),%eax
+       movl    %eax,16(%ecx)
+       movl    12(%esp),%eax
+       movl    %eax,24(%ecx)
        pushl   %ebx
        pushl   %esi
        pushl   %edi
+       pushl   %ebp
+       movl    %eax,8(%eax)
+       leal    20(%eax),%edx
+       leal    4(%eax),%esi
+       movl    %edx,%edi
+       movl    $0x7d0f00,%ebx
        movl    $120,%eax
-       movl    12+12(%esp),%ebx
-       movl    20+12(%esp),%edx
-       movl    24+12(%esp),%esi
-       movl    28+12(%esp),%edi
        int     $128
+       popl    %ebp
        popl    %edi
        popl    %esi
        popl    %ebx
-       test    %eax,%eax
-       jnz     1f
-       xorl    %ebp,%ebp
-       call    *%ebx
-       movl    %eax, %ebx
-       movl    $1, %eax
-       int     $128
-1:     
-       movl %eax, 4(%esp)
        ret
-
-.size __clone,.-__clone
+.size __uniclone,.-__uniclone
index d01be55..af6ccf0 100644 (file)
@@ -152,8 +152,7 @@ static int start(void *p)
        return 0;
 }
 
-#define CLONE_MAGIC 0x7d0f00
-int __clone(int (*)(void *), void *, int, void *, pid_t *, void *, pid_t *);
+int __uniclone(void *, int (*)(), void *);
 
 #define ROUND(x) (((x)+PAGE_SIZE-1)&-PAGE_SIZE)
 
@@ -203,8 +202,7 @@ int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(vo
        while (rs.lock) __wait(&rs.lock, 0, 1, 1);
 
        a_inc(&libc.threads_minus_1);
-       ret = __clone(start, stack, CLONE_MAGIC, new,
-               &new->tid, &new->tlsdesc, &new->tid);
+       ret = __uniclone(stack, start, new);
 
        a_dec(&rs.blocks);
        if (rs.lock) __wake(&rs.blocks, 1, 1);