summaryrefslogtreecommitdiff
path: root/sysdeps/generic/pt-setspecific.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2018-01-06 03:03:30 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-01-06 03:03:30 +0100
commitada00b30cf36beecdf4b900b67ffb602fd0b89ca (patch)
treefe3378dcb34fae36e93ea0b4711aba21389f7b86 /sysdeps/generic/pt-setspecific.c
parent7d4a84731cd80a1ef711c83535c6340f0e2b143f (diff)
Move key management to sysdeps/generic
Now that it does not use libihash any more, it is not hurd-dependent any more. * sysdeps/hurd/pt-destroy-specific.c: Move to sysdeps/generic/pt-destroy-specific.c * sysdeps/hurd/pt-key-create.c: Move to sysdeps/generic/pt-key-create.c. * sysdeps/hurd/pt-key-delete.c: Move to sysdeps/generic/pt-key-delete.c. * sysdeps/hurd/pt-key.h: Move to sysdeps/generic/pt-key.h. * sysdeps/hurd/pt-getspecific.c: Move to sysdeps/generic/pt-getspecific.c. * sysdeps/hurd/pt-init-specific.c: Move to sysdeps/generic/pt-init-specific.c. * sysdeps/hurd/pt-setspecific.c: Move to sysdeps/generic/pt-setspecific.c.
Diffstat (limited to 'sysdeps/generic/pt-setspecific.c')
-rw-r--r--sysdeps/generic/pt-setspecific.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/sysdeps/generic/pt-setspecific.c b/sysdeps/generic/pt-setspecific.c
index d520c5d..871560c 100644
--- a/sysdeps/generic/pt-setspecific.c
+++ b/sysdeps/generic/pt-setspecific.c
@@ -18,10 +18,34 @@
Boston, MA 02111-1307, USA. */
#include <pthread.h>
+
#include <pt-internal.h>
int
-pthread_setspecific (pthread_key_t key, const void *value)
+__pthread_setspecific (pthread_key_t key, const void *value)
{
- return EINVAL;
+ struct __pthread *self = _pthread_self ();
+
+ if (key < 0 || key >= __pthread_key_count
+ || __pthread_key_destructors[key] == PTHREAD_KEY_INVALID)
+ return EINVAL;
+
+ if (key >= self->thread_specifics_size)
+ {
+ /* Amortize reallocation cost. */
+ int newsize = 2 * key + 1;
+ void **new = realloc (self->thread_specifics,
+ newsize * sizeof (new[0]));
+ if (! new )
+ return ENOMEM;
+
+ memset (&new[self->thread_specifics_size], 0,
+ (newsize - self->thread_specifics_size) * sizeof (new[0]));
+ self->thread_specifics = new;
+ self->thread_specifics_size = newsize;
+ }
+
+ self->thread_specifics[key] = (void*) value;
+ return 0;
}
+strong_alias (__pthread_setspecific, pthread_setspecific);