1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-08 17:42:12 +03:00

(_dl_fini): Add nloaded variable, load GL(dl_nloaded) into it while still in critical section.

This commit is contained in:
Ulrich Drepper
2004-07-08 00:52:17 +00:00
parent c61a8bb4a9
commit 28725d82f5

View File

@@ -43,22 +43,24 @@ _dl_fini (void)
dependencies to be taken into account. Therefore we have to start dependencies to be taken into account. Therefore we have to start
determining the order of the modules once again from the beginning. */ determining the order of the modules once again from the beginning. */
unsigned int i; unsigned int i;
unsigned int nloaded;
struct link_map *l; struct link_map *l;
struct link_map **maps; struct link_map **maps;
/* Protect against concurrent loads and unloads. */ /* Protect against concurrent loads and unloads. */
__rtld_lock_lock_recursive (GL(dl_load_lock)); __rtld_lock_lock_recursive (GL(dl_load_lock));
nloaded = GL(dl_nloaded);
/* XXX Could it be (in static binaries) that there is no object loaded? */ /* XXX Could it be (in static binaries) that there is no object loaded? */
assert (GL(dl_nloaded) > 0); assert (nloaded > 0);
/* Now we can allocate an array to hold all the pointers and copy /* Now we can allocate an array to hold all the pointers and copy
the pointers in. */ the pointers in. */
maps = (struct link_map **) alloca (GL(dl_nloaded) maps = (struct link_map **) alloca (nloaded * sizeof (struct link_map *));
* sizeof (struct link_map *));
for (l = GL(dl_loaded), i = 0; l != NULL; l = l->l_next) for (l = GL(dl_loaded), i = 0; l != NULL; l = l->l_next)
{ {
assert (i < GL(dl_nloaded)); assert (i < nloaded);
maps[i++] = l; maps[i++] = l;
@@ -66,7 +68,7 @@ _dl_fini (void)
from underneath us. */ from underneath us. */
++l->l_opencount; ++l->l_opencount;
} }
assert (i == GL(dl_nloaded)); assert (i == nloaded);
/* Now we have to do the sorting. */ /* Now we have to do the sorting. */
for (l = GL(dl_loaded)->l_next; l != NULL; l = l->l_next) for (l = GL(dl_loaded)->l_next; l != NULL; l = l->l_next)
@@ -80,7 +82,7 @@ _dl_fini (void)
/* Find all object for which the current one is a dependency and /* Find all object for which the current one is a dependency and
move the found object (if necessary) in front. */ move the found object (if necessary) in front. */
for (k = j + 1; k < GL(dl_nloaded); ++k) for (k = j + 1; k < nloaded; ++k)
{ {
struct link_map **runp = maps[k]->l_initfini; struct link_map **runp = maps[k]->l_initfini;
if (runp != NULL) if (runp != NULL)
@@ -136,7 +138,7 @@ _dl_fini (void)
/* 'maps' now contains the objects in the right order. Now call the /* 'maps' now contains the objects in the right order. Now call the
destructors. We have to process this array from the front. */ destructors. We have to process this array from the front. */
for (i = 0; i < GL(dl_nloaded); ++i) for (i = 0; i < nloaded; ++i)
{ {
l = maps[i]; l = maps[i];