From: Roland McGrath Date: Fri, 14 Mar 2003 23:12:09 +0000 (+0000) Subject: * allocatestack.c (__stack_user): Use hidden_data_def. X-Git-Tag: upstream/2.30~19776 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=415ef7d8934577f9f9b460e5ebdf040aaa867b4c;p=external%2Fglibc.git * 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. --- diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 2cea8be..9573fc3 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 656e0c4..b59ffd8 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 8e77543..45e4d87 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 8ee3df1..33673cd 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 ec00419..c0d9ec0 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 0000000..7f2b178 --- /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; +}