# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2017-2021 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/>.

if { [skip_btrace_tests] } {
    unsupported "target does not support record-btrace"
    return -1
}

standard_testfile
if {[gdb_compile_pthreads "$srcdir/$subdir/$srcfile" "$binfile" executable {debug}] != "" } {
    untested "failed to prepare"
    return -1
}

# We need to enable non-stop mode for the remote case.
save_vars { GDBFLAGS } {
    append GDBFLAGS " -ex \"set non-stop on\""
    clean_restart $testfile
}

if ![runto_main] {
    return -1
}

set bp_1 [gdb_get_line_number "bp.1" $srcfile]

gdb_breakpoint $bp_1
gdb_continue_to_breakpoint "cont to $bp_1" ".*$bp_1\r\n.*"
gdb_test "cont&" "Continuing\."

# All threads are running.  Let's start recording.
gdb_test_no_output "record btrace"

proc check_tracing_enabled { thread } {
    global gdb_prompt

    with_test_prefix "thread $thread" {
        gdb_test "thread $thread" "(running).*" "is running"

        # We can't read the trace while the thread is running.
        gdb_test "info record" "Selected thread is running\." \
            "info record while running"

        # Try various commands that try to read trace.
        gdb_test "record instruction-history" "Selected thread is running\."
        gdb_test "record function-call-history" "Selected thread is running\."

        # Including reverse-stepping commands.
        gdb_test "reverse-continue" "\[Ss\]elected thread is running\."
        gdb_test "reverse-step" "\[Ss\]elected thread is running\."
        gdb_test "reverse-next" "\[Ss\]elected thread is running\."
        gdb_test "reverse-finish" "\[Ss\]elected thread is running\."

        # Stop the thread before reading the trace.
        gdb_test_multiple "interrupt" "interrupt" {
            -re "interrupt\r\n$gdb_prompt " {
                pass "interrupt"
            }
        }
        # Wait until the thread actually stopped.
        gdb_test_multiple "" "stopped" {
            -re "Thread $thread.*stopped\." {
                pass "stopped"
            }
        }
        # We will consume the thread's current location as part of the
        # "info record" output.
        gdb_test "info record" [multi_line \
            "Active record target: record-btrace" \
            "Recording format: .*" \
            "Recorded \[0-9\]+ instructions \[^\\\r\\\n\]*" \
        ]

        # Continue the thread again.
        gdb_test "cont&" "Continuing\."
    }
}

# Check that recording was started on each thread.
foreach thread {1 2 3 4} {
    check_tracing_enabled $thread
}

# Stop recording while all threads are running.
gdb_test "record stop" "Process record is stopped \[^\\\r\\\n\]*"
