StartXdummy.pm: make Xdummy startup a bit more robust

next
Maik Fischer 2011-11-24 14:06:55 +01:00
parent b1b139df1e
commit 423b891995
2 changed files with 14 additions and 11 deletions

View File

@ -12,7 +12,7 @@ use File::Basename qw(basename);
use File::Temp qw(tempfile tempdir);
use Getopt::Long;
use IO::Socket::UNIX;
use POSIX;
use POSIX ();
use Time::HiRes qw(sleep gettimeofday tv_interval);
use TAP::Harness;
use TAP::Parser;

View File

@ -23,6 +23,9 @@ the file ./Xdummy) and returns two arrayrefs: a list of X11 display numbers to
the Xdummy processes and a list of PIDs of the processes.
=cut
my $x_socketpath = '/tmp/.X11-unix/X';
sub start_xdummy {
my ($parallel) = @_;
@ -40,12 +43,12 @@ sub start_xdummy {
# 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) = reverse ('0', sort </tmp/.X11-unix/X*>);
$displaynum =~ s/.*(\d)$/$1/;
my ($displaynum) = map { /(\d+)$/ } reverse sort glob($x_socketpath . '*');
$displaynum++;
say "Starting $parallel Xdummy instances, starting at :$displaynum...";
my @sockets_waiting;
for my $idx (0 .. ($parallel-1)) {
my $pid = fork();
die "Could not fork: $!" unless defined($pid);
@ -53,6 +56,9 @@ sub start_xdummy {
# Child, close stdout/stderr, then start Xdummy.
close STDOUT;
close STDERR;
# make sure this display isnt in use yet
$displaynum++ while -e ($x_socketpath . $displaynum);
# 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.
@ -61,20 +67,17 @@ sub start_xdummy {
}
push(@childpids, $pid);
push(@displays, ":$displaynum");
push(@sockets_waiting, $x_socketpath . $displaynum);
$displaynum++;
}
# Wait until the X11 sockets actually appear. Pretty ugly solution, but as
# long as we cant socket-activate X11…
my $sockets_ready;
do {
$sockets_ready = 1;
for (@displays) {
my $path = "/tmp/.X11-unix/X" . substr($_, 1);
$sockets_ready = 0 unless -S $path;
}
while (1) {
@sockets_waiting = grep { ! -S $_ } @sockets_waiting;
last unless @sockets_waiting;
sleep 0.1;
} until $sockets_ready;
}
return \@displays, \@childpids;
}