X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=testcases%2Flib%2FStartXDummy.pm;h=592feb8501ea4a0c4b0e239e6ceb60e1b16ca1e1;hb=a1aa8786266a791c9dd69437f1e848d6c0956950;hp=3df782004b2fb4ff58fdf1dac41376aa41c442d8;hpb=f88c77945744565c1b637d8fcaab271312bf1a1c;p=i3%2Fi3 diff --git a/testcases/lib/StartXDummy.pm b/testcases/lib/StartXDummy.pm index 3df78200..592feb85 100644 --- a/testcases/lib/StartXDummy.pm +++ b/testcases/lib/StartXDummy.pm @@ -9,6 +9,7 @@ use v5.10; our @EXPORT = qw(start_xdummy); +my @pids; my $x_socketpath = '/tmp/.X11-unix/X'; # reads in a whole file @@ -20,13 +21,16 @@ sub slurp { # forks an Xdummy or Xdmx process sub fork_xserver { + my $keep_xdummy_output = shift; my $displaynum = shift; my $pid = fork(); die "Could not fork: $!" unless defined($pid); if ($pid == 0) { # Child, close stdout/stderr, then start Xdummy. - close STDOUT; - close STDERR; + if (!$keep_xdummy_output) { + close STDOUT; + close STDERR; + } exec @_; exit 1; @@ -37,6 +41,8 @@ sub fork_xserver { unlink($x_socketpath . $displaynum); }); + push @pids, $pid; + return $x_socketpath . $displaynum; } @@ -63,11 +69,23 @@ the Xdummy processes and a list of PIDs of the processes. =cut sub start_xdummy { - my ($parallel, $numtests) = @_; + my ($parallel, $numtests, $keep_xdummy_output) = @_; my @displays = (); my @childpids = (); + $SIG{CHLD} = sub { + my $child = waitpid -1, POSIX::WNOHANG; + @pids = grep { $_ != $child } @pids; + return unless @pids == 0; + print STDERR "All Xdummy processes died.\n"; + print STDERR "Use ./complete-run.pl --parallel 1 --keep-xdummy-output\n"; + print STDERR ""; + print STDERR "A frequent cause for this is missing the DUMMY Xorg module,\n"; + print STDERR "package xserver-xorg-video-dummy on Debian.\n"; + exit 1; + }; + # Yeah, I know it’s non-standard, but Perl’s POSIX module doesn’t have # _SC_NPROCESSORS_CONF. my $cpuinfo = slurp('/proc/cpuinfo'); @@ -75,17 +93,12 @@ sub start_xdummy { # If /proc/cpuinfo does not exist, we fall back to 2 cores. $num_cores ||= 2; - # If unset, we use num_cores * 2, plus two extra xdummys to combine to a - # multi-monitor setup using Xdmx. - $parallel ||= ($num_cores * 2) + 2; + # If unset, we use num_cores * 2. + $parallel ||= ($num_cores * 2); # If we are running a small number of tests, don’t over-parallelize. $parallel = $numtests if $numtests < $parallel; - # Ensure we have at least 1 X-Server plus two X-Servers for multi-monitor - # tests. - $parallel = 3 if $parallel < 3; - # First get the last used display number, then increment it by one. # Effectively falls back to 1 if no X server is running. my ($displaynum) = map { /(\d+)$/ } reverse sort glob($x_socketpath . '*'); @@ -98,8 +111,9 @@ sub start_xdummy { # We use -config /dev/null to prevent Xdummy from using the system # Xorg configuration. The tests should be independant from the # actual system X configuration. - my $socket = fork_xserver($displaynum, './Xdummy', ":$displaynum", - '-config', '/dev/null'); + my $socket = fork_xserver($keep_xdummy_output, $displaynum, + './Xdummy', ":$displaynum", '-config', '/dev/null', + '-configdir', '/dev/null', '-nolisten', 'tcp'); push(@displays, ":$displaynum"); push(@sockets_waiting, $socket); $displaynum++; @@ -107,20 +121,7 @@ sub start_xdummy { wait_for_x(\@sockets_waiting); - # Now combine the last two displays to a multi-monitor display using Xdmx - my $first = pop @displays; - my $second = pop @displays; - - # make sure this display isn’t in use yet - $displaynum++ while -e ($x_socketpath . $displaynum); - say 'starting xdmx on display :' . $displaynum; - - my $multidpy = ":$displaynum"; - my $socket = fork_xserver($displaynum, 'Xdmx', '+xinerama', '-xinput', - 'local', '-display', $first, '-display', $second, '-ac', $multidpy); - wait_for_x([ $socket ]); - - return \@displays, $multidpy; + return @displays; } 1