aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Metzger <markus.t.metzger@intel.com>2024-02-21 14:53:59 +0000
committerMarkus Metzger <markus.t.metzger@intel.com>2024-09-13 10:25:28 +0000
commit11cedbe3eb4d54cd85b47b9af285a9db2838f2dd (patch)
tree63aa59e70f54a260cbff8529f8290924c8bd91b9
parent2586986632367d5c469224bd85e4ff6c1bd1a334 (diff)
downloadgdb-users/mmetzger/pr19340.zip
gdb-users/mmetzger/pr19340.tar.gz
gdb-users/mmetzger/pr19340.tar.bz2
gdb, btrace, infrun: per-inferior run-controlusers/mmetzger/pr19340
While recording is already per inferior, run-control isn't. As soon as any thread in any inferior is replaying, no other inferior can be resumed. This is controlled by many calls to record_is_replaying(minus_one_ptid). Instead of minus_one_ptid, pass the ptid of the inferior to be checked.
-rw-r--r--gdb/infrun.c17
-rw-r--r--gdb/record-btrace.c26
-rw-r--r--gdb/testsuite/gdb.btrace/multi-inferior.c10
-rw-r--r--gdb/testsuite/gdb.btrace/multi-inferior.exp19
4 files changed, 44 insertions, 28 deletions
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 0b319df..a1c4b0a 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -2400,7 +2400,8 @@ user_visible_resume_ptid (int step)
resume_ptid = inferior_ptid;
}
else if ((scheduler_mode == schedlock_replay)
- && target_record_will_replay (minus_one_ptid, execution_direction))
+ && target_record_will_replay (ptid_t (inferior_ptid.pid ()),
+ execution_direction))
{
/* User-settable 'scheduler' mode requires solo thread resume in replay
mode. */
@@ -3118,15 +3119,17 @@ clear_proceed_status (int step)
This is a convenience feature to not require the user to explicitly
stop replaying the other threads. We're assuming that the user's
intent is to resume tracing the recorded process. */
+ ptid_t resume_ptid = user_visible_resume_ptid (step);
if (!non_stop && scheduler_mode == schedlock_replay
- && target_record_is_replaying (minus_one_ptid)
- && !target_record_will_replay (user_visible_resume_ptid (step),
- execution_direction))
- target_record_stop_replaying ();
+ && target_record_is_replaying (ptid_t (resume_ptid.pid ()))
+ && !target_record_will_replay (resume_ptid, execution_direction))
+ {
+ target_record_stop_replaying ();
+ resume_ptid = user_visible_resume_ptid (step);
+ }
if (!non_stop && inferior_ptid != null_ptid)
{
- ptid_t resume_ptid = user_visible_resume_ptid (step);
process_stratum_target *resume_target
= user_visible_resume_target (resume_ptid);
@@ -3205,7 +3208,7 @@ schedlock_applies (struct thread_info *tp)
|| (scheduler_mode == schedlock_step
&& tp->control.stepping_command)
|| (scheduler_mode == schedlock_replay
- && target_record_will_replay (minus_one_ptid,
+ && target_record_will_replay (ptid_t (tp->inf->pid),
execution_direction)));
}
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index c91e3ad..4d5e156 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -122,7 +122,6 @@ public:
ptid_t wait (ptid_t, struct target_waitstatus *, target_wait_flags) override;
void stop (ptid_t) override;
- void update_thread_list () override;
bool thread_alive (ptid_t ptid) override;
void goto_record_begin () override;
void goto_record_end () override;
@@ -2206,7 +2205,7 @@ record_btrace_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
make progress, we may need to explicitly move replaying threads to the end
of their execution history. */
if ((::execution_direction != EXEC_REVERSE)
- && !record_is_replaying (minus_one_ptid))
+ && !record_is_replaying (ptid_t (ptid.pid ())))
{
this->beneath ()->resume (ptid, step, signal);
return;
@@ -2625,7 +2624,7 @@ record_btrace_target::wait (ptid_t ptid, struct target_waitstatus *status,
/* As long as we're not replaying, just forward the request. */
if ((::execution_direction != EXEC_REVERSE)
- && !record_is_replaying (minus_one_ptid))
+ && !record_is_replaying (ptid_t (ptid.pid ())))
{
return this->beneath ()->wait (ptid, status, options);
}
@@ -2746,7 +2745,7 @@ record_btrace_target::stop (ptid_t ptid)
/* As long as we're not replaying, just forward the request. */
if ((::execution_direction != EXEC_REVERSE)
- && !record_is_replaying (minus_one_ptid))
+ && !record_is_replaying (ptid_t (ptid.pid ())))
{
this->beneath ()->stop (ptid);
}
@@ -2776,7 +2775,7 @@ record_btrace_target::can_execute_reverse ()
bool
record_btrace_target::stopped_by_sw_breakpoint ()
{
- if (record_is_replaying (minus_one_ptid))
+ if (record_is_replaying (ptid_t (inferior_ptid.pid ())))
{
struct thread_info *tp = inferior_thread ();
@@ -2791,7 +2790,7 @@ record_btrace_target::stopped_by_sw_breakpoint ()
bool
record_btrace_target::stopped_by_hw_breakpoint ()
{
- if (record_is_replaying (minus_one_ptid))
+ if (record_is_replaying (ptid_t (inferior_ptid.pid ())))
{
struct thread_info *tp = inferior_thread ();
@@ -2801,26 +2800,13 @@ record_btrace_target::stopped_by_hw_breakpoint ()
return this->beneath ()->stopped_by_hw_breakpoint ();
}
-/* The update_thread_list method of target record-btrace. */
-
-void
-record_btrace_target::update_thread_list ()
-{
- /* We don't add or remove threads during replay. */
- if (record_is_replaying (minus_one_ptid))
- return;
-
- /* Forward the request. */
- this->beneath ()->update_thread_list ();
-}
-
/* The thread_alive method of target record-btrace. */
bool
record_btrace_target::thread_alive (ptid_t ptid)
{
/* We don't add or remove threads during replay. */
- if (record_is_replaying (minus_one_ptid))
+ if (record_is_replaying (ptid_t (ptid.pid ())))
return true;
/* Forward the request. */
diff --git a/gdb/testsuite/gdb.btrace/multi-inferior.c b/gdb/testsuite/gdb.btrace/multi-inferior.c
index fb4ffc2..6f1052a 100644
--- a/gdb/testsuite/gdb.btrace/multi-inferior.c
+++ b/gdb/testsuite/gdb.btrace/multi-inferior.c
@@ -15,8 +15,16 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
+static int
+fun (void)
+{
+ int x = fun (); /* fun.1 */
+ return x; /* fun.2 */
+}
+
int
main (void)
{
- return 0;
+ int x = fun (); /* main.1 */
+ return x; /* main.2 */
}
diff --git a/gdb/testsuite/gdb.btrace/multi-inferior.exp b/gdb/testsuite/gdb.btrace/multi-inferior.exp
index 174d383..df7f423 100644
--- a/gdb/testsuite/gdb.btrace/multi-inferior.exp
+++ b/gdb/testsuite/gdb.btrace/multi-inferior.exp
@@ -39,6 +39,8 @@ with_test_prefix "inferior 1" {
}
gdb_test_no_output "record btrace"
+ gdb_test "step 4" "fun\.1.*"
+ gdb_test "reverse-step" "fun\.1.*"
}
with_test_prefix "inferior 2" {
@@ -51,4 +53,21 @@ with_test_prefix "inferior 2" {
}
gdb_test_no_output "record btrace"
+ gdb_test "step 4" "fun\.1.*"
+ gdb_test "reverse-step" "fun\.1.*"
+
+ gdb_test "info record" "Replay in progress.*"
+ gdb_test "record stop" "Process record is stopped.*"
+
+ gdb_test "step" "fun\.1.*"
+}
+
+with_test_prefix "inferior 1" {
+ gdb_test "inferior 1" "Switching to inferior 1.*"
+
+ gdb_test "info record" "Replay in progress.*"
+ gdb_test "reverse-finish" "fun\.1.*"
+ gdb_test "record goto end" "fun\.1.*"
+ gdb_test "step 2" "fun\.1.*"
+ gdb_test "reverse-step 3"
}