* elf/dl-close.c (_dl_close_worker): Renamed from _dl_close and
authorUlrich Drepper <drepper@redhat.com>
Fri, 27 Oct 2006 20:14:53 +0000 (20:14 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 27 Oct 2006 20:14:53 +0000 (20:14 +0000)
split out locking and parameter checking.
(_dl_close): Call _dl_close_worker after locking and checking.
* elf/dl-open.c (_dl_open): Call _dl_close_worker instead of
_dl_close.

we are sure we do not need it anymore for _dl_close.  Also move
* elf/dl-lookup.c (_dl_debug_bindings): Remove unused symbol_scope

ChangeLog
elf/dl-close.c
elf/dl-open.c

index 2ee96f0..c579426 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,18 +1,24 @@
 2006-10-27  Ulrich Drepper  <drepper@redhat.com>
 
+       * elf/dl-close.c (_dl_close_worker): Renamed from _dl_close and
+       split out locking and parameter checking.
+       (_dl_close): Call _dl_close_worker after locking and checking.
+       * elf/dl-open.c (_dl_open): Call _dl_close_worker instead of
+       _dl_close.
+
        [BZ #3426]
        * stdlib/stdlib.h: Adjust comment for canonicalize_file_name to
        reality.
 
        [BZ #3429]
        * elf/dl-open.c (dl_open_worker): Keep holding dl_load_lock until
-       we are sure we do not need it anymore for _dl_close.  ALso move
+       we are sure we do not need it anymore for _dl_close.  Also move
        the asserts inside the lock region.
        Patch mostly by Suzuki <suzuki@in.ibm.com>.
 
 2006-10-27  Jakub Jelinek  <jakub@redhat.com>
 
-       * elf/dl-lookup.c (_dl_debug_bindings): Remove unised symbol_scope
+       * elf/dl-lookup.c (_dl_debug_bindings): Remove unused symbol_scope
        argument.
        (_dl_lookup_symbol_x): Adjust caller.
 
index 31bc80b..51f813d 100644 (file)
@@ -107,19 +107,10 @@ remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp,
 
 
 void
-_dl_close (void *_map)
+_dl_close_worker (struct link_map *map)
 {
-  struct link_map *map = _map;
   Lmid_t ns = map->l_ns;
   unsigned int i;
-  /* First see whether we can remove the object at all.  */
-  if (__builtin_expect (map->l_flags_1 & DF_1_NODELETE, 0)
-      && map->l_init_called)
-    /* Nope.  Do nothing.  */
-    return;
-
-  if (__builtin_expect (map->l_direct_opencount, 1) == 0)
-    GLRO(dl_signal_error) (0, map->l_name, NULL, N_("shared object not open"));
 
   /* Acquire the lock.  */
   __rtld_lock_lock_recursive (GL(dl_load_lock));
@@ -143,7 +134,6 @@ _dl_close (void *_map)
        _dl_debug_printf ("\nclosing file=%s; direct_opencount=%u\n",
                          map->l_name, map->l_direct_opencount);
 
-      __rtld_lock_unlock_recursive (GL(dl_load_lock));
       return;
     }
 
@@ -698,6 +688,30 @@ _dl_close (void *_map)
     goto retry;
 
   dl_close_state = not_pending;
+}
+
+
+void
+_dl_close (void *_map)
+{
+  struct link_map *map = _map;
+
+  /* First see whether we can remove the object at all.  */
+  if (__builtin_expect (map->l_flags_1 & DF_1_NODELETE, 0))
+    {
+      assert (map->l_init_called);
+      /* Nope.  Do nothing.  */
+      return;
+    }
+
+  if (__builtin_expect (map->l_direct_opencount, 1) == 0)
+    GLRO(dl_signal_error) (0, map->l_name, NULL, N_("shared object not open"));
+
+  /* Acquire the lock.  */
+  __rtld_lock_lock_recursive (GL(dl_load_lock));
+
+  _dl_close_worker (map);
+
   __rtld_lock_unlock_recursive (GL(dl_load_lock));
 }
 
index 2a891f2..c28b6b1 100644 (file)
@@ -586,7 +586,7 @@ no more namespaces available for dlmopen()"));
            GL(dl_tls_dtv_gaps) = true;
 #endif
 
-         _dl_close (args.map);
+         _dl_close_worker (args.map);
        }
 
       assert (_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT);