summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-04-09 05:51:26 +0000
committerUlrich Drepper <drepper@redhat.com>2006-04-09 05:51:26 +0000
commit279d494b1d089d085b44f2de6c62a0752001b074 (patch)
tree660bb0f412f10f88a145af3821414de3849e372f
parentab9a9ff8a1db6e91ce2461069c709e68bd82d8eb (diff)
downloadglibc-279d494b1d089d085b44f2de6c62a0752001b074.tar.gz
glibc-279d494b1d089d085b44f2de6c62a0752001b074.tar.xz
glibc-279d494b1d089d085b44f2de6c62a0752001b074.zip
* inet/inet_ntoa.c: Rewrite to use TLS instead of TSD.
-rw-r--r--ChangeLog2
-rw-r--r--inet/inet_ntoa.c69
2 files changed, 7 insertions, 64 deletions
diff --git a/ChangeLog b/ChangeLog
index 1323800c6b..89cb1422b1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2006-04-08  Ulrich Drepper  <drepper@redhat.com>
 
+	* inet/inet_ntoa.c: Rewrite to use TLS instead of TSD.
+
 	* nis/nss_nis/nis-alias.c: Optimize use of yperr2nss.  Avoid calling
 	it for YPERR_SUCCESS.  Minor cleanups.  Add __builtin_expect.
 	* nis/nss_nis/nis-ethers.c: Likewise.
diff --git a/inet/inet_ntoa.c b/inet/inet_ntoa.c
index 889435dd10..38794957c2 100644
--- a/inet/inet_ntoa.c
+++ b/inet/inet_ntoa.c
@@ -21,78 +21,19 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <arpa/inet.h>
-#include <bits/libc-lock.h>
 
 /* The interface of this function is completely stupid, it requires a
-   static buffer.  We relax this a bit in that we allow at least one
-   buffer for each thread.  */
-
-/* This is the key for the thread specific memory.  */
-static __libc_key_t key;
-
-/* If nonzero the key allocation failed and we should better use a
-   static buffer than fail.  */
-static char local_buf[18];
-static char *static_buf;
-
-/* Destructor for the thread-specific data.  */
-static void init (void);
-static void free_key_mem (void *mem);
+   static buffer.  We relax this a bit in that we allow one buffer for
+   each thread.  */
+static __thread char buffer[18];
 
 
 char *
 inet_ntoa (struct in_addr in)
 {
-  __libc_once_define (static, once);
-  char *buffer;
-  unsigned char *bytes;
-
-  /* If we have not yet initialized the buffer do it now.  */
-  __libc_once (once, init);
-
-  if (static_buf != NULL)
-    buffer = static_buf;
-  else
-    {
-      /* We don't use the static buffer and so we have a key.  Use it
-	 to get the thread-specific buffer.  */
-      buffer = __libc_getspecific (key);
-      if (buffer == NULL)
-	{
-	  /* No buffer allocated so far.  */
-	  buffer = malloc (18);
-	  if (buffer == NULL)
-	    /* No more memory available.  We use the static buffer.  */
-	    buffer = local_buf;
-	  else
-	    __libc_setspecific (key, buffer);
-	}
-    }
-
-  bytes = (unsigned char *) &in;
-  __snprintf (buffer, 18, "%d.%d.%d.%d",
+  unsigned char *bytes = (unsigned char *) &in;
+  __snprintf (buffer, sizeof (buffer), "%d.%d.%d.%d",
 	      bytes[0], bytes[1], bytes[2], bytes[3]);
 
   return buffer;
 }
-
-
-/* Initialize buffer.  */
-static void
-init (void)
-{
-  if (__libc_key_create (&key, free_key_mem))
-    /* Creating the key failed.  This means something really went
-       wrong.  In any case use a static buffer which is better than
-       nothing.  */
-    static_buf = local_buf;
-}
-
-
-/* Free the thread specific data, this is done if a thread terminates.  */
-static void
-free_key_mem (void *mem)
-{
-  free (mem);
-  __libc_setspecific (key, NULL);
-}