[Moscow.pm] Ограничить время выполнения произвольной функции

Dmitry E. Oboukhov unera на debian.org
Пт Янв 29 07:08:47 PST 2010


On 15:39 Fri 29 Jan     , Dmitry Karasik wrote:
>> Вообще-то у goto задокументирована возможность выхода из сабов. А goto &sub
>> -- это вообще не goto, поэтому с ним тут глюки :)

DK> более того, из нормальных сабов он это и делает - сам пользуюсь ;)
DK> а вот из обработчика сигнала - нет.

Эмм, как это нет? я набросал модульчик и у меня делает нормально: из
обработчика alarm обратно в функцию

    my @res;
    eval {
        local $SIG{ALRM} = sub {
            $alarmed = 1;
            goto FOO_DONE;
        };
        alarm $timeout;

        if ($wantarray) {
            @res = eval { $code->(@args) };
        } elsif (defined $wantarray) {
            $res[0] = eval { $code->(@args) };
        } else {
            eval { $code->(@args) };
        }
        alarm 0;
        
        die if $@;
    };
    
    FOO_DONE:

    и вот тут мы уже полностью вышли и из обработчика сигнала и из функции
которую хотели прервать.
-- 
... mpd playing: Manowar - 08 Master Of The Wind

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera на debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537
----------- следущая часть -----------
A non-text attachment was scrubbed...
Name: отсутствует
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20100129/6fd9d079/attachment.bin>


Подробная информация о списке рассылки Moscow-pm