aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--nptl/ChangeLog7
-rw-r--r--nptl/pthread_create.c6
-rw-r--r--nptl/sysdeps/i386/tls.h46
-rw-r--r--resolv/res_libc.c2
5 files changed, 40 insertions, 26 deletions
diff --git a/ChangeLog b/ChangeLog
index 359aa8dc6b..e74f0321b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2003-02-23 Ulrich Drepper <drepper@redhat.com>
+
+ * resolv/res_libc.c [USE___THREAD] (_res): Initialize _vcsock
+ element to -1.
+
2003-02-22 Ulrich Drepper <drepper@redhat.com>
* sysdeps/generic/dl-sysdep.c: Avoid warning.
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 75158615c0..c44f1f5ab3 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,10 @@
+2003-02-23 Ulrich Drepper <drepper@redhat.com>
+
+ * pthread_create.c (start_thread): Set EXITING_BIT early.
+
+ * sysdeps/i386/tls.h (THREAD_GETMEM): Mark asm as volatile.
+ (THREAD_GETMEM_NC): Likewise.
+
2003-02-22 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Shave
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index 40a95c6f91..6ed5200e33 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -228,6 +228,9 @@ start_thread (void *arg)
pd->result = pd->start_routine (pd->arg);
}
+ /* The thread is exiting now. */
+ atomic_bit_set (&pd->cancelhandling, EXITING_BIT);
+
/* Clean up any state libc stored in thread-local variables. */
__libc_thread_freeres ();
@@ -267,9 +270,6 @@ start_thread (void *arg)
}
- /* The thread is exiting now. */
- atomic_bit_set (&pd->cancelhandling, EXITING_BIT);
-
/* If the thread is detached free the TCB. */
if (IS_DETACHED (pd))
/* Free the TCB. */
diff --git a/nptl/sysdeps/i386/tls.h b/nptl/sysdeps/i386/tls.h
index c4bd1def8a..9c4c481ccb 100644
--- a/nptl/sysdeps/i386/tls.h
+++ b/nptl/sysdeps/i386/tls.h
@@ -247,13 +247,13 @@ union user_desc_init
# define THREAD_GETMEM(descr, member) \
({ __typeof (descr->member) __value; \
if (sizeof (__value) == 1) \
- asm ("movb %%gs:%P2,%b0" \
- : "=q" (__value) \
- : "0" (0), "i" (offsetof (struct pthread, member))); \
+ asm volatile ("movb %%gs:%P2,%b0" \
+ : "=q" (__value) \
+ : "0" (0), "i" (offsetof (struct pthread, member))); \
else if (sizeof (__value) == 4) \
- asm ("movl %%gs:%P1,%0" \
- : "=r" (__value) \
- : "i" (offsetof (struct pthread, member))); \
+ asm volatile ("movl %%gs:%P1,%0" \
+ : "=r" (__value) \
+ : "i" (offsetof (struct pthread, member))); \
else \
{ \
if (sizeof (__value) != 8) \
@@ -261,11 +261,11 @@ union user_desc_init
4 or 8. */ \
abort (); \
\
- asm ("movl %%gs:%P1,%%eax\n\t" \
- "movl %%gs:%P2,%%edx" \
- : "=A" (__value) \
- : "i" (offsetof (struct pthread, member)), \
- "i" (offsetof (struct pthread, member) + 4)); \
+ asm volatile ("movl %%gs:%P1,%%eax\n\t" \
+ "movl %%gs:%P2,%%edx" \
+ : "=A" (__value) \
+ : "i" (offsetof (struct pthread, member)), \
+ "i" (offsetof (struct pthread, member) + 4)); \
} \
__value; })
@@ -274,14 +274,15 @@ union user_desc_init
# define THREAD_GETMEM_NC(descr, member, idx) \
({ __typeof (descr->member[0]) __value; \
if (sizeof (__value) == 1) \
- asm ("movb %%gs:%P2(%3),%b0" \
- : "=q" (__value) \
- : "0" (0), "i" (offsetof (struct pthread, member[0])), \
- "r" (idx)); \
+ asm volatile ("movb %%gs:%P2(%3),%b0" \
+ : "=q" (__value) \
+ : "0" (0), "i" (offsetof (struct pthread, member[0])), \
+ "r" (idx)); \
else if (sizeof (__value) == 4) \
- asm ("movl %%gs:%P1(,%2,4),%0" \
- : "=r" (__value) \
- : "i" (offsetof (struct pthread, member[0])), "r" (idx)); \
+ asm volatile ("movl %%gs:%P1(,%2,4),%0" \
+ : "=r" (__value) \
+ : "i" (offsetof (struct pthread, member[0])), \
+ "r" (idx)); \
else \
{ \
if (sizeof (__value) != 8) \
@@ -289,10 +290,11 @@ union user_desc_init
4 or 8. */ \
abort (); \
\
- asm ("movl %%gs:%P1(,%2,8),%%eax\n\t" \
- "movl %%gs:4+%P1(,%2,8),%%edx" \
- : "=&A" (__value) \
- : "i" (offsetof (struct pthread, member[0])), "r" (idx)); \
+ asm volatile ("movl %%gs:%P1(,%2,8),%%eax\n\t" \
+ "movl %%gs:4+%P1(,%2,8),%%edx" \
+ : "=&A" (__value) \
+ : "i" (offsetof (struct pthread, member[0])), \
+ "r" (idx)); \
} \
__value; })
diff --git a/resolv/res_libc.c b/resolv/res_libc.c
index 763a88725a..a700e9d9b6 100644
--- a/resolv/res_libc.c
+++ b/resolv/res_libc.c
@@ -72,7 +72,7 @@ res_init(void) {
#if USE___THREAD
/* With __thread support, this per-thread variable is used in all cases. */
-__thread struct __res_state _res;
+__thread struct __res_state _res = { ._vcsock = -1 };
extern __thread struct __res_state __libc_res __attribute__ ((alias ("_res")))
attribute_hidden;
# define _res __libc_res