add C11 thread functions operating on tss_t and once_flag

These all have POSIX equivalents, but aside from tss_get, they all
have minor changes to the signature or return value and thus need to
exist as separate functions.
This commit is contained in:
Jens Gustedt 2014-09-06 21:32:53 -04:00 committed by Rich Felker
parent b7cf71a190
commit e16f70f452
5 changed files with 42 additions and 0 deletions

8
src/thread/call_once.c Normal file
View File

@ -0,0 +1,8 @@
#include <threads.h>
int __pthread_once(once_flag *, void (*)(void));
void call_once(once_flag *flag, void (*func)(void))
{
__pthread_once(flag, func);
}

View File

@ -1,4 +1,5 @@
#include "pthread_impl.h"
#include <threads.h>
static void *__pthread_getspecific(pthread_key_t k)
{
@ -7,3 +8,4 @@ static void *__pthread_getspecific(pthread_key_t k)
}
weak_alias(__pthread_getspecific, pthread_getspecific);
weak_alias(__pthread_getspecific, tss_get);

11
src/thread/tss_create.c Normal file
View File

@ -0,0 +1,11 @@
#include <threads.h>
int __pthread_key_create(tss_t *, void (*)(void *));
int tss_create(tss_t *tss, tss_dtor_t dtor)
{
/* Different error returns are possible. C glues them together into
* just failure notification. Can't be optimized to a tail call,
* unless thrd_error equals EAGAIN. */
return __pthread_key_create(tss, dtor) ? thrd_error : thrd_success;
}

8
src/thread/tss_delete.c Normal file
View File

@ -0,0 +1,8 @@
#include <threads.h>
int __pthread_key_delete(tss_t k);
void tss_delete(tss_t key)
{
__pthread_key_delete(key);
}

13
src/thread/tss_set.c Normal file
View File

@ -0,0 +1,13 @@
#include "pthread_impl.h"
#include <threads.h>
int tss_set(tss_t k, void *x)
{
struct pthread *self = __pthread_self();
/* Avoid unnecessary COW */
if (self->tsd[k] != x) {
self->tsd[k] = x;
self->tsd_used = 1;
}
return thrd_success;
}