projects
/
musl
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
a53d2f3
)
optimize POSIX TSD for fast pthread_getspecific
author
Rich Felker
<dalias@aerifal.cx>
Thu, 3 Mar 2011 23:30:44 +0000
(18:30 -0500)
committer
Rich Felker
<dalias@aerifal.cx>
Thu, 3 Mar 2011 23:30:44 +0000
(18:30 -0500)
src/thread/pthread_getspecific.c
patch
|
blob
|
history
src/thread/pthread_key_create.c
patch
|
blob
|
history
src/thread/pthread_self.c
patch
|
blob
|
history
src/thread/pthread_setspecific.c
patch
|
blob
|
history
diff --git
a/src/thread/pthread_getspecific.c
b/src/thread/pthread_getspecific.c
index
a6ca27d
..
b2a282c
100644
(file)
--- a/
src/thread/pthread_getspecific.c
+++ b/
src/thread/pthread_getspecific.c
@@
-2,7
+2,6
@@
void *pthread_getspecific(pthread_key_t k)
{
void *pthread_getspecific(pthread_key_t k)
{
- struct pthread *self = pthread_self();
- if (!self->tsd) return 0;
+ struct pthread *self = __pthread_self();
return self->tsd[k];
}
return self->tsd[k];
}
diff --git
a/src/thread/pthread_key_create.c
b/src/thread/pthread_key_create.c
index
efc3804
..
52c0973
100644
(file)
--- a/
src/thread/pthread_key_create.c
+++ b/
src/thread/pthread_key_create.c
@@
-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 j = i;
int i = (uintptr_t)&k / 16 % PTHREAD_KEYS_MAX;
int j = i;
+ pthread_self();
libc.tsd_keys = keys;
if (!dtor) dtor = nodtor;
/* Cheap trick - &k cannot match any destructor pointer */
libc.tsd_keys = keys;
if (!dtor) dtor = nodtor;
/* Cheap trick - &k cannot match any destructor pointer */
diff --git
a/src/thread/pthread_self.c
b/src/thread/pthread_self.c
index
3a4d4c5
..
028d387
100644
(file)
--- a/
src/thread/pthread_self.c
+++ b/
src/thread/pthread_self.c
@@
-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
static int *errno_location()
{
#undef errno
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;
if (__set_thread_area(&main_thread) < 0)
return -1;
main_thread.self = &main_thread;
if (__set_thread_area(&main_thread) < 0)
return -1;
diff --git
a/src/thread/pthread_setspecific.c
b/src/thread/pthread_setspecific.c
index
171cef4
..
55e46a8
100644
(file)
--- a/
src/thread/pthread_setspecific.c
+++ b/
src/thread/pthread_setspecific.c
@@
-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();
- /* 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;
- }
+ struct pthread *self = __pthread_self();
/* Avoid unnecessary COW */
if (self->tsd[k] != x) {
self->tsd[k] = (void *)x;
/* Avoid unnecessary COW */
if (self->tsd[k] != x) {
self->tsd[k] = (void *)x;