From 415ef7d8934577f9f9b460e5ebdf040aaa867b4c Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Fri, 14 Mar 2003 23:12:09 +0000 Subject: * 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. --- nptl/ChangeLog | 10 +++++++++ nptl/Makefile | 2 +- nptl/allocatestack.c | 2 +- nptl/init.c | 4 +++- nptl/pthread_create.c | 2 +- nptl/tst-fork4.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 nptl/tst-fork4.c (limited to 'nptl') diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 2cea8be0cc..9573fc3c79 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,5 +1,15 @@ +2003-03-14 Steven Munroe + + * 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 + * tst-fork4.c: New file. + * Makefile (tests): Add it. + * descr.h (struct pthread): Move the union out of [!TLS_DTV_AT_TP], so we always define the padding space. [!TLS_DTV_AT_TP]: Give tcbhead_t field a name, `header', since GCC diff --git a/nptl/Makefile b/nptl/Makefile index 656e0c48a2..b59ffd86bb 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -144,7 +144,7 @@ tests = tst-attr1 tst-attr2 \ tst-eintr1 \ tst-tsd1 tst-tsd2 \ tst-tls1 tst-tls2 \ - tst-fork1 tst-fork2 tst-fork3 \ + tst-fork1 tst-fork2 tst-fork3 tst-fork4 \ tst-atfork1 \ tst-cancel1 tst-cancel2 tst-cancel3 tst-cancel4 tst-cancel5 \ tst-cancel6 tst-cancel7 tst-cancel8 tst-cancel9 tst-cancel10 \ diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index 8e77543927..45e4d87c49 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -102,7 +102,7 @@ static LIST_HEAD (stack_used); /* List of the threads with user provided stacks in use. No need to initialize this, since it's done in __pthread_initialize_minimal. */ list_t __stack_user __attribute__ ((nocommon)); -hidden_def (__stack_user) +hidden_data_def (__stack_user) #if COLORING_INCREMENT != 0 /* Number of threads created. */ diff --git a/nptl/init.c b/nptl/init.c index 8ee3df1fa3..33673cd74b 100644 --- a/nptl/init.c +++ b/nptl/init.c @@ -44,7 +44,9 @@ # define __NR_set_tid_address 258 #elif defined __x86_64__ # define __NR_set_tid_address 218 -#eli +#elif defined __powerpc__ +# define __NR_set_tid_address 232 +#elif # error "define __NR_set_tid_address" #endif #endif diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index ec004194b2..c0d9ec08f5 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -59,7 +59,7 @@ unsigned int __nptl_nthreads = 1; /* Table of the key information. */ struct pthread_key_struct __pthread_keys[PTHREAD_KEYS_MAX] __attribute__ ((nocommon)); -hidden_def (__pthread_keys) +hidden_data_def (__pthread_keys) /* This is for libthread_db only. */ const int __pthread_pthread_sizeof_descr = sizeof (struct pthread); diff --git a/nptl/tst-fork4.c b/nptl/tst-fork4.c new file mode 100644 index 0000000000..7f2b178e26 --- /dev/null +++ b/nptl/tst-fork4.c @@ -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 +#include +#include +#include +#include +#include + +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; +} -- cgit v1.2.3