in reply to Re: Need Help With Alarm And Eval
in thread Need Help With Alarm And Eval

Hey thanks a lot for your reply removed local and every thing worked perfectly!!!! Thanks a lot!!!!!

Replies are listed 'Best First'.
Re^3: Need Help With Alarm And Eval
by afoken (Chancellor) on Dec 06, 2012 at 15:08 UTC
    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/) { $timeouthandler->(); } }

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

      Hey Thank you.My problem is ,I want subs to switch on and off my alarm so that i can call them when needed. Any suggestion how to do that ?

        I want subs to switch on and off my alarm so that i can call them when needed

        Why? The code you showed first is more or less the usual code for having a timeout in some long running code. (You do know the example in perlipc, right?) If you don't need a timeout, just don't mess with alarm and $SIG{'ALRM'} at all.

        In code:

        withTimeout(30,\&doSomething,sub { die 'Oooops, doSomething was too sl +ow' }); # <-- timeout after 30 seconds doSomething(); # <-- no timeout here

        If you still think that you need to "switch on and off", please explain your actual problem.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)