From 3a27e02f3a7ffcce4da1955646b9239109dff481 Mon Sep 17 00:00:00 2001
From: Rudolf Polzer <divverent@alientrap.org>
Date: Mon, 19 Jul 2010 08:33:26 +0200
Subject: [PATCH] autobuild scripts: specify timeouts for the q3map2 stages

---
 misc/tools/xonotic-map-compiler           | 56 ++++++++++++++++++++++-
 misc/tools/xonotic-map-compiler-autobuild |  3 +-
 2 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/misc/tools/xonotic-map-compiler b/misc/tools/xonotic-map-compiler
index e86fd887..bfc6593b 100755
--- a/misc/tools/xonotic-map-compiler
+++ b/misc/tools/xonotic-map-compiler
@@ -55,7 +55,12 @@ my $options =
 	scale => [], # can't have defaults atm
 	order => [split /\s*,\s*/, $ORDER],
 	maps => [],
-	scale => 1
+	scale => 1,
+	bsp_timeout => 0,
+	vis_timeout => 0,
+	light_timeout => 0,
+	minimap_timeout => 0,
+	scale_timeout => 0
 };
 
 my $curmode = 'maps';
@@ -105,6 +110,26 @@ while(@ARGV)
 	{
 		$options->{noshaderlist} = 1;
 	}
+	elsif($_ eq '-bsp_timeout')
+	{
+		$options->{bsp_timeout} = shift @ARGV;
+	}
+	elsif($_ eq '-vis_timeout')
+	{
+		$options->{vis_timeout} = shift @ARGV;
+	}
+	elsif($_ eq '-light_timeout')
+	{
+		$options->{light_timeout} = shift @ARGV;
+	}
+	elsif($_ eq '-minimap_timeout')
+	{
+		$options->{minimap_timeout} = shift @ARGV;
+	}
+	elsif($_ eq '-scale_timeout')
+	{
+		$options->{minimap_timeout} = shift @ARGV;
+	}
 	elsif($_ eq '-order')
 	{
 		$options->{order} = [split /\s*,\s*/, shift @ARGV];
@@ -144,9 +169,36 @@ my $linkdir = File::Temp::tempdir("xonotic-map-compiler.XXXXXX", TMPDIR => 1, CL
 
 sub q3map2(@)
 {
+	my $mode = $_[0];
+	my $timeout = undef;
+	$timeout = $options->{bsp_timeout} if $mode eq '-bsp';
+	$timeout = $options->{vis_timeout} if $mode eq '-vis';
+	$timeout = $options->{light_timeout} if $mode eq '-light';
+	$timeout = $options->{minimap_timeout} if $mode eq '-minimap';
+	$timeout = $options->{scale_timeout} if $mode eq '-scale';
+	die "Invalid call: not a standard q3map2 stage" if not defined $timeout;
 	my @args = ($Q3MAP2, split(/\s+/, $Q3MAP2FLAGS), '-game', 'xonotic', '-fs_basepath', $XONOTICDIR, '-fs_basepath', $linkdir, '-v', @_);
 	print "\$ @args\n";
-	return !system @args;
+	defined(my $pid = fork())
+		or die "fork: $!";
+	if($pid) # parent
+	{
+		if($timeout)
+		{
+			local $SIG{ALRM} = sub { kill $pid; };
+			alarm $timeout;
+		}
+		if(waitpid $pid, 0 != $pid)
+		{
+			die "waitpid: did not return our child process $pid: $!";
+		}
+		return !$?;
+	}
+	else # child
+	{
+		exec @args
+			or die "exec: $!";
+	}
 }
 
 (my $mapdir = getcwd()) =~ s!/[^/]*(?:$)!!;
diff --git a/misc/tools/xonotic-map-compiler-autobuild b/misc/tools/xonotic-map-compiler-autobuild
index 959dc917..9534301e 100755
--- a/misc/tools/xonotic-map-compiler-autobuild
+++ b/misc/tools/xonotic-map-compiler-autobuild
@@ -4,6 +4,7 @@ set -e
 
 bspdir="$PWD/data"
 url=http://141.2.16.23/~xonotic/bsp-autobuilds/
+override="-bsp_timeout 900 -vis_timeout 3600 -light_timeout 14400 -minimap_timeout 900 -scale_timeout 900"
 
 bspoutdir="$HOME/public_html/bsp-autobuilds/"
 
@@ -127,7 +128,7 @@ buildthemap()
 	fi
 	(
 		cd maps
-		../../../misc/tools/xonotic-map-compiler "$M" `grep ^- "$M.map.options" | cut -d '#' -f 1` > "$M.log"
+		../../../misc/tools/xonotic-map-compiler "$M" `grep ^- "$M.map.options" | cut -d '#' -f 1` $override > "$M.log"
 	)
 	status=$?
 	if [ -n "$IRCSPAM" ]; then
-- 
2.39.5