Bug 22224

Summary: Не отрабатывает alarm из Time::HiRes
Product: Sisyphus Reporter: Andriy Stepanov (stanv) <stanv>
Component: perl-baseAssignee: at <at>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: major    
Priority: P3 CC: at, crux, ldv, mike, php-coder, rider, viy
Version: unstable   
Hardware: all   
OS: Linux   

Description Andriy Stepanov (stanv) 2009-11-09 16:44:53 MSK
Для perl-base 1:5.8.9-alt3 не срабатывает
alarm из Time::HiRes

Testsuit:

#!/usr/bin/perl -w

use Time::HiRes qw(alarm ualarm);

$SIG{ALRM} = sub {die "alarm"};
alarm(1);
#ualarm(1000000);
while(1) {
 sleep 1;
}

В случае ualarm скрипт отрабатывает как ожидается.

strace -ffv -o log2 ./1.pl

32020 rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0
32020 rt_sigaction(SIGALRM, {0x7f54f1b426a0, [], SA_RESTORER, 0x7f54f17b1070}, {SIG_DFL, [], 0}, 8) = 0

32020 --- SIGALRM (Alarm clock) @ 0 (0) ---


В случае alarm сигнал не приходит:

32032 rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0
32032 rt_sigaction(SIGALRM, {0x7f9651b986a0, [], SA_RESTORER, 0x7f9651807070}, {SIG_DFL, [], 0}, 8) = 0

32031 +++ killed by SIGINT +++ (CTRL-C)

сообщения что сигнал ALRM принят нету.

На http://perldoc.perl.org/functions/alarm.html
указано что не следует мешать alarm + sleep:
It is usually a mistake to intermix alarm and sleep calls. (sleep may be internally implemented in your system with alarm).
Тут мы как раз мы это и делаем.

Но по утверждению тестовый скрипт не срабатывает на ветках 5.0/Sisyphus. На 4.X срабатывает как ожидается.
Comment 1 Andriy Stepanov (stanv) 2009-11-09 17:11:30 MSK
#!/usr/bin/perl -w

use Time::HiRes qw(alarm ualarm);

$SIG{ALRM} = sub {die "alarm"};
alarm(1);
#ualarm(1000000);
my ($i,$j);
for ($i=0; $i<100000000; $i++) {
 $j+=$i^2;
}

Подтверждает что где-то ошибка, т.е. sleep в этом тестике роли не играет.
Comment 2 Andriy Stepanov (stanv) 2009-11-09 17:12:37 MSK
> strace -e setitimer perl -MTime::HiRes=ualarm -e 'ualarm 2; sleep 4'
setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={0, 2}}, {it_interval={0, 0}, it_value={0, 0}}) = 0
--- SIGALRM (Alarm clock) @ 0 (0) ---
+++ killed by SIGALRM +++
zsh: alarm      strace -e setitimer perl -MTime::HiRes=ualarm -e 'ualarm 2; sleep 4'

в случае alarm тишина:

> strace -e setitimer perl -MTime::HiRes=alarm -e 'alarm 2; sleep 4'  
>
Comment 3 Anton Farygin 2009-11-27 17:30:14 MSK
ping ping

Что с этой ошибкой ?
Comment 4 Michael Shigorin 2009-12-09 18:13:57 MSK
Почитав полиси,
предложил nmu
усталый майнтейнер.
Comment 5 Dmitry V. Levin 2010-11-14 04:59:45 MSK
$ rpmquery perl-base
perl-base-5.12.2-alt00
$ strace -e setitimer perl -MTime::HiRes=alarm -e 'alarm 2; sleep 4'
setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={2, 0}}, NULL) = 0
--- SIGALRM (Alarm clock) @ 0 (0) ---
+++ killed by SIGALRM +++