From: Pedro Alves Date: Thu, 6 Aug 2015 14:02:26 +0000 (+0100) Subject: gdbserver: move_out_of_jump_pad_callback misses switching current thread X-Git-Tag: gdb-7.10-release~41 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a01c46276aa3a16c2ac1dae249df14e39d1c281f;p=thirdparty%2Fbinutils-gdb.git gdbserver: move_out_of_jump_pad_callback misses switching current thread While hacking on the fix for PR threads/18600 (Threads left stopped after fork+thread spawn), I once saw its test (fork-plus-threads.exp) FAIL against gdbserver because move_out_of_jump_pad_callback has a gdb_breakpoint_here call, and the caller isn't making sure the current thread points to the right thread. In the case I saw, the current thread pointed to the wrong process, so gdb_breakpoint_here returned the wrong answer. Unfortunately I didn't save logs. Still, seems obvious enough and it should fix a potential occasional racy FAIL. Tested on x86_64 Fedora 20. gdb/gdbserver/ChangeLog: 2015-08-06 Pedro Alves * linux-low.c (move_out_of_jump_pad_callback): Temporarily switch the current thread. --- diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index d03d1f6b2f4..d035aaeb4b2 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2015-08-06 Pedro Alves + + * linux-low.c (move_out_of_jump_pad_callback): Temporarily switch + the current thread. + 2015-08-06 Pedro Alves * linux-low.c (linux_write_memory): Rewrite debug output to avoid diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 57e4eba2e66..a229c5018d3 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -3646,6 +3646,7 @@ static void move_out_of_jump_pad_callback (struct inferior_list_entry *entry) { struct thread_info *thread = (struct thread_info *) entry; + struct thread_info *saved_thread; struct lwp_info *lwp = get_thread_lwp (thread); int *wstat; @@ -3657,6 +3658,10 @@ move_out_of_jump_pad_callback (struct inferior_list_entry *entry) } gdb_assert (lwp->stopped); + /* For gdb_breakpoint_here. */ + saved_thread = current_thread; + current_thread = thread; + wstat = lwp->status_pending_p ? &lwp->status_pending : NULL; /* Allow debugging the jump pad, gdb_collect, etc. */ @@ -3684,6 +3689,8 @@ move_out_of_jump_pad_callback (struct inferior_list_entry *entry) } else lwp_suspended_inc (lwp); + + current_thread = saved_thread; } static int