Revert:
	2010-10-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
		    Pedro Alves  <pedro@codesourcery.com>
	* gdbthread.h (currently_stepping): New declaration.
	* infrun.c (currently_stepping): Remove the forward declaration.
	(currently_stepping): Make it global.
	* linux-nat.c (resume_callback) <lp->stopped && lp->status == 0>: New
	variables tp and step, initialized them.  Pass STEP to to_resume.
	Print also possibly "PTRACE_SINGLESTEP" if STEP.  Initialize LP->STEP.
	* remote.c (currently_stepping_callback): New.
	(remote_vcont_resume)
	<ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid)>:
	New variable tp.  Call currently_stepping_callback and step such
	thread.

gdb/testsuite/
	Revert:
	2010-10-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
	* gdb.threads/sigstep-threads.exp: New file.
	* gdb.threads/sigstep-threads.c: New file.
This commit is contained in:
Jan Kratochvil 2010-11-02 01:37:32 +00:00
parent 6d0cd39eb2
commit a289b8f64e
8 changed files with 31 additions and 155 deletions

View File

@ -1,3 +1,20 @@
2010-11-02 Jan Kratochvil <jan.kratochvil@redhat.com>
Revert:
2010-10-17 Jan Kratochvil <jan.kratochvil@redhat.com>
Pedro Alves <pedro@codesourcery.com>
* gdbthread.h (currently_stepping): New declaration.
* infrun.c (currently_stepping): Remove the forward declaration.
(currently_stepping): Make it global.
* linux-nat.c (resume_callback) <lp->stopped && lp->status == 0>: New
variables tp and step, initialized them. Pass STEP to to_resume.
Print also possibly "PTRACE_SINGLESTEP" if STEP. Initialize LP->STEP.
* remote.c (currently_stepping_callback): New.
(remote_vcont_resume)
<ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid)>:
New variable tp. Call currently_stepping_callback and step such
thread.
2010-11-01 Hui Zhu <teawater@gmail.com>
* tracepoint.c (tfile_xfer_partial): Change lma to vma.

View File

@ -352,6 +352,4 @@ extern struct thread_info* inferior_thread (void);
extern void update_thread_list (void);
extern int currently_stepping (struct thread_info *tp);
#endif /* GDBTHREAD_H */

View File

@ -74,6 +74,8 @@ static int follow_fork (void);
static void set_schedlock_func (char *args, int from_tty,
struct cmd_list_element *c);
static int currently_stepping (struct thread_info *tp);
static int currently_stepping_or_nexting_callback (struct thread_info *tp,
void *data);
@ -4849,7 +4851,7 @@ infrun: not switching back to stepped thread, it has vanished\n");
/* Is thread TP in the middle of single-stepping? */
int
static int
currently_stepping (struct thread_info *tp)
{
return ((tp->step_range_end && tp->step_resume_breakpoint == NULL)

View File

@ -1820,26 +1820,20 @@ resume_callback (struct lwp_info *lp, void *data)
}
else if (lp->stopped && lp->status == 0)
{
struct thread_info *tp = find_thread_ptid (lp->ptid);
/* lp->step may already contain a stale value. */
int step = tp ? currently_stepping (tp) : 0;
if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog,
"RC: %s %s, 0, 0 (resuming sibling)\n",
step ? "PTRACE_SINGLESTEP" : "PTRACE_CONT",
"RC: PTRACE_CONT %s, 0, 0 (resuming sibling)\n",
target_pid_to_str (lp->ptid));
linux_ops->to_resume (linux_ops,
pid_to_ptid (GET_LWP (lp->ptid)),
step, TARGET_SIGNAL_0);
0, TARGET_SIGNAL_0);
if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog,
"RC: %s %s, 0, 0 (resume sibling)\n",
step ? "PTRACE_SINGLESTEP" : "PTRACE_CONT",
"RC: PTRACE_CONT %s, 0, 0 (resume sibling)\n",
target_pid_to_str (lp->ptid));
lp->stopped = 0;
lp->step = step;
lp->step = 0;
memset (&lp->siginfo, 0, sizeof (lp->siginfo));
lp->stopped_by_watchpoint = 0;
}

View File

@ -4416,12 +4416,6 @@ append_resumption (char *p, char *endp,
return p;
}
static int
currently_stepping_callback (struct thread_info *tp, void *data)
{
return currently_stepping (tp);
}
/* Resume the remote inferior by using a "vCont" packet. The thread
to be resumed is PTID; STEP and SIGGNAL indicate whether the
resumed thread should be single-stepped and/or signalled. If PTID
@ -4464,8 +4458,6 @@ remote_vcont_resume (ptid_t ptid, int step, enum target_signal siggnal)
}
else if (ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid))
{
struct thread_info *tp;
/* Resume all threads (of all processes, or of a single
process), with preference for INFERIOR_PTID. This assumes
inferior_ptid belongs to the set of all threads we are about
@ -4476,12 +4468,6 @@ remote_vcont_resume (ptid_t ptid, int step, enum target_signal siggnal)
p = append_resumption (p, endp, inferior_ptid, step, siggnal);
}
tp = iterate_over_threads (currently_stepping_callback, NULL);
if (tp && !ptid_equal (tp->ptid, inferior_ptid))
{
p = append_resumption (p, endp, tp->ptid, 1, TARGET_SIGNAL_0);
}
/* And continue others without a signal. */
p = append_resumption (p, endp, ptid, /*step=*/ 0, TARGET_SIGNAL_0);
}

View File

@ -1,3 +1,10 @@
2010-11-02 Jan Kratochvil <jan.kratochvil@redhat.com>
Revert:
2010-10-17 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.threads/sigstep-threads.exp: New file.
* gdb.threads/sigstep-threads.c: New file.
2010-10-20 Michael Snyder <msnyder@vmware.com>
* gdb.threads/fork-child-threads.exp: Don't run on remote target.

View File

@ -1,54 +0,0 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2010 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 3 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, see <http://www.gnu.org/licenses/>. */
#include <pthread.h>
#include <assert.h>
#include <signal.h>
#include <asm/unistd.h>
#include <unistd.h>
#define tgkill(tgid, tid, sig) syscall (__NR_tgkill, (tgid), (tid), (sig))
#define gettid() syscall (__NR_gettid)
static volatile int var;
static void
handler (int signo) /* step-0 */
{ /* step-0 */
var++; /* step-1 */
tgkill (getpid (), gettid (), SIGUSR1); /* step-2 */
}
static void *
start (void *arg)
{
signal (SIGUSR1, handler);
tgkill (getpid (), gettid (), SIGUSR1);
assert (0);
return NULL;
}
int
main (void)
{
pthread_t thread;
pthread_create (&thread, NULL, start, NULL);
start (NULL); /* main-start */
return 0;
}

View File

@ -1,74 +0,0 @@
# Copyright 2010 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 3 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, see <http://www.gnu.org/licenses/>.
set testfile sigstep-threads
set srcfile ${testfile}.c
set executable ${testfile}
set binfile ${objdir}/${subdir}/${executable}
if { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
untested ${testfile}.exp
return -1
}
clean_restart $executable
if ![runto_main] {
return -1;
}
# `noprint' would not test the full logic of GDB.
gdb_test "handle SIGUSR1 nostop print pass" "\r\nSIGUSR1\[ \t\]+No\[ \t\]+Yes\[ \t\]+Yes\[ \t\].*"
gdb_test_no_output "set scheduler-locking off"
gdb_breakpoint [gdb_get_line_number "step-1"]
gdb_test_no_output {set $step1=$bpnum}
gdb_continue_to_breakpoint "step-1" ".* step-1 .*"
gdb_test_no_output {disable $step1}
# 1 as we are now stopped at the `step-1' label.
set step_at 1
for {set i 0} {$i < 100} {incr i} {
set test "step $i"
# Presume this step failed - as in the case of a timeout.
set failed 1
gdb_test_multiple "step" $test {
-re "\r\nProgram received signal SIGUSR1, User defined signal 1.\r\n" {
exp_continue -continue_timer
}
-re "step-(\[012\]).*\r\n$gdb_prompt $" {
set now $expect_out(1,string)
if {$step_at == 2 && $now == 1} {
set failed 0
} elseif {$step_at == 1 && $now == 2} {
set failed 0
# Continue over the re-signalling back to the handle entry.
gdb_test_no_output {enable $step1} ""
gdb_test "continue" " step-1 .*" ""
set now 1
gdb_test_no_output {disable $step1} ""
} else {
fail $test
}
set step_at $now
}
}
if $failed {
return
}
}
# We can never reliably say the racy problematic case has been tested.
pass "step"