diff options
| author | "Steven J. Hill" <sjhill@realitydiluted.com> | 2005-07-22 06:49:31 +0000 |
|---|---|---|
| committer | "Steven J. Hill" <sjhill@realitydiluted.com> | 2005-07-22 06:49:31 +0000 |
| commit | 7a4daea1ea52c84588630329db7e14cbc4d12c41 (patch) | |
| tree | 6d7f69512147c98b63ad7934f2a3abe1c67e7065 /libc | |
| parent | 9a97faafbcd7bc23d5adf32f4ed135bdf623629a (diff) | |
| download | uClibc-alpine-7a4daea1ea52c84588630329db7e14cbc4d12c41.tar.bz2 uClibc-alpine-7a4daea1ea52c84588630329db7e14cbc4d12c41.tar.xz | |
Fixed up resolver and errno code such that both thread models can compile without stepping on each other. The original implementation pulled from glibc was done incorrectly and has been fixed.
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/inet/resolv.c | 32 | ||||
| -rw-r--r-- | libc/misc/internals/errno.c | 13 |
2 files changed, 13 insertions, 32 deletions
diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c index 695ee048b..798a3f5d4 100644 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -1096,7 +1096,13 @@ struct hostent *gethostbyname2(const char *name, int family) #ifdef L_res_init +#ifdef __PTHREADS_NATIVE__ +#include <tls.h> +struct __res_state _res_thread; +__thread struct __res_state *__resp = &_res_thread; +#else struct __res_state _res; +#endif int res_init(void) { @@ -1149,34 +1155,8 @@ void res_close( void ) return; } -/* - * NPTL - This code was taken from 'resolve/res_libc.c' and - * may still be incorrect. Our name resolver code is - * so out of date, we made not be able to correctly - * utilize it in multi-threaded programs. - */ -#ifdef IS_IN_libpthread - -/* This needs to be after the use of _res in res_init, above. */ -#undef _res - -/* The resolver state for use by single-threaded programs. - This differs from plain `struct __res_state _res;' in that it doesn't - create a common definition, but a plain symbol that resides in .bss, - which can have an alias. */ -struct __res_state _res __attribute__((section (".bss"))); - -#if USE___THREAD -#undef __resp -__thread struct __res_state *__resp = &_res; -extern __thread struct __res_state *__libc_resp - __attribute__ ((alias ("__resp"))) attribute_hidden; -#endif -#endif - #endif - #ifdef L_res_query #ifndef MIN diff --git a/libc/misc/internals/errno.c b/libc/misc/internals/errno.c index f2424eae0..5197e0aec 100644 --- a/libc/misc/internals/errno.c +++ b/libc/misc/internals/errno.c @@ -1,14 +1,15 @@ #include <features.h> #undef errno +#if __PTHREADS_NATIVE__ +#include <tls.h> extern int errno; -extern int h_errno; - -#if 0 -/* Unfortunately, this doesn't work... */ -int h_errno __attribute__ ((section (".bss"))) = 0; -int errno __attribute__ ((section (".bss"))) = 0; +extern __thread int _h_errno; +int _errno = 0; +__thread int _h_errno; #else +extern int errno; +extern int h_errno; int _errno = 0; int _h_errno = 0; #endif |
