# Copyright (C) 2022-2026 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/>.

require allow_python_tests

load_lib gdb-python.exp

standard_testfile

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

save_vars { GDBFLAGS } {
    clean_restart $testfile
}

set pyfile [gdb_remote_download host ${srcdir}/${subdir}/py-thread-exited.py]
gdb_test_no_output "source ${pyfile}" "load python file"

gdb_test "test-events" "Event testers registered."

if {![runto_main]} {
    return -1
}


gdb_breakpoint [gdb_get_line_number "In thread" ${testfile}.c]
gdb_breakpoint [gdb_get_line_number "Done" ${testfile}.c]

# gdbserver does not notify new threads on creation.  In order for
# this test to even see that the threads are created, we have to
# arrange to stop when they are running.
gdb_continue_to_breakpoint "continue to first in-thread breakpoint"
gdb_continue_to_breakpoint "continue to second in-thread breakpoint"

gdb_continue_to_breakpoint "continue to end breakpoint"

gdb_test "python print(threadOneExit)" \
	 ".*event type: thread-exited. global num: 2.*"
gdb_test "python print(threadTwoExit)" \
	 ".*event type: thread-exited. global num: 3.*"
