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

# Test attaching to a program after its main thread has exited.

require can_spawn_for_attach

standard_testfile leader-exit.c

if {[build_executable "failed to prepare" $testfile $srcfile {debug pthreads}] == -1} {
    return
}

set escapedbinfile [string_to_regexp ${binfile}]

set test_spawn_id [spawn_wait_for_attach $binfile]
set testpid [spawn_id_get_pid $test_spawn_id]

# Wait a bit for the leader thread to exit, before attaching.
sleep 2

clean_restart ${binfile}

# Save this early as we may not be able to talk with GDBserver anymore
# when we need to check it.
set is_gdbserver [target_is_gdbserver]

# True if successfully attached.
set attached 0

gdb_test_multiple "attach $testpid" "attach" {
    -re -wrap "Attaching to process $testpid failed.*" {
	# GNU/Linux gdbserver.  Linux ptrace does not let you attach
	# to zombie threads.
	setup_kfail "gdb/31555" *-*-linux*
	fail $gdb_test_name
    }
    -re -wrap "warning: process $testpid is a zombie - the process has already terminated.*" {
	# Native GNU/Linux.  Linux ptrace does not let you attach to
	# zombie threads.
	setup_kfail "gdb/31555" *-*-linux*
	fail $gdb_test_name
    }
    -re -wrap "Attaching to program: $escapedbinfile, process $testpid.*" {
	pass $gdb_test_name
	set attached 1
    }
}

set thread_count [get_valueof "" "\$_inferior_thread_count" -1]

if {$thread_count == -1} {
    kill_wait_spawned_process $test_spawn_id
    return
}

if {$attached} {
    # Check that we have at least one thread.  We can't assume there
    # will only be exactly one thread, because on some systems, like
    # Cygwin, the runtime spawns extra threads.  Also, on Windows,
    # attaching always injects one extra thread.
    gdb_assert {$thread_count >= 1}
} else {
    gdb_assert {$thread_count == 0}
}

kill_wait_spawned_process $test_spawn_id
