diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | nptl/ChangeLog | 7 | ||||
-rw-r--r-- | nptl/pthread_create.c | 6 | ||||
-rw-r--r-- | nptl/sysdeps/i386/tls.h | 46 | ||||
-rw-r--r-- | resolv/res_libc.c | 2 |
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 |