about summary refs log tree commit diff
path: root/linuxthreads
diff options
context:
space:
mode:
Diffstat (limited to 'linuxthreads')
-rw-r--r--linuxthreads/ChangeLog15
-rw-r--r--linuxthreads/Versions3
-rw-r--r--linuxthreads/errno.c7
-rw-r--r--linuxthreads/internals.h7
-rw-r--r--linuxthreads/manager.c1
-rw-r--r--linuxthreads/pthread.c3
6 files changed, 35 insertions, 1 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index 522bea2dca..7d161b8254 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -1,3 +1,18 @@
+1999-12-03  Andreas Jaeger  <aj@suse.de>
+
+	* Versions: Add __res_state with version GLIBC_2.2.
+
+	* errno.c (__res_state): New function to return thread specific
+	resolver state.
+
+	* pthread.c (pthread_initialize): Initialize p_resp.
+	(__pthread_reset_main_thread): Also set p_resp.
+
+	* manager.c (pthread_handle_create): Initialize p_resp.
+
+	* internals.h: Add thread specific resolver state.
+	Based on patches by Adam D. Bradley <artdodge@cs.bu.edu>.
+
 1999-12-01  Ulrich Drepper  <drepper@cygnus.com>
 
 	* sysdeps/i386/pt-machine.h: Move stack_pointer definition to the
diff --git a/linuxthreads/Versions b/linuxthreads/Versions
index c0ec792382..ab4dce50da 100644
--- a/linuxthreads/Versions
+++ b/linuxthreads/Versions
@@ -118,4 +118,7 @@ libpthread {
     __pthread_kill_other_threads_np;
     __vfork;
   }
+  GLIBC_2.2 {
+    __res_state;
+  }
 }
diff --git a/linuxthreads/errno.c b/linuxthreads/errno.c
index 746474860c..bd9584f80e 100644
--- a/linuxthreads/errno.c
+++ b/linuxthreads/errno.c
@@ -30,3 +30,10 @@ int * __h_errno_location()
   pthread_descr self = thread_self();
   return THREAD_GETMEM (self, p_h_errnop);
 }
+
+/* Return thread specific resolver state.  */
+struct __res_state * __res_state()
+{
+  pthread_descr self = thread_self();
+  return THREAD_GETMEM (self, p_resp);
+}
diff --git a/linuxthreads/internals.h b/linuxthreads/internals.h
index cd9091bd81..2e4b4b79b7 100644
--- a/linuxthreads/internals.h
+++ b/linuxthreads/internals.h
@@ -26,6 +26,9 @@
 #include <sys/types.h>
 #include <bits/libc-tsd.h> /* for _LIBC_TSD_KEY_N */
 
+#include <resolv.h> /* for per-thread resolver context */
+
+
 #include "pt-machine.h"
 #include "semaphore.h"
 #include "../linuxthreads_db/thread_dbP.h"
@@ -119,9 +122,11 @@ struct _pthread_descr_struct {
   size_t p_guardsize;		/* size of guard area */
   pthread_descr p_self;		/* Pointer to this structure */
   int p_nr;                     /* Index of descriptor in __pthread_handles */
-  /* New elements must be added at the end.  */
   int p_report_events;		/* Nonzero if events must be reported.  */
   td_eventbuf_t p_eventbuf;     /* Data for event.  */
+  struct __res_state *p_resp;	/* Pointer to resolver state */
+  struct __res_state p_res;	/* per-thread resolver state */
+  /* New elements must be added at the end.  */
 } __attribute__ ((aligned(32))); /* We need to align the structure so that
 				    doubles are aligned properly.  This is 8
 				    bytes on MIPS and 16 bytes on MIPS64.
diff --git a/linuxthreads/manager.c b/linuxthreads/manager.c
index 6fced74ce7..307ce63721 100644
--- a/linuxthreads/manager.c
+++ b/linuxthreads/manager.c
@@ -384,6 +384,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
   new_thread->p_canceltype = PTHREAD_CANCEL_DEFERRED;
   new_thread->p_errnop = &new_thread->p_errno;
   new_thread->p_h_errnop = &new_thread->p_h_errno;
+  new_thread->p_resp = &new_thread->p_res;
   new_thread->p_guardaddr = guardaddr;
   new_thread->p_guardsize = guardsize;
   new_thread->p_self = new_thread;
diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c
index bddec8c757..41d09a833c 100644
--- a/linuxthreads/pthread.c
+++ b/linuxthreads/pthread.c
@@ -318,6 +318,8 @@ static void pthread_initialize(void)
   /* The errno/h_errno variable of the main thread are the global ones.  */
   __pthread_initial_thread.p_errnop = &_errno;
   __pthread_initial_thread.p_h_errnop = &_h_errno;
+  /* Likewise for the resolver state _res.  */
+  __pthread_initial_thread.p_resp = &_res;
 #ifdef __SIGRTMIN
   /* Initialize real-time signals. */
   init_rtsigs ();
@@ -725,6 +727,7 @@ void __pthread_reset_main_thread()
   /* Now this thread modifies the global variables.  */
   THREAD_SETMEM(self, p_errnop, &_errno);
   THREAD_SETMEM(self, p_h_errnop, &_h_errno);
+  THREAD_SETMEM(self, p_resp, &_res);
 }
 
 /* Process-wide exec() request */