From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30545 invoked by alias); 29 Dec 2007 12:59:46 -0000 Received: (qmail 30535 invoked by uid 22791); 29 Dec 2007 12:59:46 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sat, 29 Dec 2007 12:59:40 +0000 Received: (qmail 19218 invoked from network); 29 Dec 2007 12:59:38 -0000 Received: from unknown (HELO localhost) (jimb@127.0.0.2) by mail.codesourcery.com with ESMTPA; 29 Dec 2007 12:59:38 -0000 To: gdb-patches@sourceware.org Subject: RFA: Fix multi-fork.exp for good From: Jim Blandy Date: Sat, 29 Dec 2007 14:02:00 -0000 Message-ID: User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-12/txt/msg00453.txt.bz2 Or at least, I hope so. I was getting occasional timeouts from interactions after the follow-parent tests on loaded machines. Set a few windows doing 'while true; do :; done' and give it a try. gdb/testsuite/ChangeLog: 2007-12-29 Jim Blandy * gdb.base/multi-forks.exp: Consume all output from child processes before proceeding to next test. diff -r 37bb176d50e5 gdb/testsuite/gdb.base/multi-forks.exp --- a/gdb/testsuite/gdb.base/multi-forks.exp Fri Dec 28 09:20:36 2007 -0800 +++ b/gdb/testsuite/gdb.base/multi-forks.exp Sat Dec 29 04:55:56 2007 -0800 @@ -88,10 +88,46 @@ gdb_test "set follow parent" "" "" gdb_test "set follow parent" "" "" send_gdb "continue\n" -gdb_expect { - -re ".*Break.* main .*$gdb_prompt.*$" {} - -re ".*$gdb_prompt $" {fail "run to exit 2"} - default {fail "run to exit 2 (timeout)"} + +# The output from the child processes can be interleaved arbitrarily +# with the output from GDB and the parent process. If we don't +# consume it all now, it can confuse later interactions. +set seen_done 0 +set seen_break 0 +set seen_prompt 0 +set seen_timeout 0 +while { ($seen_done < 16 || ! $seen_prompt) && ! $seen_timeout } { + # We don't know what order the interesting things will arrive in. + # Using a pattern of the form 'x|y|z' instead of -re x ... -re y + # ... -re z ensures that expect always chooses the match that + # occurs leftmost in the input, and not the pattern appearing + # first in the script that occurs anywhere in the input, so that + # we don't skip anything. + gdb_expect { + -re "($decimal done)|(Breakpoint)|($gdb_prompt)" { + if {[info exists expect_out(1,string)]} { + incr seen_done + } elseif {[info exists expect_out(2,string)]} { + set seen_break 1 + } elseif {[info exists expect_out(3,string)]} { + set seen_prompt 1 + } + array unset expect_out + } + timeout { set seen_timeout 1 } + } +} + +if { $seen_timeout } { + fail "run to exit 2 (timeout)" +} elseif { ! $seen_prompt } { + fail "run to exit 2 (no prompt)" +} elseif { ! $seen_break } { + fail "run to exit 2 (no breakpoint hit)" +} elseif { $seen_done != 16 } { + fail "run to exit 2 (missing done messages)" +} else { + pass "run to exit 2" } gdb_test "print pids\[0\]==0 || pids\[1\]==0 || pids\[2\]==0 || pids\[3\]==0" \