mirror of
https://git.musl-libc.org/git/musl
synced 2025-01-23 06:32:05 +03:00
optimize POSIX TSD for fast pthread_getspecific
This commit is contained in:
parent
a53d2f3425
commit
b480808a6a
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
void *pthread_getspecific(pthread_key_t k)
|
void *pthread_getspecific(pthread_key_t k)
|
||||||
{
|
{
|
||||||
struct pthread *self = pthread_self();
|
struct pthread *self = __pthread_self();
|
||||||
if (!self->tsd) return 0;
|
|
||||||
return self->tsd[k];
|
return self->tsd[k];
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ int pthread_key_create(pthread_key_t *k, void (*dtor)(void *))
|
|||||||
int i = (uintptr_t)&k / 16 % PTHREAD_KEYS_MAX;
|
int i = (uintptr_t)&k / 16 % PTHREAD_KEYS_MAX;
|
||||||
int j = i;
|
int j = i;
|
||||||
|
|
||||||
|
pthread_self();
|
||||||
libc.tsd_keys = keys;
|
libc.tsd_keys = keys;
|
||||||
if (!dtor) dtor = nodtor;
|
if (!dtor) dtor = nodtor;
|
||||||
/* Cheap trick - &k cannot match any destructor pointer */
|
/* Cheap trick - &k cannot match any destructor pointer */
|
||||||
|
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
static struct pthread main_thread;
|
static struct pthread main_thread;
|
||||||
|
|
||||||
|
/* pthread_key_create.c overrides this */
|
||||||
|
static const size_t dummy = 0;
|
||||||
|
weak_alias(dummy, __pthread_tsd_size);
|
||||||
|
|
||||||
#undef errno
|
#undef errno
|
||||||
static int *errno_location()
|
static int *errno_location()
|
||||||
{
|
{
|
||||||
@ -10,6 +14,13 @@ static int *errno_location()
|
|||||||
|
|
||||||
static int init_main_thread()
|
static int init_main_thread()
|
||||||
{
|
{
|
||||||
|
void *tsd = 0;
|
||||||
|
if (__pthread_tsd_size) {
|
||||||
|
tsd = mmap(0, __pthread_tsd_size, PROT_READ|PROT_WRITE,
|
||||||
|
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
||||||
|
if (tsd == MAP_FAILED) return -1;
|
||||||
|
}
|
||||||
|
main_thread.tsd = tsd;
|
||||||
main_thread.self = &main_thread;
|
main_thread.self = &main_thread;
|
||||||
if (__set_thread_area(&main_thread) < 0)
|
if (__set_thread_area(&main_thread) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -2,13 +2,7 @@
|
|||||||
|
|
||||||
int pthread_setspecific(pthread_key_t k, const void *x)
|
int pthread_setspecific(pthread_key_t k, const void *x)
|
||||||
{
|
{
|
||||||
struct pthread *self = pthread_self();
|
struct pthread *self = __pthread_self();
|
||||||
/* Handle the case of the main thread */
|
|
||||||
if (!self->tsd) {
|
|
||||||
if (!x) return 0;
|
|
||||||
if (!(self->tsd = calloc(sizeof(void *), PTHREAD_KEYS_MAX)))
|
|
||||||
return ENOMEM;
|
|
||||||
}
|
|
||||||
/* Avoid unnecessary COW */
|
/* Avoid unnecessary COW */
|
||||||
if (self->tsd[k] != x) {
|
if (self->tsd[k] != x) {
|
||||||
self->tsd[k] = (void *)x;
|
self->tsd[k] = (void *)x;
|
||||||
|
Loading…
Reference in New Issue
Block a user