diff options
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/threadapply.c | 82 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/threadapply.exp | 71 |
3 files changed, 158 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 4169cf9..7295f9f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-11-11 Jeff Johnston <jjohnstn@redhat.com> + + * gdb.threads/threadapply.exp: New test. + * gdb.threads/threadapply.c: New file. + 2004-11-07 Mark Kettenis <kettenis@gnu.org> * gdb.base/savedregs.exp: Correct pattern used for sigtramp diff --git a/gdb/testsuite/gdb.threads/threadapply.c b/gdb/testsuite/gdb.threads/threadapply.c new file mode 100644 index 0000000..ccebd6e --- /dev/null +++ b/gdb/testsuite/gdb.threads/threadapply.c @@ -0,0 +1,82 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2002, 2003, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + This file is copied from schedlock.c. */ + +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <pthread.h> + +void *thread_function(void *arg); /* Pointer to function executed by each thread */ + +#define NUM 5 + +unsigned int args[NUM+1]; + +int main() { + int res; + int all_started; + pthread_t threads[NUM]; + void *thread_result; + long i; + + for (i = 0; i < NUM; i++) + { + args[i] = 1; /* Init value. */ + res = pthread_create(&threads[i], + NULL, + thread_function, + (void *) i); + } + + all_started = 0; + while (!all_started) + { + all_started = 1; + for (i = 0; i < NUM; i++) + { + if (args[i] == 1) + { + all_started = 0; + break; + } + } + } + + args[i] = 1; + /* Break here */ + thread_function ((void *) i); + + exit(EXIT_SUCCESS); +} + +void *thread_function(void *arg) { + int my_number = (long) arg; + int *myp = (int *) &args[my_number]; + + /* Don't run forever. Run just short of it :) */ + while (*myp > 0) + { + (*myp) ++; /* Loop increment. */ + } + + pthread_exit(NULL); +} + diff --git a/gdb/testsuite/gdb.threads/threadapply.exp b/gdb/testsuite/gdb.threads/threadapply.exp new file mode 100644 index 0000000..ae33272 --- /dev/null +++ b/gdb/testsuite/gdb.threads/threadapply.exp @@ -0,0 +1,71 @@ +# This testcase is part of GDB, the GNU debugger. + +# Copyright 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +if $tracelevel { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +# This test verifies that a macro using backtrace can be applied to all threads +# and will continue for each thread even though an error may occur in +# backtracing one of the threads. + +set testfile "threadapply" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}"]] != "" } { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# +# Run to `main' where we begin our tests. +# + +if ![runto_main] then { + gdb_suppress_tests +} + +# Break after all threads have been started. +set break_line [gdb_get_line_number "Break here"] +gdb_test "b $break_line" "" +gdb_test "continue" + +gdb_test_multiple "define backthread" "defining macro" { + -re "Type commands for definition of \"backthread\".\r\nEnd with a line saying just \"end\".\r\n>$" { + gdb_test_multiple "bt\np\/x 20\nend\n" "macro details" { + -re "$gdb_prompt $" { + pass "macro details" + } + } + pass "defining macro" + } +} + +# Cause backtraces to fail by setting a limit. This allows us to +# verify that the macro can get past the backtrace error and perform +# subsequent commands. +gdb_test "set backtrace limit 3" "" +gdb_test "thread apply all backthread" "Thread ..*\\\$1 = 0x14.*Thread ..*\\\$2 = 0x14.*Thread ..*\\\$3 = 0x14.*Thread ..*\\\$4 = 0x14.*Thread ..*\\\$5 = 0x14.*Thread ..*\\\$. = 0x14" + |