mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 16:21:06 +00:00
Update.
2000-10-16 Ulrich Drepper <drepper@redhat.com> * specific.c: Protect tsd array modification in thread data structures by getting the thread lock in pthread_key_delete and __pthread_destroy_specifics. Patch by Wolfram Gloger <Wolfram.Gloger@dent.med.uni-muenchen.de>.
This commit is contained in:
parent
4abef27cb7
commit
6a14016e3c
@ -1,3 +1,10 @@
|
|||||||
|
2000-10-16 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* specific.c: Protect tsd array modification in thread data
|
||||||
|
structures by getting the thread lock in pthread_key_delete and
|
||||||
|
__pthread_destroy_specifics.
|
||||||
|
Patch by Wolfram Gloger <Wolfram.Gloger@dent.med.uni-muenchen.de>.
|
||||||
|
|
||||||
2000-10-12 Alan Modra <alan@linuxcare.com.au>
|
2000-10-12 Alan Modra <alan@linuxcare.com.au>
|
||||||
|
|
||||||
* sysdeps/pthread/bits/initspin.h: New file.
|
* sysdeps/pthread/bits/initspin.h: New file.
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "pthread.h"
|
#include "pthread.h"
|
||||||
#include "internals.h"
|
#include "internals.h"
|
||||||
|
#include "spinlock.h"
|
||||||
|
|
||||||
/* Table of keys. */
|
/* Table of keys. */
|
||||||
|
|
||||||
@ -78,8 +79,13 @@ int pthread_key_delete(pthread_key_t key)
|
|||||||
th = self;
|
th = self;
|
||||||
do {
|
do {
|
||||||
/* If the thread already is terminated don't modify the memory. */
|
/* If the thread already is terminated don't modify the memory. */
|
||||||
if (!th->p_terminated && th->p_specific[idx1st] != NULL)
|
if (!th->p_terminated) {
|
||||||
th->p_specific[idx1st][idx2nd] = NULL;
|
/* pthread_exit() may try to free th->p_specific[idx1st] concurrently. */
|
||||||
|
__pthread_lock(THREAD_GETMEM(th, p_lock), self);
|
||||||
|
if (th->p_specific[idx1st] != NULL)
|
||||||
|
th->p_specific[idx1st][idx2nd] = NULL;
|
||||||
|
__pthread_unlock(THREAD_GETMEM(th, p_lock));
|
||||||
|
}
|
||||||
th = th->p_nextlive;
|
th = th->p_nextlive;
|
||||||
} while (th != self);
|
} while (th != self);
|
||||||
pthread_mutex_unlock(&pthread_keys_mutex);
|
pthread_mutex_unlock(&pthread_keys_mutex);
|
||||||
@ -151,10 +157,14 @@ void __pthread_destroy_specifics()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
__pthread_lock(THREAD_GETMEM(self, p_lock), self);
|
||||||
for (i = 0; i < PTHREAD_KEY_1STLEVEL_SIZE; i++) {
|
for (i = 0; i < PTHREAD_KEY_1STLEVEL_SIZE; i++) {
|
||||||
if (THREAD_GETMEM_NC(self, p_specific[i]) != NULL)
|
if (THREAD_GETMEM_NC(self, p_specific[i]) != NULL) {
|
||||||
free(THREAD_GETMEM_NC(self, p_specific[i]));
|
free(THREAD_GETMEM_NC(self, p_specific[i]));
|
||||||
|
THREAD_SETMEM_NC(self, p_specific[i], NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
__pthread_unlock(THREAD_GETMEM(self, p_lock));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Thread-specific data for libc. */
|
/* Thread-specific data for libc. */
|
||||||
|
Loading…
Reference in New Issue
Block a user