2004-07-07  Ulrich Drepper  <drepper@redhat.com>

	* elf/dl-fini.c (_dl_fini): Move the unlock of the ld.so lock
	before the loop running the destructors.
This commit is contained in:
Ulrich Drepper 2004-07-07 07:41:02 +00:00
parent e782376c01
commit 8e5aaad9da
4 changed files with 26 additions and 4 deletions

View file

@ -1,3 +1,8 @@
2004-07-07 Ulrich Drepper <drepper@redhat.com>
* elf/dl-fini.c (_dl_fini): Move the unlock of the ld.so lock
before the loop running the destructors.
2004-05-18 Andreas Schwab <schwab@suse.de>
* elf/dl-load.c (_dl_map_object_from_fd): Use the end address of

View file

@ -126,6 +126,14 @@ _dl_fini (void)
}
}
/* We do not rely on the linked list of loaded object anymore from
this point on. We have our own list here (maps). The various
members of this list cannot vanish since the open count is too
high and will be decremented in this loop. So we release the
lock so that some code which might be called from a destructor
can directly or indirectly access the lock. */
__rtld_lock_unlock_recursive (GL(dl_load_lock));
/* 'maps' now contains the objects in the right order. Now call the
destructors. We have to process this array from the front. */
for (i = 0; i < GL(dl_nloaded); ++i)
@ -171,8 +179,6 @@ _dl_fini (void)
--l->l_opencount;
}
__rtld_lock_unlock_recursive (GL(dl_load_lock));
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_STATISTICS, 0))
_dl_debug_printf ("\nruntime linker statistics:\n"
" final number of relocations: %lu\n"

View file

@ -1,3 +1,9 @@
2004-07-07 Ulrich Drepper <drepper@redhat.com>
* Makefile: Add rules to build and run tst-fini1.
* tst-fini1.c: New file.
* tst-fini1mod.c: New file.
2004-07-05 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Define NO_CANCELLATION

View file

@ -263,7 +263,8 @@ tests += tst-cancelx2 tst-cancelx3 tst-cancelx4 tst-cancelx5 \
tst-oncex3 tst-oncex4
endif
ifeq ($(build-shared),yes)
tests += tst-atfork2 tst-tls3 tst-tls4 tst-tls5 tst-_res1
tests += tst-atfork2 tst-tls3 tst-tls4 tst-tls5 tst-_res1 tst-fini1
tests-nolibpthread += tst-fini1
ifeq ($(have-z-execstack),yes)
tests += tst-execstack
endif
@ -272,7 +273,7 @@ endif
modules-names = tst-atfork2mod tst-tls3mod tst-tls4moda tst-tls4modb \
tst-tls5mod tst-tls5moda tst-tls5modb tst-tls5modc \
tst-tls5modd tst-tls5mode tst-tls5modf \
tst-_res1mod1 tst-_res1mod2 tst-execstack-mod
tst-_res1mod1 tst-_res1mod2 tst-execstack-mod tst-fini1mod
extra-objs += $(addsuffix .os,$(strip $(modules-names))) tst-cleanup4aux.o
test-extras += $(modules-names)
test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names)))
@ -450,6 +451,8 @@ endif
$(objpfx)tst-dlsym1: $(libdl) $(shared-thread-library)
$(objpfx)tst-fini1: $(shared-thread-library) $(objpfx)tst-fini1mod.so
ifeq (yes,$(build-shared))
$(objpfx)tst-cond11: $(common-objpfx)rt/librt.so
$(objpfx)tst-cond19: $(common-objpfx)rt/librt.so
@ -579,6 +582,8 @@ $(objpfx)tst-execstack: $(libdl)
$(objpfx)tst-execstack.out: $(objpfx)tst-execstack-mod.so
LDFLAGS-tst-execstack = -Wl,-z,noexecstack
$(objpfx)tst-fini1mod.so: $(shared-thread-library)
# The tests here better do not run in parallel
ifneq ($(filter %tests,$(MAKECMDGOALS)),)
.NOTPARALLEL: