提交 e16f70f4 编写于 作者: J Jens Gustedt 提交者: Rich Felker

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.
上级 b7cf71a1
#include <threads.h>
int __pthread_once(once_flag *, void (*)(void));
void call_once(once_flag *flag, void (*func)(void))
{
__pthread_once(flag, func);
}
#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);
#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;
}
#include <threads.h>
int __pthread_key_delete(tss_t k);
void tss_delete(tss_t key)
{
__pthread_key_delete(key);
}
#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;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册