mirror of
git://git.musl-libc.org/musl
synced 2024-12-14 18:55:23 +00:00
add threads.h and needed per-arch types for mtx_t and cnd_t
based on patch by Jens Gustedt. mtx_t and cnd_t are defined in such a way that they are formally "compatible types" with pthread_mutex_t and pthread_cond_t, respectively, when accessed from a different translation unit. this makes it possible to implement the C11 functions using the pthread functions (which will dereference them with the pthread types) without having to use the same types, which would necessitate either namespace violations (exposing pthread type names in threads.h) or incompatible changes to the C++ name mangling ABI for the pthread types. for the rest of the types, things are much simpler; using identical types is possible without any namespace considerations.
This commit is contained in:
parent
df7d0dfb9c
commit
b7cf71a190
@ -20,6 +20,8 @@ TYPEDEF long suseconds_t;
|
||||
|
||||
TYPEDEF struct { union { int __i[9]; unsigned __s[9]; } __u; } pthread_attr_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } mtx_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } pthread_cond_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } cnd_t;
|
||||
TYPEDEF struct { union { int __i[8]; void *__p[8]; } __u; } pthread_rwlock_t;
|
||||
TYPEDEF struct { union { int __i[5]; void *__p[5]; } __u; } pthread_barrier_t;
|
||||
|
@ -34,6 +34,8 @@ TYPEDEF long suseconds_t;
|
||||
|
||||
TYPEDEF struct { union { int __i[9]; unsigned __s[9]; } __u; } pthread_attr_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } mtx_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } pthread_cond_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } cnd_t;
|
||||
TYPEDEF struct { union { int __i[8]; void *__p[8]; } __u; } pthread_rwlock_t;
|
||||
TYPEDEF struct { union { int __i[5]; void *__p[5]; } __u; } pthread_barrier_t;
|
||||
|
@ -20,6 +20,8 @@ TYPEDEF long suseconds_t;
|
||||
|
||||
TYPEDEF struct { union { int __i[9]; unsigned __s[9]; } __u; } pthread_attr_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } mtx_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } pthread_cond_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } cnd_t;
|
||||
TYPEDEF struct { union { int __i[8]; void *__p[8]; } __u; } pthread_rwlock_t;
|
||||
TYPEDEF struct { union { int __i[5]; void *__p[5]; } __u; } pthread_barrier_t;
|
||||
|
@ -20,6 +20,8 @@ TYPEDEF long suseconds_t;
|
||||
|
||||
TYPEDEF struct { union { int __i[9]; unsigned __s[9]; } __u; } pthread_attr_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } mtx_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } pthread_cond_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } cnd_t;
|
||||
TYPEDEF struct { union { int __i[8]; void *__p[8]; } __u; } pthread_rwlock_t;
|
||||
TYPEDEF struct { union { int __i[5]; void *__p[5]; } __u; } pthread_barrier_t;
|
||||
|
@ -20,6 +20,8 @@ TYPEDEF long suseconds_t;
|
||||
|
||||
TYPEDEF struct { union { int __i[9]; unsigned __s[9]; } __u; } pthread_attr_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } mtx_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } pthread_cond_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } cnd_t;
|
||||
TYPEDEF struct { union { int __i[8]; void *__p[8]; } __u; } pthread_rwlock_t;
|
||||
TYPEDEF struct { union { int __i[5]; void *__p[5]; } __u; } pthread_barrier_t;
|
||||
|
@ -20,6 +20,8 @@ TYPEDEF long suseconds_t;
|
||||
|
||||
TYPEDEF struct { union { int __i[9]; unsigned __s[9]; } __u; } pthread_attr_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } mtx_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } pthread_cond_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } cnd_t;
|
||||
TYPEDEF struct { union { int __i[8]; void *__p[8]; } __u; } pthread_rwlock_t;
|
||||
TYPEDEF struct { union { int __i[5]; void *__p[5]; } __u; } pthread_barrier_t;
|
||||
|
@ -20,6 +20,8 @@ TYPEDEF long suseconds_t;
|
||||
|
||||
TYPEDEF struct { union { int __i[9]; unsigned __s[9]; } __u; } pthread_attr_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t;
|
||||
TYPEDEF struct { union { int __i[6]; volatile void *volatile __p[6]; } __u; } mtx_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } pthread_cond_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[12]; } __u; } cnd_t;
|
||||
TYPEDEF struct { union { int __i[8]; void *__p[8]; } __u; } pthread_rwlock_t;
|
||||
TYPEDEF struct { union { int __i[5]; void *__p[5]; } __u; } pthread_barrier_t;
|
||||
|
@ -25,6 +25,8 @@ TYPEDEF long long suseconds_t;
|
||||
|
||||
TYPEDEF struct { union { int __i[14]; unsigned long __s[7]; } __u; } pthread_attr_t;
|
||||
TYPEDEF struct { union { int __i[10]; volatile void *volatile __p[5]; } __u; } pthread_mutex_t;
|
||||
TYPEDEF struct { union { int __i[10]; volatile void *volatile __p[5]; } __u; } mtx_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[6]; } __u; } pthread_cond_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[6]; } __u; } cnd_t;
|
||||
TYPEDEF struct { union { int __i[14]; void *__p[7]; } __u; } pthread_rwlock_t;
|
||||
TYPEDEF struct { union { int __i[8]; void *__p[4]; } __u; } pthread_barrier_t;
|
||||
|
@ -25,6 +25,8 @@ TYPEDEF long suseconds_t;
|
||||
|
||||
TYPEDEF struct { union { int __i[14]; unsigned long __s[7]; } __u; } pthread_attr_t;
|
||||
TYPEDEF struct { union { int __i[10]; volatile void *volatile __p[5]; } __u; } pthread_mutex_t;
|
||||
TYPEDEF struct { union { int __i[10]; volatile void *volatile __p[5]; } __u; } mtx_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[6]; } __u; } pthread_cond_t;
|
||||
TYPEDEF struct { union { int __i[12]; void *__p[6]; } __u; } cnd_t;
|
||||
TYPEDEF struct { union { int __i[14]; void *__p[7]; } __u; } pthread_rwlock_t;
|
||||
TYPEDEF struct { union { int __i[8]; void *__p[4]; } __u; } pthread_barrier_t;
|
||||
|
85
include/threads.h
Normal file
85
include/threads.h
Normal file
@ -0,0 +1,85 @@
|
||||
#ifndef _THREADS_H
|
||||
#define _THREADS_H
|
||||
|
||||
#include <features.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
typedef unsigned long thrd_t;
|
||||
#else
|
||||
typedef struct __pthread *thrd_t;
|
||||
#define thread_local _Thread_local
|
||||
#endif
|
||||
|
||||
typedef int once_flag;
|
||||
typedef unsigned tss_t;
|
||||
typedef int (*thrd_start_t)(void *);
|
||||
typedef void (*tss_dtor_t)(void *);
|
||||
|
||||
#define __NEED_cnd_t
|
||||
#define __NEED_mtx_t
|
||||
|
||||
#include <bits/alltypes.h>
|
||||
|
||||
#define TSS_DTOR_ITERATIONS 4
|
||||
|
||||
enum {
|
||||
thrd_success = 0,
|
||||
thrd_busy = 1,
|
||||
thrd_error = 2,
|
||||
thrd_nomem = 3,
|
||||
thrd_timedout = 4,
|
||||
};
|
||||
|
||||
enum {
|
||||
mtx_plain = 0,
|
||||
mtx_recursive = 1,
|
||||
mtx_timed = 2,
|
||||
};
|
||||
|
||||
#define ONCE_FLAG_INIT 0
|
||||
|
||||
int thrd_create(thrd_t *, thrd_start_t, void *);
|
||||
_Noreturn void thrd_exit(int);
|
||||
|
||||
int thrd_detach(thrd_t);
|
||||
int thrd_join(thrd_t, int *);
|
||||
|
||||
int thrd_sleep(const struct timespec *, struct timespec *);
|
||||
void thrd_yield(void);
|
||||
|
||||
thrd_t thrd_current(void);
|
||||
int thrd_equal(thrd_t, thrd_t);
|
||||
#define thrd_equal(A, B) ((A) == (B))
|
||||
|
||||
void call_once(once_flag *, void (*)(void));
|
||||
|
||||
int mtx_init(mtx_t *, int);
|
||||
void mtx_destroy(mtx_t *);
|
||||
|
||||
int mtx_lock(mtx_t *);
|
||||
int mtx_timedlock(mtx_t *__restrict, const struct timespec *__restrict);
|
||||
int mtx_trylock(mtx_t *);
|
||||
int mtx_unlock(mtx_t *);
|
||||
|
||||
int cnd_init(cnd_t *);
|
||||
void cnd_destroy(cnd_t *);
|
||||
|
||||
int cnd_broadcast(cnd_t *);
|
||||
int cnd_signal(cnd_t *);
|
||||
|
||||
int cnd_timedwait(cnd_t *__restrict, mtx_t *__restrict, const struct timespec *__restrict);
|
||||
int cnd_wait(cnd_t *, mtx_t *);
|
||||
|
||||
int tss_create(tss_t *, tss_dtor_t);
|
||||
void tss_delete(tss_t key);
|
||||
|
||||
int tss_set(tss_t, void *);
|
||||
void *tss_get(tss_t);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user