X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=test%2Fbin%2Fbomb.pl;h=ae978595c97b61f785cfa3544502277673843876;hb=fd831c63e414e24a0c596d93beb35f41c73762e5;hp=bcc8ec1107d1f4be2f5360e7f34528d4448ec716;hpb=5a9bf466c4b8c6355b9a84dea21d8a78b95631d2;p=mkws-moved-to-github.git diff --git a/test/bin/bomb.pl b/test/bin/bomb.pl index bcc8ec1..ae97859 100755 --- a/test/bin/bomb.pl +++ b/test/bin/bomb.pl @@ -1,5 +1,5 @@ #!/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 # @@ -42,26 +42,34 @@ die usage if !@system; # be ignored eval { require BSD::Resource; - setrlimit("RLIMIT_CPU", $timeout, 2*$timeout) or die "Cannot set CPU limit: $!\n"; + BSD::Resource::setrlimit( "RLIMIT_CPU", $timeout, 2 * $timeout ) + or die "Cannot set CPU limit: $!\n"; }; if ($@) { - warn "Please install the package BSD::Resource!\n\n$@\n"; + 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"; -} + warn "Alarm handler got called after $timeout seconds\n"; + warn "Kill now the process group $pgid\n\n"; + + # kill process group + kill "INT", -$pgid; +}; -# parent -else { } +# don't kill ourself +$SIG{INT} = "IGNORE"; + +alarm($timeout); + +system(@system) == 0 + or die "system('@system') failed: ?='$?', !='$!', ^E='$^E'\n"; 1; +