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:
parent
c89f130f39
commit
bbbe87e35c
4 changed files with 10 additions and 10 deletions
|
|
@ -28,13 +28,12 @@ struct pthread {
|
||||||
pid_t tid, pid;
|
pid_t tid, pid;
|
||||||
int tsd_used, errno_val, *errno_ptr;
|
int tsd_used, errno_val, *errno_ptr;
|
||||||
volatile int cancel, canceldisable, cancelasync;
|
volatile int cancel, canceldisable, cancelasync;
|
||||||
|
int detached;
|
||||||
unsigned char *map_base;
|
unsigned char *map_base;
|
||||||
size_t map_size;
|
size_t map_size;
|
||||||
void *start_arg;
|
void *start_arg;
|
||||||
void *(*start)(void *);
|
void *(*start)(void *);
|
||||||
void *result;
|
void *result;
|
||||||
int detached;
|
|
||||||
int exitlock;
|
|
||||||
struct __ptcb *cancelbuf;
|
struct __ptcb *cancelbuf;
|
||||||
void **tsd;
|
void **tsd;
|
||||||
pthread_attr_t attr;
|
pthread_attr_t attr;
|
||||||
|
|
@ -47,7 +46,8 @@ struct pthread {
|
||||||
int unblock_cancel;
|
int unblock_cancel;
|
||||||
int delete_timer;
|
int delete_timer;
|
||||||
locale_t locale;
|
locale_t locale;
|
||||||
int killlock;
|
int killlock[2];
|
||||||
|
int exitlock[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct __timer {
|
struct __timer {
|
||||||
|
|
|
||||||
|
|
@ -24,12 +24,12 @@ void pthread_exit(void *result)
|
||||||
|
|
||||||
__pthread_tsd_run_dtors();
|
__pthread_tsd_run_dtors();
|
||||||
|
|
||||||
__lock(&self->exitlock);
|
__lock(self->exitlock);
|
||||||
|
|
||||||
/* Mark this thread dead before decrementing count */
|
/* Mark this thread dead before decrementing count */
|
||||||
__lock(&self->killlock);
|
__lock(self->killlock);
|
||||||
self->dead = 1;
|
self->dead = 1;
|
||||||
a_store(&self->killlock, 0);
|
__unlock(self->killlock);
|
||||||
|
|
||||||
do n = libc.threads_minus_1;
|
do n = libc.threads_minus_1;
|
||||||
while (n && a_cas(&libc.threads_minus_1, n, n-1)!=n);
|
while (n && a_cas(&libc.threads_minus_1, n, n-1)!=n);
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@
|
||||||
int pthread_detach(pthread_t t)
|
int pthread_detach(pthread_t t)
|
||||||
{
|
{
|
||||||
/* Cannot detach a thread that's already exiting */
|
/* 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);
|
return pthread_join(t, 0);
|
||||||
t->detached = 2;
|
t->detached = 2;
|
||||||
a_store(&t->exitlock, 0);
|
__unlock(t->exitlock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
int pthread_kill(pthread_t t, int sig)
|
int pthread_kill(pthread_t t, int sig)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
__lock(&t->killlock);
|
__lock(t->killlock);
|
||||||
r = t->dead ? ESRCH : -__syscall(SYS_tgkill, t->pid, t->tid, sig);
|
r = t->dead ? ESRCH : -__syscall(SYS_tgkill, t->pid, t->tid, sig);
|
||||||
__unlock(&t->killlock);
|
__unlock(t->killlock);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue