begin unifying clone/thread management interface in preparation for porting

This commit is contained in:
Rich Felker
2011-02-15 03:24:58 -05:00
parent 59666802fb
commit 0b2006c8fe
3 changed files with 22 additions and 34 deletions

View File

@ -20,9 +20,10 @@
#define pthread __pthread #define pthread __pthread
struct pthread { struct pthread {
struct pthread *self, *join; struct pthread *self;
int errno_val; unsigned long tlsdesc[4];
pid_t tid, pid; pid_t tid, pid;
int tsd_used, errno_val, *errno_ptr;
volatile int canceldisable, cancelasync, cancelpoint, cancel; volatile int canceldisable, cancelasync, cancelpoint, cancel;
unsigned char *map_base; unsigned char *map_base;
size_t map_size; size_t map_size;
@ -32,12 +33,9 @@ struct pthread {
jmp_buf exit_jmp_buf; jmp_buf exit_jmp_buf;
int detached; int detached;
int exitlock; int exitlock;
unsigned long tlsdesc[4];
struct __ptcb *cancelbuf; struct __ptcb *cancelbuf;
void **tsd; void **tsd;
int tsd_used;
pthread_attr_t attr; pthread_attr_t attr;
int *errno_ptr;
}; };
static inline struct pthread *__pthread_self() static inline struct pthread *__pthread_self()

View File

@ -1,35 +1,27 @@
.text .text
.global __clone .global __uniclone
.type __clone,%function .type __uniclone,%function
__clone: __uniclone:
movl 8(%esp),%ecx movl 4(%esp),%ecx
andl $0xfffffff0, %ecx subl $24,%ecx
subl $28,%ecx movl 8(%esp),%eax
movl 16(%esp),%eax movl %eax,16(%ecx)
movl %eax,12(%ecx) movl 12(%esp),%eax
movl 4(%esp),%eax movl %eax,24(%ecx)
movl %eax,8(%ecx)
pushl %ebx pushl %ebx
pushl %esi pushl %esi
pushl %edi 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 $120,%eax
movl 12+12(%esp),%ebx
movl 20+12(%esp),%edx
movl 24+12(%esp),%esi
movl 28+12(%esp),%edi
int $128 int $128
popl %ebp
popl %edi popl %edi
popl %esi popl %esi
popl %ebx 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 ret
.size __uniclone,.-__uniclone
.size __clone,.-__clone

View File

@ -152,8 +152,7 @@ static int start(void *p)
return 0; return 0;
} }
#define CLONE_MAGIC 0x7d0f00 int __uniclone(void *, int (*)(), void *);
int __clone(int (*)(void *), void *, int, void *, pid_t *, void *, pid_t *);
#define ROUND(x) (((x)+PAGE_SIZE-1)&-PAGE_SIZE) #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); while (rs.lock) __wait(&rs.lock, 0, 1, 1);
a_inc(&libc.threads_minus_1); a_inc(&libc.threads_minus_1);
ret = __clone(start, stack, CLONE_MAGIC, new, ret = __uniclone(stack, start, new);
&new->tid, &new->tlsdesc, &new->tid);
a_dec(&rs.blocks); a_dec(&rs.blocks);
if (rs.lock) __wake(&rs.blocks, 1, 1); if (rs.lock) __wake(&rs.blocks, 1, 1);