Test various forms of threads tracking across exec(2). Index: gdb-7.10.90.20160211/gdb/testsuite/gdb.threads/threaded-exec.c =================================================================== --- gdb-7.10.90.20160211.orig/gdb/testsuite/gdb.threads/threaded-exec.c 2016-02-16 09:54:45.157163049 +0100 +++ gdb-7.10.90.20160211/gdb/testsuite/gdb.threads/threaded-exec.c 2016-02-16 09:54:46.210170175 +0100 @@ -18,21 +18,95 @@ Boston, MA 02111-1307, USA. */ #include -#include #include #include #include +#include +#ifdef THREADS + +# include static void * threader (void *arg) { - return NULL; + return NULL; } +#endif + int -main (void) +main (int argc, char **argv) { + char *exec_nothreads, *exec_threads, *cmd; + int phase; + char phase_s[8]; + + setbuf (stdout, NULL); + + if (argc != 4) + { + fprintf (stderr, "%s \n", argv[0]); + return 1; + } + +#ifdef THREADS + puts ("THREADS: Y"); +#else + puts ("THREADS: N"); +#endif + exec_nothreads = argv[1]; + printf ("exec_nothreads: %s\n", exec_nothreads); + exec_threads = argv[2]; + printf ("exec_threads: %s\n", exec_threads); + phase = atoi (argv[3]); + printf ("phase: %d\n", phase); + + /* Phases: threading + 0: N -> N + 1: N -> Y + 2: Y -> Y + 3: Y -> N + 4: N -> exit */ + + cmd = NULL; + +#ifndef THREADS + switch (phase) + { + case 0: + cmd = exec_nothreads; + break; + case 1: + cmd = exec_threads; + break; + case 2: + fprintf (stderr, "%s: We should have threads for phase %d!\n", argv[0], + phase); + return 1; + case 3: + fprintf (stderr, "%s: We should have threads for phase %d!\n", argv[0], + phase); + return 1; + case 4: + return 0; + default: + assert (0); + } +#else /* THREADS */ + switch (phase) + { + case 0: + fprintf (stderr, "%s: We should not have threads for phase %d!\n", + argv[0], phase); + return 1; + case 1: + fprintf (stderr, "%s: We should not have threads for phase %d!\n", + argv[0], phase); + return 1; + case 2: + cmd = exec_threads; + { pthread_t t1; int i; @@ -40,7 +114,34 @@ assert (i == 0); i = pthread_join (t1, NULL); assert (i == 0); + } + break; + case 3: + cmd = exec_nothreads; + { + pthread_t t1; + int i; + + i = pthread_create (&t1, NULL, threader, (void *) NULL); + assert (i == 0); + i = pthread_join (t1, NULL); + assert (i == 0); + } + break; + case 4: + fprintf (stderr, "%s: We should not have threads for phase %d!\n", + argv[0], phase); + return 1; + default: + assert (0); + } +#endif /* THREADS */ + + assert (cmd != NULL); + + phase++; + snprintf (phase_s, sizeof phase_s, "%d", phase); - execl ("/bin/true", "/bin/true", NULL); - abort (); + execl (cmd, cmd, exec_nothreads, exec_threads, phase_s, NULL); + assert (0); } Index: gdb-7.10.90.20160211/gdb/testsuite/gdb.threads/threaded-exec.exp =================================================================== --- gdb-7.10.90.20160211.orig/gdb/testsuite/gdb.threads/threaded-exec.exp 2016-02-16 09:54:45.157163049 +0100 +++ gdb-7.10.90.20160211/gdb/testsuite/gdb.threads/threaded-exec.exp 2016-02-16 09:55:27.397448879 +0100 @@ -20,9 +20,14 @@ set testfile threaded-exec set srcfile ${testfile}.c -set binfile [standard_output_file ${testfile}] +set binfile_nothreads [standard_output_file ${testfile}N] +set binfile_threads [standard_output_file ${testfile}Y] -if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable []] != "" } { +if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile_nothreads}" executable {additional_flags=-UTHREADS}] != "" } { + return -1 +} + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile_threads}" executable {additional_flags=-DTHREADS}] != "" } { return -1 } @@ -30,9 +35,9 @@ gdb_start gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} +gdb_load ${binfile_nothreads} -gdb_run_cmd +gdb_run_cmd ${binfile_nothreads} ${binfile_threads} 0 gdb_test_multiple {} "Program exited" { -re "\r\n\\\[Inferior .* exited normally\\\]\r\n$gdb_prompt $" {