* allocatestack.c (__stack_user): Use hidden_data_def.

* pthread_create.c (__pthread_keys): Likewise.

	* init.c [__powerpc__] (__NR_set_tid_address): Define it.

	* tst-fork4.c: New file.
	* Makefile (tests): Add it.
This commit is contained in:
Roland McGrath 2003-03-14 23:12:09 +00:00
parent 5228750594
commit 415ef7d893
6 changed files with 76 additions and 4 deletions

View File

@ -1,5 +1,15 @@
2003-03-14 Steven Munroe <sjmunroe@us.ibm.com>
* allocatestack.c (__stack_user): Use hidden_data_def.
* pthread_create.c (__pthread_keys): Likewise.
* init.c [__powerpc__] (__NR_set_tid_address): Define it.
2003-03-14 Roland McGrath <roland@redhat.com> 2003-03-14 Roland McGrath <roland@redhat.com>
* tst-fork4.c: New file.
* Makefile (tests): Add it.
* descr.h (struct pthread): Move the union out of [!TLS_DTV_AT_TP], so * descr.h (struct pthread): Move the union out of [!TLS_DTV_AT_TP], so
we always define the padding space. we always define the padding space.
[!TLS_DTV_AT_TP]: Give tcbhead_t field a name, `header', since GCC [!TLS_DTV_AT_TP]: Give tcbhead_t field a name, `header', since GCC

View File

@ -144,7 +144,7 @@ tests = tst-attr1 tst-attr2 \
tst-eintr1 \ tst-eintr1 \
tst-tsd1 tst-tsd2 \ tst-tsd1 tst-tsd2 \
tst-tls1 tst-tls2 \ tst-tls1 tst-tls2 \
tst-fork1 tst-fork2 tst-fork3 \ tst-fork1 tst-fork2 tst-fork3 tst-fork4 \
tst-atfork1 \ tst-atfork1 \
tst-cancel1 tst-cancel2 tst-cancel3 tst-cancel4 tst-cancel5 \ tst-cancel1 tst-cancel2 tst-cancel3 tst-cancel4 tst-cancel5 \
tst-cancel6 tst-cancel7 tst-cancel8 tst-cancel9 tst-cancel10 \ tst-cancel6 tst-cancel7 tst-cancel8 tst-cancel9 tst-cancel10 \

View File

@ -102,7 +102,7 @@ static LIST_HEAD (stack_used);
/* List of the threads with user provided stacks in use. No need to /* List of the threads with user provided stacks in use. No need to
initialize this, since it's done in __pthread_initialize_minimal. */ initialize this, since it's done in __pthread_initialize_minimal. */
list_t __stack_user __attribute__ ((nocommon)); list_t __stack_user __attribute__ ((nocommon));
hidden_def (__stack_user) hidden_data_def (__stack_user)
#if COLORING_INCREMENT != 0 #if COLORING_INCREMENT != 0
/* Number of threads created. */ /* Number of threads created. */

View File

@ -44,7 +44,9 @@
# define __NR_set_tid_address 258 # define __NR_set_tid_address 258
#elif defined __x86_64__ #elif defined __x86_64__
# define __NR_set_tid_address 218 # define __NR_set_tid_address 218
#eli #elif defined __powerpc__
# define __NR_set_tid_address 232
#elif
# error "define __NR_set_tid_address" # error "define __NR_set_tid_address"
#endif #endif
#endif #endif

View File

@ -59,7 +59,7 @@ unsigned int __nptl_nthreads = 1;
/* Table of the key information. */ /* Table of the key information. */
struct pthread_key_struct __pthread_keys[PTHREAD_KEYS_MAX] struct pthread_key_struct __pthread_keys[PTHREAD_KEYS_MAX]
__attribute__ ((nocommon)); __attribute__ ((nocommon));
hidden_def (__pthread_keys) hidden_data_def (__pthread_keys)
/* This is for libthread_db only. */ /* This is for libthread_db only. */
const int __pthread_pthread_sizeof_descr = sizeof (struct pthread); const int __pthread_pthread_sizeof_descr = sizeof (struct pthread);

60
nptl/tst-fork4.c Normal file
View File

@ -0,0 +1,60 @@
/* Test of fork updating child universe's pthread structures.
Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int
main (void)
{
pthread_t me = pthread_self ();
pid_t pid = fork ();
if (pid < 0)
{
printf ("fork: %m\n");
return 1;
}
if (pid == 0)
{
int err = pthread_kill (me, SIGTERM);
printf ("pthread_kill returned: %s\n", strerror (err));
return 3;
}
int status;
errno = 0;
if (wait (&status) != pid)
printf ("wait failed: %m\n");
else if (WIFSIGNALED (status) && WTERMSIG (status) == SIGTERM)
{
printf ("child correctly died with SIGTERM\n");
return 0;
}
else
printf ("child died with bad status %#x\n", status);
return 1;
}