1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-09-02 16:01:20 +03:00
2002-07-19  Ulrich Drepper  <drepper@redhat.com>

	* configure.in: Add test for __thread support in compiler.
	* config.h.in: Add HAVE___THREAD.
	* Makefile (headers): Remove errno.h, sys/errno.h, and bits/errno.h.
	* include/sys/errno.h: Moved to...
	* stdlib/sys/errno.h: ...here.  New file.
	* stdlib/errno.h: New file.  Moved from...
	* include/errno.h: ...here.  Changed into an internal header defining
	libc-local things like __set_errno.
	* stdlib/Makefile (headers): Add errno.h, sys/errno.h, and
	bits/errno.h.
	* elf/dl-minimal.c: Include <tls.h>.  Define errno as thread-local
	variable if USE_TLS && HAVE___THREAD.  Don't define __errno_location
	either.
	* elf/rtld.c (_dl_start): Add code to initialize TLS for ld.so
	from...
	(_dl_start_final): ...here.  Add code to initialize tls elements from
	bootstrap_map.
	* sysdeps/generic/errno-loc.c: Define errno as thread-local variable
	if USE_TLS && HAVE___THREAD.
	* sysdeps/generic/bits/errno.h: Remove __set_errno definition.
	* sysdeps/mach/hurd/bits/errno.h: Likewise.
	* sysdeps/standalone/arm/bits/errno.h: Likewise.
	* sysdeps/standalone/bits/errno.h: Likewise.
	* sysdeps/unix/bsd/bsd4.4/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/aix/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/hpux/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/linux/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/linux/hppa/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/sysv4/solaris2/bits/errno.h: Likewise.
	* sysdeps/i386/dl-machine.c (elf_machine_rel) [RTLD_BOOTSTRAP]: Don't
	use GL(dl_rtld_map), use map parameter.
	* sysdeps/sh/dl-machine.h (elf_machine_rela): Likewise.
	* sysdeps/unix/sysv/linux/i386/sysdep.S: Define errno in .tbss if
	USE_TLS && HAVE___THREAD.
	* sysdeps/unix/sysv/linux/i386/sysdep.h: Unify SETUP_PIC_REG
	definitions.  If USE_TLS && HAVE___THREAD store errooor value using
	TLS code sequence.
	* sysdeps/unix/sysv/linux/i386/i686/sysdep.h: Likewise.

	* sysdeps/unix/sysv/linux/getcwd.c: No real need to restore errno.
	* sysdeps/unix/sysv/linux/grantpt.c: Likewise.
	* sysdeps/unix/sysv/linux/internal_statvfs.c: Likewise.
	* sysdeps/unix/sysv/linux/msgctl.c: Likewise.
	* sysdeps/unix/sysv/linux/readv.c: Likewise.
	* sysdeps/unix/sysv/linux/writev.c: Likewise.
This commit is contained in:
Ulrich Drepper
2002-07-20 01:14:41 +00:00
parent 9df63767d4
commit 739d440d2a
41 changed files with 447 additions and 350 deletions

View File

@@ -1,3 +1,12 @@
2002-07-19 Ulrich Drepper <drepper@redhat.com>
* errno.c (__errno_location): Don't define unless !USE_TLS
|| !HAVE___THREAD.
* sysdeps/i386/pt-machine.c: Protect C code with #ifndef ASSEMBLER.
* sysdeps/i386/tls.h: Likewise.
* sysdeps/i386/useldt.h: Likewise.
* sysdeps/i386/i686/pt-machine.h: Likewise.
2002-07-02 H.J. Lu <hjl@gnu.org>
* sysdeps/mips/pspinlock.c: Don't include <sgidefs.h>. Always

View File

@@ -17,14 +17,18 @@
#include <errno.h>
#include <netdb.h>
#include <resolv.h>
#include <tls.h>
#include "pthread.h"
#include "internals.h"
#if !USE_TLS || !HAVE___THREAD
/* The definition in libc is sufficient if we use TLS. */
int * __errno_location()
{
pthread_descr self = thread_self();
return THREAD_GETMEM (self, p_errnop);
}
#endif
int * __h_errno_location()
{

View File

@@ -27,6 +27,7 @@
#endif
#include "kernel-features.h"
#ifndef ASSEMBLER
extern long int testandset (int *spinlock);
extern int __compare_and_swap (long int *p, long int oldval, long int newval);
@@ -66,6 +67,7 @@ __compare_and_swap (long int *p, long int oldval, long int newval)
: "memory");
return ret;
}
#endif
#if __ASSUME_LDT_WORKS > 0
#include "../useldt.h"

View File

@@ -22,6 +22,7 @@
#ifndef _PT_MACHINE_H
#define _PT_MACHINE_H 1
#ifndef ASSEMBLER
#ifndef PT_EI
# define PT_EI extern inline
#endif
@@ -102,5 +103,6 @@ compare_and_swap_is_available (void)
Otherwise, it's a 486 or above and it has cmpxchg. */
return changed != 0;
}
#endif /* ASSEMBLER */
#endif /* pt-machine.h */

View File

@@ -20,9 +20,10 @@
#ifndef _TLS_H
#define _TLS_H
#include <stddef.h>
# include <pt-machine.h>
#include <pt-machine.h>
#ifndef ASSEMBLER
# include <stddef.h>
/* Type for the dtv. */
typedef union dtv
@@ -39,56 +40,58 @@ typedef struct
dtv_t *dtv;
void *self; /* Pointer to the thread descriptor. */
} tcbhead_t;
#endif
/* We can support TLS only if the floating-stack support is available. */
#if defined FLOATING_STACKS && defined HAVE_TLS_SUPPORT
/* Get system call information. */
# include <sysdep.h>
/* Signal that TLS support is available. */
# define USE_TLS 1
# ifndef ASSEMBLER
/* Get system call information. */
# include <sysdep.h>
/* Get the thread descriptor definition. */
# include <linuxthreads/descr.h>
# include <linuxthreads/descr.h>
/* This is the size of the initial TCB. */
# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
/* Alignment requirements for the initial TCB. */
# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t)
# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t)
/* This is the size of the TCB. */
# define TLS_TCB_SIZE sizeof (struct _pthread_descr_struct)
# define TLS_TCB_SIZE sizeof (struct _pthread_descr_struct)
/* Alignment requirements for the TCB. */
# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
/* The TCB can have any size and the memory following the address the
thread pointer points to is unspecified. Allocate the TCB there. */
# define TLS_TCB_AT_TP 1
# define TLS_TCB_AT_TP 1
/* Install the dtv pointer. The pointer passed is to the element with
index -1 which contain the length. */
# define INSTALL_DTV(descr, dtvp) \
# define INSTALL_DTV(descr, dtvp) \
((tcbhead_t *) descr)->dtv = dtvp + 1
/* Install new dtv for current thread. */
# define INSTALL_NEW_DTV(dtv) \
# define INSTALL_NEW_DTV(dtv) \
({ struct _pthread_descr_struct *__descr; \
THREAD_SETMEM (__descr, p_header.data.dtvp, dtv); })
/* Return dtv of given thread descriptor. */
# define GET_DTV(descr) \
# define GET_DTV(descr) \
(((tcbhead_t *) descr)->dtv)
/* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(descr) \
# define TLS_INIT_TP(descr) \
do { \
void *_descr = (descr); \
struct modify_ldt_ldt_s ldt_entry = \
@@ -116,10 +119,11 @@ typedef struct
/* Return the address of the dtv for the current thread. */
# define THREAD_DTV() \
# define THREAD_DTV() \
({ struct _pthread_descr_struct *__descr; \
THREAD_GETMEM (__descr, p_header.data.dtvp); })
#endif /* FLOATING_STACKS && HAVE_TLS_SUPPORT */
# endif /* FLOATING_STACKS && HAVE_TLS_SUPPORT */
#endif /* __ASSEMBLER__ */
#endif /* tls.h */

View File

@@ -1,6 +1,6 @@
/* Special definitions for ix86 machine using segment register based
thread descriptor.
Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc.
Copyright (C) 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>.
@@ -19,6 +19,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef ASSEMBLER
#include <stddef.h> /* For offsetof. */
#include <stdlib.h> /* For abort(). */
@@ -198,6 +199,7 @@ extern int __modify_ldt (int, struct modify_ldt_ldt_s *, size_t);
member))); \
} \
})
#endif
/* We want the OS to assign stack addresses. */
#define FLOATING_STACKS 1