removed local and every thing worked perfectly
No, it doesn't. The On function sets the signal handler globally, for ever, even after eval has finished. You want local $SIG{'ALRM'} inside that eval.
The extra subs don't make your code any clearer. I think you should keep alarm and local $SIG{'ALRM'} inside the eval.
You could also consider writing a generic timeout function like this:
# untested
sub withTimeout
{
my ($timeout,$worker,$timeouthandler)=@_;
eval {
local $SIG{'ALRM'}=sub { die "TIMEOUT" };
alarm($timeout);
$worker->();
alarm(0);
};
if ($@ and $@=~/TIMEOUT/) {
$errorhandler->();
}
}
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
|