pid_t tid, pid;
int tsd_used, errno_val, *errno_ptr;
volatile int cancel, canceldisable, cancelasync;
+ int detached;
unsigned char *map_base;
size_t map_size;
void *start_arg;
void *(*start)(void *);
void *result;
- int detached;
- int exitlock;
struct __ptcb *cancelbuf;
void **tsd;
pthread_attr_t attr;
int unblock_cancel;
int delete_timer;
locale_t locale;
- int killlock;
+ int killlock[2];
+ int exitlock[2];
};
struct __timer {
__pthread_tsd_run_dtors();
- __lock(&self->exitlock);
+ __lock(self->exitlock);
/* Mark this thread dead before decrementing count */
- __lock(&self->killlock);
+ __lock(self->killlock);
self->dead = 1;
- a_store(&self->killlock, 0);
+ __unlock(self->killlock);
do n = libc.threads_minus_1;
while (n && a_cas(&libc.threads_minus_1, n, n-1)!=n);
int pthread_detach(pthread_t t)
{
/* Cannot detach a thread that's already exiting */
- if (a_swap(&t->exitlock, 1))
+ if (a_swap(t->exitlock, 1))
return pthread_join(t, 0);
t->detached = 2;
- a_store(&t->exitlock, 0);
+ __unlock(t->exitlock);
return 0;
}
int pthread_kill(pthread_t t, int sig)
{
int r;
- __lock(&t->killlock);
+ __lock(t->killlock);
r = t->dead ? ESRCH : -__syscall(SYS_tgkill, t->pid, t->tid, sig);
- __unlock(&t->killlock);
+ __unlock(t->killlock);
return r;
}