summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/_nonstd.h3
-rw-r--r--src/errno/__errno.c15
-rw-r--r--src/nonstd/__libc.c5
-rw-r--r--src/nonstd/__libc_per_thread.c11
-rw-r--r--src/nonstd/__pthread_per_thread.c1
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)
*/