From a08877d0e029ed62dd55296a824d51355777f276 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 12 Apr 2001 23:09:44 +0000 Subject: Update. 2001-04-13 Jakub Jelinek * sysdeps/sparc/sparc64/dl-machine.h (elf_machine_load_address): Calculate load address differently. --- linuxthreads/ChangeLog | 8 +++++++- linuxthreads/Makefile | 2 +- linuxthreads/cancel.c | 3 ++- linuxthreads/tst-cancel.c | 48 ++++++++++++++++++++++++++++++++++++----------- 4 files changed, 47 insertions(+), 14 deletions(-) (limited to 'linuxthreads') diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index d51bcd42b3..ebad33038b 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,8 +1,14 @@ 2001-04-12 Ulrich Drepper + * tst-cancel.c: Disable most tests. Add new test where all + cleanup handlers must run. + * Makefile (tests): Add tst-cancel again. + + * cancel.c (__pthread_perform_cleanup): Correct condition for + leaving cleanup loop early. + * sysdeps/i386/Makefile: Make sure gcc uses a frame pointer for all the files which use CURRENT_STACK_FRAME. - * sysdeps/i386/pt-machine.h (CURRENT_STACK_FRAME): Define using __builtin_frame_address. * sysdeps/i386/i686/pt-machine.h: Likewise. diff --git a/linuxthreads/Makefile b/linuxthreads/Makefile index d884a59208..42f06a6645 100644 --- a/linuxthreads/Makefile +++ b/linuxthreads/Makefile @@ -59,7 +59,7 @@ endif librt-tests = ex10 ex11 tests = ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8 ex9 $(librt-tests) ex12 ex13 joinrace \ tststack $(tests-nodelete-$(have-z-nodelete)) ecmutex ex14 ex15 ex16 \ - ex17 #tst-cancel + ex17 tst-cancel ifeq (yes,$(build-shared)) tests-nodelete-yes = unload diff --git a/linuxthreads/cancel.c b/linuxthreads/cancel.c index c9bbacdef2..7ecbd7965b 100644 --- a/linuxthreads/cancel.c +++ b/linuxthreads/cancel.c @@ -197,7 +197,8 @@ void __pthread_perform_cleanup(char *currentframe) last = c; c = c->__prev; - if (! FRAME_LEFT (last, c)) + + if (FRAME_LEFT (last, c)) break; } diff --git a/linuxthreads/tst-cancel.c b/linuxthreads/tst-cancel.c index 8f2d307c9b..da32aaf5ea 100644 --- a/linuxthreads/tst-cancel.c +++ b/linuxthreads/tst-cancel.c @@ -64,23 +64,32 @@ cleanupok (void *arg) } +static void * +t3 (void *arg) +{ + pthread_cleanup_push (cleanupok, (void *) (long int) 4); + inner ((int) (long int) arg); + pthread_exit (NULL); + pthread_cleanup_pop (0); +} + + static void innerok (int a) { - pthread_cleanup_push (cleanup, (void *) (long int) a); - if (a) - return; + pthread_cleanup_push (cleanupok, (void *) (long int) a); + pthread_exit (NULL); pthread_cleanup_pop (0); } static void * -t3 (void *arg) +t4 (void *arg) { - pthread_cleanup_push (cleanupok, (void *) (long int) 4); + pthread_cleanup_push (cleanupok, (void *) (long int) 6); innerok ((int) (long int) arg); - pthread_exit (NULL); pthread_cleanup_pop (0); + return NULL; } @@ -90,14 +99,14 @@ main (int argc, char *argv[]) pthread_t td; int err; char *tmp; - const char *path; + const char *prefix; const char template[] = "thtstXXXXXX"; struct stat64 st; int result = 0; - path = argc > 1 ? argv[1] : ""; - tmp = (char *) alloca (strlen (path) + sizeof template); - strcpy (stpcpy (tmp, path), template); + prefix = argc > 1 ? argv[1] : ""; + tmp = (char *) alloca (strlen (prefix) + sizeof template); + strcpy (stpcpy (tmp, prefix), template); fd = mkstemp (tmp); if (fd == -1) @@ -114,6 +123,7 @@ main (int argc, char *argv[]) exit (1); } +#ifdef NOT_YET err = pthread_create (&td, NULL, t1, NULL); if (err != 0) { @@ -155,6 +165,21 @@ main (int argc, char *argv[]) printf ("cannot join thread: %s\n", strerror (err)); exit (1); } +#endif + + err = pthread_create (&td, NULL, t4, (void *) 7); + if (err != 0) + { + printf ("cannot create thread t3: %s\n", strerror (err)); + exit (1); + } + + err = pthread_join (td, NULL); + if (err != 0) + { + printf ("cannot join thread: %s\n", strerror (err)); + exit (1); + } if (fstat64 (fd, &st) < 0) { @@ -177,7 +202,8 @@ main (int argc, char *argv[]) result = 1; } - if (cleanupokcnt != 1) + // if (cleanupokcnt != 3) will be three once t3 runs + if (cleanupokcnt != 2) { printf ("cleanupokcnt = %d\n", cleanupokcnt); result = 1; -- cgit v1.2.3