1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00
2003-01-03  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/generic/ldsodefs.h (_dl_allocate_tls, _dl_deallocate_tls):
	Add rtld_hidden_proto.
	* sysdeps/generic/dl-tls.c (_dl_deallocate_tls): Add rtld_hidden_def.
	(_dl_allocate_tls): Likewise.  Remove INTDEF.
This commit is contained in:
Ulrich Drepper
2003-01-03 21:15:43 +00:00
parent 686b7223d5
commit 733f25e6d3
12 changed files with 82 additions and 47 deletions

View File

@ -1,3 +1,10 @@
2003-01-03 Jakub Jelinek <jakub@redhat.com>
* sysdeps/generic/ldsodefs.h (_dl_allocate_tls, _dl_deallocate_tls):
Add rtld_hidden_proto.
* sysdeps/generic/dl-tls.c (_dl_deallocate_tls): Add rtld_hidden_def.
(_dl_allocate_tls): Likewise. Remove INTDEF.
2002-07-05 Kaz Kojima <kkojima@rr.iij4u.or.jp> 2002-07-05 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/sh/memcpy.S: Optimize. Based on a patch by Toshiyasu * sysdeps/sh/memcpy.S: Optimize. Based on a patch by Toshiyasu

View File

@ -1,3 +1,7 @@
2003-01-03 Jakub Jelinek <jakub@redhat.com>
* Makefile ($(objpfx)libpthread.so): Depend on ld.so.
2003-01-02 Ulrich Drepper <drepper@redhat.com> 2003-01-02 Ulrich Drepper <drepper@redhat.com>
* tst-cancel-wrappers.sh: Exclude sigwait.c as well, it does not have * tst-cancel-wrappers.sh: Exclude sigwait.c as well, it does not have

View File

@ -185,7 +185,9 @@ endif
# Depend on libc.so so a DT_NEEDED is generated in the shared objects. # Depend on libc.so so a DT_NEEDED is generated in the shared objects.
# This ensures they will load libc.so for needed symbols if loaded by # This ensures they will load libc.so for needed symbols if loaded by
# a statically-linked program that hasn't already loaded it. # a statically-linked program that hasn't already loaded it.
$(objpfx)libpthread.so: $(libc-link.so) $(common-objpfx)libc_nonshared.a # Depend on ld.so too to get proper versions of ld.so symbols.
$(objpfx)libpthread.so: $(libc-link.so) $(common-objpfx)libc_nonshared.a \
$(if $(filter yes,$(elf)), $(elfobjdir)/ld.so)
# Make sure we link with the thread library. # Make sure we link with the thread library.
ifeq ($(build-shared),yes) ifeq ($(build-shared),yes)

View File

@ -1,3 +1,14 @@
2003-01-03 Ulrich Drepper <drepper@redhat.com>
* atomic.h: Correct definitions of atomic_full_barrier,
atomic_read_barrier, atomic_write_barrier.
* old_pthread_cond_broadcast.c: Make memory allocate and initialization
race-free.
* old_pthread_cond_signal.c: Likewise.
* old_pthread_cond_timedwait.c: Likewise.
* old_pthread_cond_wait.c: Likewise.
2003-01-03 Jakub Jelinek <jakub@redhat.com> 2003-01-03 Jakub Jelinek <jakub@redhat.com>
* Makefile ($(objpfx)libpthread.so): Depend on ld.so. * Makefile ($(objpfx)libpthread.so): Depend on ld.so.

View File

@ -212,8 +212,10 @@ $(objpfx)libpthread.so: +preinit += $(objpfx)crti.o
# Depend on libc.so so a DT_NEEDED is generated in the shared objects. # Depend on libc.so so a DT_NEEDED is generated in the shared objects.
# This ensures they will load libc.so for needed symbols if loaded by # This ensures they will load libc.so for needed symbols if loaded by
# a statically-linked program that hasn't already loaded it. # a statically-linked program that hasn't already loaded it.
# Depend on ld.so too to get proper versions of ld.so symbols.
$(objpfx)libpthread.so: $(common-objpfx)libc.so \ $(objpfx)libpthread.so: $(common-objpfx)libc.so \
$(common-objpfx)libc_nonshared.a $(common-objpfx)libc_nonshared.a \
$(if $(filter yes,$(elf)), $(elfobjdir)/ld.so)
# Make sure we link with the thread library. # Make sure we link with the thread library.
ifeq ($(build-shared),yes) ifeq ($(build-shared),yes)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2002 Free Software Foundation, Inc. /* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -93,17 +93,17 @@
#ifndef atomic_full_barrier #ifndef atomic_full_barrier
# define full_barrier() __asm ("" ::: "memory") # define atomic_full_barrier() __asm ("" ::: "memory")
#endif #endif
#ifndef atomic_read_barrier #ifndef atomic_read_barrier
# define read_barrier() full_barrier() # define atomic_read_barrier() atomic_full_barrier()
#endif #endif
#ifndef atomic_write_barrier #ifndef atomic_write_barrier
# define write_barrier() full_barrier() # define atomic_write_barrier() atomic_full_barrier()
#endif #endif
#endif /* atomic.h */ #endif /* atomic.h */

View File

@ -20,7 +20,7 @@
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include "pthreadP.h" #include "pthreadP.h"
#include <lowlevellock.h> #include <atomic.h>
#include <shlib-compat.h> #include <shlib-compat.h>
@ -31,18 +31,19 @@ __pthread_cond_broadcast_2_0 (cond)
{ {
if (cond->cond == NULL) if (cond->cond == NULL)
{ {
lll_mutex_lock (cond->lock); pthread_cond_t *newcond;
/* Check whether the condvar is still not allocated. */ newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
if (cond->cond == NULL) if (newcond == NULL)
cond->cond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
lll_mutex_unlock (cond->lock);
if (cond->cond == NULL)
return ENOMEM; return ENOMEM;
*cond->cond = (struct pthread_cond_t) PTHREAD_COND_INITIALIZER; *newcond = (struct pthread_cond_t) PTHREAD_COND_INITIALIZER;
atomic_write_barrier ();
if (atomic_compare_and_exchange_acq (&cond->cond, newcond, NULL) != 0)
/* Somebody else just initialized the condvar. */
free (newcond);
} }
return __pthread_cond_broadcast (cond->cond); return __pthread_cond_broadcast (cond->cond);

View File

@ -20,6 +20,7 @@
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include "pthreadP.h" #include "pthreadP.h"
#include <atomic.h>
#include <shlib-compat.h> #include <shlib-compat.h>
@ -30,18 +31,19 @@ __pthread_cond_signal_2_0 (cond)
{ {
if (cond->cond == NULL) if (cond->cond == NULL)
{ {
lll_mutex_lock (cond->lock); pthread_cond_t *newcond;
/* Check whether the condvar is still not allocated. */ newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
if (cond->cond == NULL) if (newcond == NULL)
cond->cond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
lll_mutex_unlock (cond->lock);
if (cond->cond == NULL)
return ENOMEM; return ENOMEM;
*cond->cond = (struct pthread_cond_t) PTHREAD_COND_INITIALIZER; *newcond = (struct pthread_cond_t) PTHREAD_COND_INITIALIZER;
atomic_write_barrier ();
if (atomic_compare_and_exchange_acq (&cond->cond, newcond, NULL) != 0)
/* Somebody else just initialized the condvar. */
free (newcond);
} }
return __pthread_cond_signal (cond->cond); return __pthread_cond_signal (cond->cond);

View File

@ -20,6 +20,7 @@
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include "pthreadP.h" #include "pthreadP.h"
#include <atomic.h>
#include <shlib-compat.h> #include <shlib-compat.h>
@ -32,18 +33,19 @@ __pthread_cond_timedwait_2_0 (cond, mutex, abstime)
{ {
if (cond->cond == NULL) if (cond->cond == NULL)
{ {
lll_mutex_lock (cond->lock); pthread_cond_t *newcond;
/* Check whether the condvar is still not allocated. */ newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
if (cond->cond == NULL) if (newcond == NULL)
cond->cond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
lll_mutex_unlock (cond->lock);
if (cond->cond == NULL)
return ENOMEM; return ENOMEM;
*cond->cond = (struct pthread_cond_t) PTHREAD_COND_INITIALIZER; *newcond = (struct pthread_cond_t) PTHREAD_COND_INITIALIZER;
atomic_write_barrier ();
if (atomic_compare_and_exchange_acq (&cond->cond, newcond, NULL) != 0)
/* Somebody else just initialized the condvar. */
free (newcond);
} }
return __pthread_cond_timedwait (cond->cond, mutex, abstime); return __pthread_cond_timedwait (cond->cond, mutex, abstime);

View File

@ -20,6 +20,7 @@
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include "pthreadP.h" #include "pthreadP.h"
#include <atomic.h>
#include <shlib-compat.h> #include <shlib-compat.h>
@ -31,18 +32,19 @@ __pthread_cond_wait_2_0 (cond, mutex)
{ {
if (cond->cond == NULL) if (cond->cond == NULL)
{ {
lll_mutex_lock (cond->lock); pthread_cond_t *newcond;
/* Check whether the condvar is still not allocated. */ newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
if (cond->cond == NULL) if (newcond == NULL)
cond->cond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
lll_mutex_unlock (cond->lock);
if (cond->cond == NULL)
return ENOMEM; return ENOMEM;
*cond->cond = (struct pthread_cond_t) PTHREAD_COND_INITIALIZER; *newcond = (struct pthread_cond_t) PTHREAD_COND_INITIALIZER;
atomic_write_barrier ();
if (atomic_compare_and_exchange_acq (&cond->cond, newcond, NULL) != 0)
/* Somebody else just initialized the condvar. */
free (newcond);
} }
return __pthread_cond_wait (cond->cond, mutex); return __pthread_cond_wait (cond->cond, mutex);

View File

@ -1,5 +1,5 @@
/* Thread-local storage handling in the ELF dynamic linker. Generic version. /* Thread-local storage handling in the ELF dynamic linker. Generic version.
Copyright (C) 2002 Free Software Foundation, Inc. Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -388,7 +388,7 @@ _dl_allocate_tls (void *mem)
? _dl_allocate_tls_storage () ? _dl_allocate_tls_storage ()
: allocate_dtv (mem)); : allocate_dtv (mem));
} }
INTDEF(_dl_allocate_tls) rtld_hidden_def (_dl_allocate_tls)
void void
@ -409,7 +409,7 @@ _dl_deallocate_tls (void *tcb, bool dealloc_tcb)
free (tcb); free (tcb);
} }
} }
rtld_hidden_def (_dl_deallocate_tls)
# ifdef SHARED # ifdef SHARED

View File

@ -1,5 +1,5 @@
/* Run-time dynamic linker data structures for loaded ELF shared objects. /* Run-time dynamic linker data structures for loaded ELF shared objects.
Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc. Copyright (C) 1995-2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -769,6 +769,7 @@ rtld_hidden_proto (_dl_tls_setup)
/* Allocate memory for static TLS block (unless MEM is nonzero) and dtv. */ /* Allocate memory for static TLS block (unless MEM is nonzero) and dtv. */
extern void *_dl_allocate_tls (void *mem) internal_function; extern void *_dl_allocate_tls (void *mem) internal_function;
rtld_hidden_proto (_dl_allocate_tls)
/* Get size and alignment requirements of the static TLS block. */ /* Get size and alignment requirements of the static TLS block. */
extern void _dl_get_tls_static_info (size_t *sizep, size_t *alignp) extern void _dl_get_tls_static_info (size_t *sizep, size_t *alignp)
@ -783,6 +784,7 @@ rtld_hidden_proto (_dl_allocate_tls_init)
/* Deallocate memory allocated with _dl_allocate_tls. */ /* Deallocate memory allocated with _dl_allocate_tls. */
extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb) internal_function; extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb) internal_function;
rtld_hidden_proto (_dl_deallocate_tls)
/* Return the symbol address given the map of the module it is in and /* Return the symbol address given the map of the module it is in and
the symbol record. */ the symbol record. */