From cf7e902283af830b3221da8b853753ab1ebbd1e5 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 18 Jun 2010 15:30:36 +0000 Subject: [PATCH] * Intercept SIGCHLD to prevent accept() from waiting forever if QEMU dies before connecting to the monitor. svn path=/nixos/branches/boot-order/; revision=22328 --- lib/test-driver/Machine.pm | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/test-driver/Machine.pm b/lib/test-driver/Machine.pm index 77ff17342475..b5989d540766 100644 --- a/lib/test-driver/Machine.pm +++ b/lib/test-driver/Machine.pm @@ -121,10 +121,6 @@ sub start { die; } - # Wait until QEMU connects to the monitor. - accept($self->{monitor}, $monitorS) or die; - $self->waitForMonitorPrompt; - # Process serial line output. close $serialC; @@ -132,9 +128,9 @@ sub start { sub processSerialOutput { my ($self, $serialP) = @_; - $/ = "\r\n"; while (<$serialP>) { chomp; + s/\r$//; print STDERR $self->name, "# $_\n"; $self->{connectedQueue}->enqueue(1) if $_ eq "===UP==="; } @@ -142,7 +138,17 @@ sub start { $self->{connectedQueue}->enqueue(1); } - $self->log("vm running as pid $pid"); + # Wait until QEMU connects to the monitor. + eval { + local $SIG{CHLD} = sub { die "QEMU died prematurely\n"; }; + accept($self->{monitor}, $monitorS) or die; + }; + die "$@" if $@; + + $self->waitForMonitorPrompt; + + $self->log("QEMU running (pid $pid)"); + $self->{pid} = $pid; $self->{booted} = 1; }