| # Copyright (C) 2019-2022 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 following a vfork child that exits, when the vfork parent is a |
| # threaded program, and it's a non-main thread that vforks. |
| |
| standard_testfile |
| |
| if {[build_executable "failed to prepare" $testfile $srcfile {debug pthreads}]} { |
| return -1 |
| } |
| |
| # DETACH indicates whether "set detach-on-fork" is enabled. It is |
| # either "on" or "off". |
| |
| proc test_vfork {detach} { |
| global binfile |
| |
| clean_restart $binfile |
| |
| if {![runto_main]} { |
| return 0 |
| } |
| |
| gdb_test_no_output "set follow-fork-mode child" |
| gdb_test_no_output "set detach-on-fork $detach" |
| |
| if {$detach == "off"} { |
| gdb_test "continue" \ |
| [multi_line \ |
| "Attaching after .* vfork to child .*" \ |
| ".*New inferior 2 .*" \ |
| ".*Inferior 2 .*exited normally.*"] |
| } else { |
| gdb_test "continue" \ |
| [multi_line \ |
| "Attaching after .* vfork to child .*" \ |
| ".*New inferior 2 .*" \ |
| ".*Detaching vfork parent process .* after child exit.*" \ |
| ".*Inferior 1 .* detached.*" \ |
| ".*Inferior 2 .*exited normally.*"] |
| } |
| } |
| |
| foreach_with_prefix detach-on-fork {"off" "on"} { |
| test_vfork ${detach-on-fork} |
| } |