diff options
-rw-r--r-- | include/errno.h | 22 | ||||
-rw-r--r-- | libc/misc/internals/__errno_location.c | 10 | ||||
-rw-r--r-- | libc/misc/internals/errno.c | 21 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/bits/errno.h | 12 | ||||
-rw-r--r-- | libc/sysdeps/linux/mips/bits/syscalls.h | 6 |
5 files changed, 54 insertions, 17 deletions
diff --git a/include/errno.h b/include/errno.h index 203a62e3e..bd363a258 100644 --- a/include/errno.h +++ b/include/errno.h @@ -43,10 +43,8 @@ __BEGIN_DECLS variable. This redeclaration using the macro still works, but it will be a function declaration without a prototype and may trigger a -Wstrict-prototypes warning. */ -#ifndef __ASSEMBLER__ -# ifndef errno +#ifndef errno extern int errno; -# endif #endif #if 0 /*def __USE_GNU uClibc note: not supported */ @@ -60,6 +58,24 @@ extern char *program_invocation_name, *program_invocation_short_name; __END_DECLS +#if defined _LIBC && defined __UCLIBC_HAS_THREADS_NATIVE__ +# if !defined NOT_IN_libc || defined IS_IN_libpthread +# undef errno +# ifndef NOT_IN_libc +# define errno __libc_errno +# else +# define errno errno /* For #ifndef errno tests. */ +# endif +extern __thread int errno attribute_tls_model_ie; +# endif +#endif + +#define __set_errno(val) (errno = (val)) + +#ifndef __ASSEMBLER__ +extern int *__errno_location (void) __THROW __attribute__ ((__const__)); +#endif + #endif /* _ERRNO_H */ /* The Hurd <bits/errno.h> defines `error_t' as an enumerated type so diff --git a/libc/misc/internals/__errno_location.c b/libc/misc/internals/__errno_location.c index 10b97753f..c0b1532b9 100644 --- a/libc/misc/internals/__errno_location.c +++ b/libc/misc/internals/__errno_location.c @@ -1,7 +1,15 @@ #include <errno.h> + +#ifndef __UCLIBC_HAS_THREADS_NATIVE__ #undef errno +extern int errno; +#endif -int * weak_const_function __errno_location (void) +int * +#ifndef __UCLIBC_HAS_THREADS_NATIVE__ +weak_const_function +#endif +__errno_location (void) { return &errno; } diff --git a/libc/misc/internals/errno.c b/libc/misc/internals/errno.c index f2424eae0..107b61403 100644 --- a/libc/misc/internals/errno.c +++ b/libc/misc/internals/errno.c @@ -1,6 +1,24 @@ #include <features.h> -#undef errno +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +__thread int errno; +__thread int h_errno; + +#ifdef SHARED +/* + * FIXME: Add usage of hidden attribute for both of these when used in + * the shared library. It currently crashes the linker when doing + * section relocations. + */ +extern __thread int __libc_errno __attribute__ ((alias ("errno"))); +extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno"))); +#else +extern __thread int __libc_errno __attribute__ ((alias ("errno"))); +extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno"))); +#endif +#define h_errno __libc_h_errno + +#else extern int errno; extern int h_errno; @@ -15,3 +33,4 @@ int _h_errno = 0; weak_alias (_errno, errno) weak_alias(_h_errno, h_errno); +#endif diff --git a/libc/sysdeps/linux/common/bits/errno.h b/libc/sysdeps/linux/common/bits/errno.h index bf73a8fe1..03d4729f6 100644 --- a/libc/sysdeps/linux/common/bits/errno.h +++ b/libc/sysdeps/linux/common/bits/errno.h @@ -31,20 +31,10 @@ # ifndef __ASSEMBLER__ -/* We now need a declaration of the `errno' variable. */ -extern int errno; - /* Function to get address of global `errno' variable. */ extern int *__errno_location (void) __THROW __attribute__ ((__const__)); -# if defined _LIBC -/* We wouldn't need a special macro anymore but it is history. */ -# ifndef __set_errno -# define __set_errno(val) ((errno) = (val)) -# endif -# endif /* _LIBC */ - -# if defined __UCLIBC_HAS_THREADS__ +# if !defined _LIBC || defined __UCLIBC_HAS_THREADS__ /* When using threads, errno is a per-thread value. */ # define errno (*__errno_location ()) # endif diff --git a/libc/sysdeps/linux/mips/bits/syscalls.h b/libc/sysdeps/linux/mips/bits/syscalls.h index 8645d9d75..09688dd1b 100644 --- a/libc/sysdeps/linux/mips/bits/syscalls.h +++ b/libc/sysdeps/linux/mips/bits/syscalls.h @@ -10,7 +10,11 @@ #include <bits/sysnum.h> #ifndef __set_errno -# define __set_errno(val) (*__errno_location ()) = (val) +# ifdef __UCLIBC_HAS_THREADS__ +# define __set_errno(val) (*__errno_location ()) = (val) +# else +# define __set_errno(val) (errno = (val)) +# endif #endif #ifndef SYS_ify # define SYS_ify(syscall_name) (__NR_##syscall_name) |