# New Ticket Created by  "Pavlo Korzhyk" 
# Please include the string:  [perl #57764]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=57764 >


To reproduce simply copy-paste example 9 from docs/art/ppp02-pmc.pod
and run it:

======================================================
    .include "timer.pasm"                   # for the timer constants

    .sub expired
       print "Timer has expired!\n"
    .end

    .sub _ :main
       $P0 = new 'Timer'
       $P1 = global "expired"

       $P0[.PARROT_TIMER_HANDLER] = $P1    # call sub in $P1 when timer goes off
       $P0[.PARROT_TIMER_SEC] = 2          # trigger every 2 seconds
       $P0[.PARROT_TIMER_REPEAT] = -1      # repeat indefinitely
       $P0[.PARROT_TIMER_RUNNING] = 1      # start timer immediately
       global "timer" = $P0                # keep the timer around

       $I0 = 0
      loop:
       print $I0
       print ": running...\n"
       inc $I0
       sleep 1                             # wait a second
       goto loop
    .end
======================================================

The output under Ubuntu is:
(0.6.4 on Ubuntu and WinXP, 0.6.3 on Ubuntu produce the similar bad result)
======================================================
0: running...
1: running...
maximum recursion depth exceeded
current instr.: 'expired' pc 0 (timertest.pir:4)
called from Sub 'expired' pc 0 (timertest.pir:4)
called from Sub 'expired' pc 0 (timertest.pir:4)
... repeated approx 2000 times ...
called from Sub 'expired' pc 0 (timertest.pir:4)
called from Sub 'expired' pc 0 (timertest.pir:4)
called from Sub '_' pc 41 (timertest.pir:22)
Segmentation fault
======================================================

If "-1"(indefinitely) is replaced with "5" - you'll get 6 messages
"Timer has expired!"
all at once:
======================================================
0: running...
1: running...
Timer has expired!
Timer has expired!
Timer has expired!
Timer has expired!
Timer has expired!
Timer has expired!
2: running...
3: running...
4: running...
5: running...
(pressed Ctrl+C here)
======================================================

For N repeats you will get N+1 executions of the handler.

Reply via email to