diff options
| -rw-r--r-- | src/_nonstd.h | 3 | ||||
| -rw-r--r-- | src/errno/__errno.c | 15 | ||||
| -rw-r--r-- | src/nonstd/__libc.c | 5 | ||||
| -rw-r--r-- | src/nonstd/__libc_per_thread.c | 11 | ||||
| -rw-r--r-- | src/nonstd/__pthread_per_thread.c | 1 |
5 files changed, 14 insertions, 21 deletions
diff --git a/src/_nonstd.h b/src/_nonstd.h index 247579cd..4f8cd478 100644 --- a/src/_nonstd.h +++ b/src/_nonstd.h @@ -2,9 +2,6 @@ #define ___NONSTD_H__ typedef enum { - /* errno.h */ - ERRNO, - /* locale.h */ THREAD_LOCALE, GLOBAL_LOCALE, diff --git a/src/errno/__errno.c b/src/errno/__errno.c index 99061185..b3016d32 100644 --- a/src/errno/__errno.c +++ b/src/errno/__errno.c @@ -1,8 +1,17 @@ #include <errno.h> -#include "../_nonstd.h" +#include "../_perthread.h" + +/* +This version of __errno() is for single-threaded programs and those compiled +with _Thread_local support from C11 or later. + +For programs that require per-thread errno without language support (i.e. +using pthreads), there is an identically signatured version of this function +in ../pthread/__pt_errno.c which uses pthread keys. +*/ int *__errno(void) { - return __libc(ERRNO); + THREAD_LOCAL int e = 0; + return &e; } - diff --git a/src/nonstd/__libc.c b/src/nonstd/__libc.c index 9000dd46..0d8351ab 100644 --- a/src/nonstd/__libc.c +++ b/src/nonstd/__libc.c @@ -1,7 +1,5 @@ -#include "sys/types.h" #include "../_nonstd.h" #include "../locale/_locale.h" -#include "../stdio/_stdio.h" void *__libc(LIBC_INTERNAL variable) { @@ -11,9 +9,6 @@ void *__libc(LIBC_INTERNAL variable) void *r = (void*)0; switch (variable) { - case ERRNO: - return __libc_per_thread(ERRNO); - case THREAD_LOCALE: r = __libc_per_thread(THREAD_LOCALE); if (r) { diff --git a/src/nonstd/__libc_per_thread.c b/src/nonstd/__libc_per_thread.c index 38c7c610..ed399480 100644 --- a/src/nonstd/__libc_per_thread.c +++ b/src/nonstd/__libc_per_thread.c @@ -1,12 +1,6 @@ #include "../_nonstd.h" -#include "locale.h" #include "../locale/_locale.h" - -#if defined __STDC_VERSION__ && 201112L <= __STDC_VERSION__ && !defined __STDC_NO_THREADS__ -#define THREAD_LOCAL static _Thread_local -#else -#define THREAD_LOCAL static -#endif +#include "../_perthread.h" void *__libc_per_thread(LIBC_INTERNAL variable) { @@ -14,9 +8,6 @@ void *__libc_per_thread(LIBC_INTERNAL variable) THREAD_LOCAL struct __locale_t locale; switch (variable) { - case ERRNO: - return &errno; - case THREAD_LOCALE: return &locale; diff --git a/src/nonstd/__pthread_per_thread.c b/src/nonstd/__pthread_per_thread.c index 0f633a1b..9217a64a 100644 --- a/src/nonstd/__pthread_per_thread.c +++ b/src/nonstd/__pthread_per_thread.c @@ -24,4 +24,5 @@ static struct per_thread *per_thread(void) /* LINK(pthread) +POSIX(199506) */ |
