about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2002-02-23 07:59:56 +0000
committerUlrich Drepper <drepper@redhat.com>2002-02-23 07:59:56 +0000
commite413826144bcd0a910e8a6f942ec34a368f65613 (patch)
treedf006e17ef7841a1d2886d800c60365492809291
parent903b3396b8a1a5f4488649b7975cffed4c771e80 (diff)
downloadglibc-e413826144bcd0a910e8a6f942ec34a368f65613.tar.gz
glibc-e413826144bcd0a910e8a6f942ec34a368f65613.tar.xz
glibc-e413826144bcd0a910e8a6f942ec34a368f65613.zip
Update.
2002-02-22  Ulrich Drepper  <drepper@redhat.com>

	* elf/Versions: Add _dl_allocate_tls and _dl_deallocate_tls.
	* elf/rtld.c (dl_main): Use _dl_allocate_tls with INTUSE.
	* sysdeps/generic/dl-tls.c: Add INTDEF for _dl_allocate_tls.
	(_dl_deallocate_tls): New function.
	* sysdeps/generic/ldsodefs.h: Declare _dl_allocate_tls_internal and
	_dl_deallocate_tls.
-rw-r--r--ChangeLog9
-rw-r--r--elf/Versions2
-rw-r--r--elf/rtld.c2
-rw-r--r--sysdeps/generic/dl-tls.c15
-rw-r--r--sysdeps/generic/ldsodefs.h4
5 files changed, 30 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 0cd1271d5c..41d839c8b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2002-02-22  Ulrich Drepper  <drepper@redhat.com>
+
+	* elf/Versions: Add _dl_allocate_tls and _dl_deallocate_tls.
+	* elf/rtld.c (dl_main): Use _dl_allocate_tls with INTUSE.
+	* sysdeps/generic/dl-tls.c: Add INTDEF for _dl_allocate_tls.
+	(_dl_deallocate_tls): New function.
+	* sysdeps/generic/ldsodefs.h: Declare _dl_allocate_tls_internal and
+	_dl_deallocate_tls.
+
 2002-02-21  Jakub Jelinek  <jakub@redhat.com>
 
 	* libio/fileops.c (_IO_file_seekoff_mmap): Fix fseek SEEK_END.
diff --git a/elf/Versions b/elf/Versions
index 927e26ff46..37d11d87b9 100644
--- a/elf/Versions
+++ b/elf/Versions
@@ -49,6 +49,6 @@ ld {
     _dl_map_object; _dl_map_object_deps; _dl_out_of_memory;
     _dl_relocate_object; _dl_signal_error; _dl_start_profile; _dl_starting_up;
     _dl_unload_cache;
-    _rtld_global; _dl_tls_symaddr;
+    _rtld_global; _dl_tls_symaddr; _dl_allocate_tls; _dl_deallocate_tls;
   }
 }
diff --git a/elf/rtld.c b/elf/rtld.c
index d7653f2394..b926271590 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -1240,7 +1240,7 @@ of this helper program; chances are you did not intend to run this program.\n\
 	 for the thread descriptor.  The memory for the TLS block will
 	 never be freed.  It should be allocated accordingly.  The dtv
 	 array can be changed if dynamic loading requires it.  */
-      tcbp = _dl_allocate_tls ();
+      tcbp = INTUSE(_dl_allocate_tls) ();
       if (tcbp == NULL)
 	_dl_fatal_printf ("\
 cannot allocate TLS data structures for inital thread");
diff --git a/sysdeps/generic/dl-tls.c b/sysdeps/generic/dl-tls.c
index 7e45850198..b7ed69f934 100644
--- a/sysdeps/generic/dl-tls.c
+++ b/sysdeps/generic/dl-tls.c
@@ -324,6 +324,21 @@ _dl_allocate_tls (void)
 
   return result;
 }
+INTDEF(_dl_allocate_tls)
+
+
+void
+internal_function
+_dl_deallocate_tls (void *tcb)
+{
+  dtv_t *dtv = GET_DTV (tcb);
+
+  /* The array starts with dtv[-1].  */
+  free (dtv - 1);
+
+  munmap (tcb, GL(dl_tls_static_size));
+}
+
 
 
 # ifdef SHARED
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index d722198328..779e438753 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -688,6 +688,10 @@ extern void _dl_determine_tlsoffset (void) internal_function;
 
 /* Allocate memory for static TLS block and dtv.  */
 extern void *_dl_allocate_tls (void) internal_function;
+extern void *_dl_allocate_tls_internal (void) internal_function;
+
+/* Deallocate memory allocated with _dl_allocate_tls.  */
+extern void _dl_deallocate_tls (void *tcb) internal_function;
 
 /* Return the symbol address given the map of the module it is in and
    the symbol record.  */