diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-06-16 07:39:03 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-06-16 07:39:03 +0000 |
commit | 4cfde89657ffccbfb2801986d767964da400c7ec (patch) | |
tree | ce5425783f8c4d8503a6dee2e1c7472e442cc614 | |
parent | 553eca268c4d06b0c0c5966b1b8a0b01cd80cc02 (diff) | |
download | glibc-4cfde89657ffccbfb2801986d767964da400c7ec.tar.gz glibc-4cfde89657ffccbfb2801986d767964da400c7ec.tar.xz glibc-4cfde89657ffccbfb2801986d767964da400c7ec.zip |
Update.
2003-06-16 Ulrich Drepper <drepper@redhat.com> * elf/rtld.c (dl_main): Use l_map_start not l_addr in Phdr computation so that prelinking wroks. * inet/netinet/ip6.h (IP6OPT_PAD1, IP6OPT_PADN): Define.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | elf/rtld.c | 4 | ||||
-rw-r--r-- | localedata/locales/an_ES | 126 | ||||
-rw-r--r-- | localedata/locales/is_IS | 58 | ||||
-rw-r--r-- | localedata/tst-fmon.c | 3 | ||||
-rwxr-xr-x | localedata/tst-fmon.sh | 13 | ||||
-rw-r--r-- | localedata/tst-numeric.sh | 12 | ||||
-rw-r--r-- | nptl/Makefile | 7 | ||||
-rw-r--r-- | nptl/tst-cancel16.c | 231 | ||||
-rw-r--r-- | nptl/tst-cancelx16.c | 1 |
10 files changed, 416 insertions, 46 deletions
diff --git a/ChangeLog b/ChangeLog index abbe3a8bd2..d75612464b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-06-16 Ulrich Drepper <drepper@redhat.com> + + * elf/rtld.c (dl_main): Use l_map_start not l_addr in Phdr + computation so that prelinking wroks. + 2003-06-15 Ulrich Drepper <drepper@redhat.com> * elf/dl-iteratephdr.c (__dl_iterate_phdr): Don't skip dynamic @@ -51,7 +56,7 @@ * include/netinet/in.h (inet6_option_alloc): Add libc_hidden_proto definition. - * inet/netinet/ip6.h (IP6OPT_PAD1, IP6OPT_PADn): Define. + * inet/netinet/ip6.h (IP6OPT_PAD1, IP6OPT_PADN): Define. * inet/netinet/in.h: Add prototypes for inet6_option_* functions. * inet/Makefile (routines): Add inet6_option. * inet/inet6_option.c: New file. diff --git a/elf/rtld.c b/elf/rtld.c index 5347a5f7b8..4a086c2d32 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -933,8 +933,8 @@ of this helper program; chances are you did not intend to run this program.\n\ /* Set up the program header information for the dynamic linker itself. It is needed in the dl_iterate_phdr() callbacks. */ - ElfW(Ehdr) *rtld_ehdr = (ElfW(Ehdr) *) GL(dl_rtld_map.l_addr); - GL(dl_rtld_map).l_phdr = (ElfW(Phdr) *) (GL(dl_rtld_map.l_addr) + ElfW(Ehdr) *rtld_ehdr = (ElfW(Ehdr) *) GL(dl_rtld_map).l_map_start; + GL(dl_rtld_map).l_phdr = (ElfW(Phdr) *) (GL(dl_rtld_map).l_map_start + rtld_ehdr->e_phoff); GL(dl_rtld_map).l_phnum = rtld_ehdr->e_phnum; diff --git a/localedata/locales/an_ES b/localedata/locales/an_ES new file mode 100644 index 0000000000..30eafaf741 --- /dev/null +++ b/localedata/locales/an_ES @@ -0,0 +1,126 @@ +comment_char % +escape_char / +% +% Aragonese Language Locale for Spain +% Source: +% Address: +% Contact: Jordi Mallach Pérez +% Email: jordi@gnu.org +% Language: an +% Territory: ES +% Revision: 1.0 +% Date: 2003-05-22 +% Application: general +% Users: general +% Charset: ISO-8859-1 +% +% This file is under the +% GNU General Public License. +% Based in the gl_ES Locale + +LC_IDENTIFICATION +title "Aragonese locale for Spain" +source "" +address "" +contact "Jordi Mallach Pérez" +email "bug-glibc@gnu.org" +tel "" +fax "" +language "an" +territory "ES" +revision "1.0" +date "2003-06-15" +% +category "i18n:1999";LC_IDENTIFICATION +category "i18n:1999";LC_CTYPE +category "i18n:1999";LC_COLLATE +category "i18n:1999";LC_TIME +category "posix:1993";LC_NUMERIC +category "i18n:1999";LC_MONETARY +category "i18n:1999";LC_MESSAGES +category "i18n:1999";LC_PAPER +category "i18n:1999";LC_NAME +category "i18n:1999";LC_ADDRESS +category "i18n:1999";LC_TELEPHONE +END LC_IDENTIFICATION + +LC_COLLATE +copy "es_ES" +END LC_COLLATE + +LC_CTYPE +copy "es_ES" +END LC_CTYPE + +LC_MESSAGES +yesexpr "<U005E><U005B><U0073><U0053><U0079><U0059><U005D><U002E><U002A>" +noexpr "<U005E><U005B><U006E><U004E><U005D><U002E><U002A>" +END LC_MESSAGES + +LC_MONETARY +copy "es_ES" +END LC_MONETARY + +LC_NUMERIC +copy "es_ES" +END LC_NUMERIC + +LC_TIME +abday "<U0064><U006F><U006D>";"<U006C><U0075><U006E>";/ + "<U006D><U0061><U0072>";"<U006D><U0069><U0065>";/ + "<U0063><U0068><U0075>";"<U0062><U0069><U0065>";/ + "<U0073><U0061><U0062>" +day "<U0064><U006F><U006D><U0069><U006E><U0067><U006F>";/ + "<U006C><U0075><U006E><U0073>";/ + "<U006D><U0061><U0072><U0074><U0065><U0073>";/ + "<U006D><U0069><U0065><U0063><U006F><U006c><U0073>";/ + "<U0063><U0068><U0075><U0065><U0062><U0065><U0073>";/ + "<U0062><U0069><U0065><U0072><U006E><U0065><U0073>";/ + "<U0073><U0061><U0062><U0061><U0064><U006F>" +abmon "<U0063><U0068><U0069>";"<U0066><U0072><U0065>";/ + "<U006D><U0061><U0072>";"<U0061><U0062><U0072>";/ + "<U006D><U0061><U0079>";"<U0063><U0068><U006E>";/ + "<U0063><U0068><U006C>";"<U0061><U0067><U006F>";/ + "<U0073><U0065><U0074>";"<U006f><U0063><U0074>";/ + "<U006E><U006F><U0062>";"<U0061><U0062><U0069>" +mon "<U0063><U0068><U0069><U006E><U0065><U0072><U006F>";/ + "<U0066><U0072><U0065><U0062><U0065><U0072><U006F>";/ + "<U006D><U0061><U0072><U007A><U006F>";/ + "<U0061><U0062><U0072><U0069><U006C>";/ + "<U006D><U0061><U0079><U006F>";/ + "<U0063><U0068><U0075><U006E><U0069><U006F>";/ + "<U0063><U0068><U0075><U006C><U0069><U006F>";/ + "<U0061><U0067><U006F><U0073><U0074><U006F>";/ + "<U0073><U0065><U0074><U0069><U0065><U006D><U0062><U0072><U0065>";/ + "<U006F><U0063><U0074><U0075><U0062><U0072><U0065>";/ + "<U006E><U006F><U0062><U0069><U0065><U006D><U0062><U0072><U0065>";/ + "<U0061><U0062><U0069><U0065><U006E><U0074><U006F>" +d_t_fmt "<U0025><U0061><U0020><U0025><U0064><U0020><U0025><U0062><U0020><U0025><U0059><U0020><U0025><U0054><U0020><U0025><U005A>" +d_fmt "<U0025><U0064><U002F><U0025><U006D><U002F><U0025><U0079>" +t_fmt "<U0025><U0054>" +am_pm "";"" +t_fmt_ampm "" +date_fmt "<U0025><U0061><U0020><U0025><U0062><U0020><U0025><U0065>/ +<U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053><U0020>/ +<U0025><U005A><U0020><U0025><U0059>" +END LC_TIME + +LC_PAPER +copy "es_ES" +END LC_PAPER + +LC_TELEPHONE +copy "es_ES" +END LC_TELEPHONE + +LC_MEASUREMENT +copy "es_ES" +END LC_MEASUREMENT + +LC_NAME +copy "es_ES" +END LC_NAME + +LC_ADDRESS +copy "es_ES" +END LC_ADDRESS diff --git a/localedata/locales/is_IS b/localedata/locales/is_IS index a62aa35f11..d2da32b61b 100644 --- a/localedata/locales/is_IS +++ b/localedata/locales/is_IS @@ -2185,35 +2185,35 @@ grouping 3;3 END LC_NUMERIC LC_TIME -abday "<U0053><U0075><U006E>";"<U004D><U00E1><U006E>";/ - "<U00DE><U0072><U0069>";"<U004D><U0069><U00F0>";/ - "<U0046><U0069><U006D>";"<U0046><U00F6><U0073>";/ - "<U004C><U0061><U0075>" -day "<U0053><U0075><U006E><U006E><U0075><U0064><U0061><U0067><U0075><U0072>";/ - "<U004D><U00E1><U006E><U0075><U0064><U0061><U0067><U0075><U0072>";/ - "<U00DE><U0072><U0069><U00F0><U006A><U0075><U0064><U0061><U0067><U0075><U0072>";/ - "<U004D><U0069><U00F0><U0076><U0069><U006B><U0075><U0064><U0061><U0067><U0075><U0072>";/ - "<U0046><U0069><U006D><U006D><U0074><U0075><U0064><U0061><U0067><U0075><U0072>";/ - "<U0046><U00F6><U0073><U0074><U0075><U0064><U0061><U0067><U0075><U0072>";/ - "<U004C><U0061><U0075><U0067><U0061><U0072><U0064><U0061><U0067><U0075><U0072>" -abmon "<U004A><U0061><U006E>";"<U0046><U0065><U0062>";/ - "<U004D><U0061><U0072>";"<U0041><U0070><U0072>";/ - "<U004D><U0061><U00ED>";"<U004A><U00FA><U006E>";/ - "<U004A><U00FA><U006C>";"<U00C1><U0067><U00FA>";/ - "<U0053><U0065><U0070>";"<U004F><U006B><U0074>";/ - "<U004E><U00F3><U0076>";"<U0044><U0065><U0073>" -mon "<U004A><U0061><U006E><U00FA><U0061><U0072>";/ - "<U0046><U0065><U0062><U0072><U00FA><U0061><U0072>";/ - "<U004D><U0061><U0072><U0073>";/ - "<U0041><U0070><U0072><U00ED><U006C>";/ - "<U004D><U0061><U00ED>";/ - "<U004A><U00FA><U006E><U00ED>";/ - "<U004A><U00FA><U006C><U00ED>";/ - "<U00C1><U0067><U00FA><U0073><U0074>";/ - "<U0053><U0065><U0070><U0074><U0065><U006D><U0062><U0065><U0072>";/ - "<U004F><U006B><U0074><U00F3><U0062><U0065><U0072>";/ - "<U004E><U00F3><U0076><U0065><U006D><U0062><U0065><U0072>";/ - "<U0044><U0065><U0073><U0065><U006D><U0062><U0065><U0072>" +abday "<U0073><U0075><U006E>";"<U006D><U00E1><U006E>";/ + "<U00FE><U0072><U0069>";"<U006D><U0069><U00F0>";/ + "<U0066><U0069><U006D>";"<U0066><U00F6><U0073>";/ + "<U006C><U0061><U0075>" +day "<U0073><U0075><U006E><U006E><U0075><U0064><U0061><U0067><U0075><U0072>";/ + "<U006D><U00E1><U006E><U0075><U0064><U0061><U0067><U0075><U0072>";/ + "<U00FE><U0072><U0069><U00F0><U006A><U0075><U0064><U0061><U0067><U0075><U0072>";/ + "<U006D><U0069><U00F0><U0076><U0069><U006B><U0075><U0064><U0061><U0067><U0075><U0072>";/ + "<U0066><U0069><U006D><U006D><U0074><U0075><U0064><U0061><U0067><U0075><U0072>";/ + "<U0066><U00F6><U0073><U0074><U0075><U0064><U0061><U0067><U0075><U0072>";/ + "<U006C><U0061><U0075><U0067><U0061><U0072><U0064><U0061><U0067><U0075><U0072>" +abmon "<U006A><U0061><U006E>";"<U0066><U0065><U0062>";/ + "<U006D><U0061><U0072>";"<U0061><U0070><U0072>";/ + "<U006D><U0061><U00ED>";"<U006A><U00FA><U006E>";/ + "<U006A><U00FA><U006C>";"<U00E1><U0067><U00FA>";/ + "<U0073><U0065><U0070>";"<U006F><U006B><U0074>";/ + "<U006E><U00F3><U0076>";"<U0064><U0065><U0073>" +mon "<U006A><U0061><U006E><U00FA><U0061><U0072>";/ + "<U0066><U0065><U0062><U0072><U00FA><U0061><U0072>";/ + "<U006D><U0061><U0072><U0073>";/ + "<U0061><U0070><U0072><U00ED><U006C>";/ + "<U006D><U0061><U00ED>";/ + "<U006A><U00FA><U006E><U00ED>";/ + "<U006A><U00FA><U006C><U00ED>";/ + "<U00E1><U0067><U00FA><U0073><U0074>";/ + "<U0073><U0065><U0070><U0074><U0065><U006D><U0062><U0065><U0072>";/ + "<U006F><U006B><U0074><U00F3><U0062><U0065><U0072>";/ + "<U006E><U00F3><U0076><U0065><U006D><U0062><U0065><U0072>";/ + "<U0064><U0065><U0073><U0065><U006D><U0062><U0065><U0072>" d_t_fmt "<U0025><U0061><U0020><U0025><U0065><U002E><U0025><U0062><U0020><U0025><U0059><U002C><U0020><U0025><U0054><U0020><U0025><U005A>" d_fmt "<U0025><U0061><U0020><U0025><U0065><U002E><U0025><U0062><U0020><U0025><U0059>" t_fmt "<U0025><U0054>" diff --git a/localedata/tst-fmon.c b/localedata/tst-fmon.c index af87335972..091a057a0f 100644 --- a/localedata/tst-fmon.c +++ b/localedata/tst-fmon.c @@ -42,15 +42,12 @@ int main (int argc, char *argv[]) { char *s = malloc (201); - double monval; if (setlocale (LC_MONETARY, argv[1]) == NULL) { fprintf (stderr, "setlocale(LC_MONETARY, \"%s\"): %m\n", argv[1]); exit (EXIT_SETLOCALE); } - /* This is locale-dependent! see setlocale(3) for details */ - monval = strtod (argv[3], NULL); if (strfmon (s, 200, argv[2], (double) atof (argv[3])) == -1) { diff --git a/localedata/tst-fmon.sh b/localedata/tst-fmon.sh index e58db1d344..c8b6d69949 100755 --- a/localedata/tst-fmon.sh +++ b/localedata/tst-fmon.sh @@ -39,25 +39,26 @@ for cns in `cd ./tst-fmon-locales && ls tstfmon_*`; do done # Run the tests. +errcode=0 # There's a TAB for IFS while IFS=" " read locale format value expect; do case "$locale" in '#'*) continue ;; esac if [ -n "$format" ]; then - LOCPATH=${common_objpfx}localedata \ - GCONV_PATH=${common_objpfx}/iconvdata \ - ${run_program_prefix} ${common_objpfx}localedata/tst-fmon \ - "$locale" "$format" "$value" "$expect" - if [ $? -eq 0 ]; then + if LOCPATH=${common_objpfx}localedata \ + GCONV_PATH=${common_objpfx}/iconvdata \ + ${run_program_prefix} ${common_objpfx}localedata/tst-fmon \ + "$locale" "$format" "$value" "$expect" ; then echo "Locale: \"${locale}\" Format: \"${format}\"" \ "Value: \"${value}\" Expect: \"${expect}\" passed" else + errcode=$? echo "Locale: \"${locale}\" Format: \"${format}\"" \ "Value: \"${value}\" Expect: \"${expect}\" failed" fi fi done < $datafile -exit $? +exit $errcode # Local Variables: # mode:shell-script # End: diff --git a/localedata/tst-numeric.sh b/localedata/tst-numeric.sh index f590dfd042..f27eacd078 100644 --- a/localedata/tst-numeric.sh +++ b/localedata/tst-numeric.sh @@ -25,25 +25,27 @@ run_program_prefix=$2 datafile=$3 # Run the tests. +errcode=0 # There's a TAB for IFS while IFS=" " read locale format value expect; do case "$locale" in '#'*) continue ;; esac if [ -n "$format" ]; then - LOCPATH=${common_objpfx}localedata \ - GCONV_PATH=${common_objpfx}/iconvdata \ - ${run_program_prefix} ${common_objpfx}localedata/tst-numeric \ + if LOCPATH=${common_objpfx}localedata \ + GCONV_PATH=${common_objpfx}/iconvdata \ + ${run_program_prefix} ${common_objpfx}localedata/tst-numeric \ "$locale" "$format" "$value" "$expect" - if [ $? -eq 0 ]; then + then echo "Locale: \"${locale}\" Format: \"${format}\"" \ "Value: \"${value}\" Expect: \"${expect}\" passed" else + errcode=$? echo "Locale: \"${locale}\" Format: \"${format}\"" \ "Value: \"${value}\" Expect: \"${expect}\" failed" fi fi done < $datafile -exit $? +exit $errcode # Local Variables: # mode:shell-script # End: diff --git a/nptl/Makefile b/nptl/Makefile index 74ede7775b..28c745aed0 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -192,6 +192,7 @@ tests = tst-attr1 tst-attr2 \ tst-cancel1 tst-cancel2 tst-cancel3 tst-cancel4 tst-cancel5 \ tst-cancel6 tst-cancel7 tst-cancel8 tst-cancel9 tst-cancel10 \ tst-cancel11 tst-cancel12 tst-cancel13 tst-cancel14 tst-cancel15 \ + tst-cancel16 \ tst-cleanup0 tst-cleanup1 tst-cleanup2 tst-cleanup3 \ tst-flock1 tst-flock2 \ tst-signal1 tst-signal2 tst-signal3 tst-signal4 tst-signal5 \ @@ -222,6 +223,7 @@ ifeq ($(have-forced-unwind),yes) tests += tst-cancelx2 tst-cancelx3 tst-cancelx4 tst-cancelx5 \ tst-cancelx6 tst-cancelx7 tst-cancelx8 tst-cancelx9 tst-cancelx10 \ tst-cancelx11 tst-cancelx12 tst-cancelx13 tst-cancelx14 tst-cancelx15\ + tst-cancelx16 \ tst-cleanupx0 tst-cleanupx1 tst-cleanupx2 tst-cleanupx3 endif ifeq ($(build-shared),yes) @@ -336,6 +338,11 @@ CFLAGS-tst-cancelx8.c += -fexceptions CFLAGS-tst-cancelx9.c += -fexceptions CFLAGS-tst-cancelx10.c += -fexceptions CFLAGS-tst-cancelx11.c += -fexceptions +CFLAGS-tst-cancelx12.c += -fexceptions +CFLAGS-tst-cancelx13.c += -fexceptions +CFLAGS-tst-cancelx14.c += -fexceptions +CFLAGS-tst-cancelx15.c += -fexceptions +CFLAGS-tst-cancelx16.c += -fexceptions CFLAGS-tst-cleanupx0.c += -fexceptions -fasynchronous-unwind-tables CFLAGS-tst-cleanupx1.c += -fexceptions -fasynchronous-unwind-tables CFLAGS-tst-cleanupx2.c += -fexceptions diff --git a/nptl/tst-cancel16.c b/nptl/tst-cancel16.c new file mode 100644 index 0000000000..709902e97e --- /dev/null +++ b/nptl/tst-cancel16.c @@ -0,0 +1,231 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. + + 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 <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/mman.h> +#include <sys/wait.h> + + +static pthread_barrier_t b2; +static int fd; +static int called; + + +static void +cl (void *arg) +{ + called = 1; +} + + +static void * +tf (void *arg) +{ + int r = pthread_barrier_wait (&b2); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("child thread: barrier_wait failed"); + exit (1); + } + + pthread_cleanup_push (cl, NULL); + + /* This call should never return. */ + (void) lockf (fd, F_LOCK, 0); + + pthread_cleanup_pop (0); + + return NULL; +} + + +static int +do_test (void) +{ + char fname[] = "/tmp/cancel16XXXXXX"; + fd = mkstemp (fname); + if (fd == -1) + { + puts ("mkstemp failed"); + return 1; + } + unlink (fname); + + char mem[sizeof (pthread_barrier_t)]; + memset (mem, '\0', sizeof (mem)); + if (TEMP_FAILURE_RETRY (pwrite (fd, mem, sizeof (mem), 0)) != sizeof (mem)) + { + puts ("pwrite failed"); + return 1; + } + + void *p = mmap (NULL, sizeof (mem), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (p == MAP_FAILED) + { + puts ("mmap failed"); + return 1; + } + pthread_barrier_t *b = (pthread_barrier_t *) p; + + pthread_barrierattr_t ba; + if (pthread_barrierattr_init (&ba) != 0) + { + puts ("barrierattr_init failed"); + return 1; + } + if (pthread_barrierattr_setpshared (&ba, 1) != 0) + { + puts ("barrierattr_setshared failed"); + return 1; + } + + if (pthread_barrier_init (b, &ba, 2) != 0) + { + puts ("1st barrier_init failed"); + return 1; + } + if (pthread_barrierattr_destroy (&ba) != 0) + { + puts ("barrier_destroy failed"); + return 1; + } + + pid_t pid = fork (); + if (pid == 0) + { + /* Child. Lock the file and wait. */ + if (lockf (fd, F_LOCK, 0) != 0) + { + puts ("child process: lockf failed"); + _exit (1); + } + + int r = pthread_barrier_wait (b); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("child process: 1st barrier_wait failed"); + _exit (1); + } + + /* Make sure the process dies. */ + alarm (5); + + r = pthread_barrier_wait (b); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("child process: 2nd barrier_wait failed"); + _exit (1); + } + + _exit (0); + } + if (pid == -1) + { + puts ("fork failed"); + return 1; + } + + int r = pthread_barrier_wait (b); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("main: 1st barrier_wait failed"); + _exit (1); + } + + if (pthread_barrier_init (&b2, NULL, 2) != 0) + { + puts ("2nd barrier_init failed"); + return 1; + } + + pthread_t th; + if (pthread_create (&th, NULL, tf, NULL) != 0) + { + puts ("create failed"); + return 1; + } + + r = pthread_barrier_wait (&b2); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("main: 2nd barrier_wait failed"); + return 1; + } + + /* Delay. */ + sleep (1); + + if (pthread_cancel (th) != 0) + { + puts ("cancel failed"); + return 1; + } + + void *result; + if (pthread_join (th, &result) != 0) + { + puts ("join failed"); + return 1; + } + if (result != PTHREAD_CANCELED) + { + puts ("thread not canceled"); + return 1; + } + if (called == 0) + { + puts ("cleanup handler not called"); + return 1; + } + + r = pthread_barrier_wait (b); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("main: 3rd barrier_wait failed"); + return 1; + } + + int status; + if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) + { + puts ("waitpid failed"); + return 1; + } + if (WEXITSTATUS (status) != 0) + { + printf ("child process exits with %d\n", WEXITSTATUS (status)); + return 1; + } + + if (lockf (fd, F_LOCK, 0) != 0) + { + puts ("main: lockf failed"); + return 1; + } + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/nptl/tst-cancelx16.c b/nptl/tst-cancelx16.c new file mode 100644 index 0000000000..99af3b197c --- /dev/null +++ b/nptl/tst-cancelx16.c @@ -0,0 +1 @@ +#include "tst-cancel16.c" |