fix several locks that weren't updated right for new futex-based __lock

these could have caused memory corruption due to invalid accesses to
the next field. all should be fixed now; I found the errors with fgrep
-r '__lock(&', which is bogus since the argument should be an array.
This commit is contained in:
Rich Felker 2012-07-12 11:23:43 -04:00
commit bbbe87e35c
4 changed files with 10 additions and 10 deletions

View file

@ -24,12 +24,12 @@ void pthread_exit(void *result)
__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);

View file

@ -3,9 +3,9 @@
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;
}

View file

@ -3,8 +3,8 @@
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;
}