X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=test%2Fbin%2Fbomb.pl;h=b91f0499c68337651af9dce0788fb3598de68916;hb=87f71ca01b619b8d613407cb3fcbb91d12d932fe;hp=4ce8590da78fd80565097e8d244eaebda7e727a5;hpb=b0dabcd2993438c7326c44ee76da8c6bf67e8a37;p=mkws-moved-to-github.git diff --git a/test/bin/bomb.pl b/test/bin/bomb.pl index 4ce8590..b91f049 100755 --- a/test/bin/bomb.pl +++ b/test/bin/bomb.pl @@ -1,12 +1,11 @@ #!/usr/bin/perl -# Copyright (c) 2014 IndexData ApS. http://indexdata.com +# Copyright (c) 2014 Index Data ApS. http://indexdata.com # # bomb.pl - wrapper to stop a process after N seconds # use Getopt::Long; use POSIX ":sys_wait_h"; -use BSD::Resource qw/setrlimit/; use strict; use warnings; @@ -41,21 +40,33 @@ die usage if !@system; # set CPU limit, in case the alarm handler will # be ignored -setrlimit(RLIMIT_CPU, $timeout, 2*$timeout) or die "Cannot set CPU limit: $!\n"; +eval { + require BSD::Resource; + BSD::Resource::setrlimit( "RLIMIT_CPU", $timeout, 2 * $timeout ) + or die "Cannot set CPU limit: $!\n"; +}; +if ($@) { + warn + "WARNING: things would go more nicely with the BSD::Resource package\n"; +} # -# use fork/exec instead system() +# configure signal handlers # -$pid = fork(); -die "fork() failed: $!" unless defined $pid; +$SIG{ALRM} = sub { + my $pgid = getpgrp(); -# child -if ($pid) { - alarm($timeout); - exec(@system) or die "exec @system: $!\n"; -} + # kill process group + kill "INT", -$pgid; +}; + +# don't kill ourself +$SIG{INT} = "IGNORE"; -# parent -else { } +alarm($timeout); + +system(@system) == 0 + or die "system @system failed: $?"; 1; +