2008-02-21 20:12:37 -05:00
|
|
|
! Copyright (C) 2005, 2008 Slava Pestov, Doug Coleman.
|
2007-11-06 16:51:50 -05:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-02-21 20:12:37 -05:00
|
|
|
USING: arrays calendar combinators generic init kernel math
|
|
|
|
namespaces sequences heaps boxes threads debugger quotations ;
|
2007-11-06 16:51:50 -05:00
|
|
|
IN: alarms
|
|
|
|
|
2008-02-21 20:12:37 -05:00
|
|
|
TUPLE: alarm time interval quot entry ;
|
2007-11-06 16:51:50 -05:00
|
|
|
|
2008-02-21 20:12:37 -05:00
|
|
|
: check-alarm
|
|
|
|
pick timestamp? [ "Not a timestamp" throw ] unless
|
|
|
|
over dup dt? swap not or [ "Not a dt" throw ] unless
|
|
|
|
dup callable? [ "Not a quotation" throw ] unless ; inline
|
2007-11-06 16:51:50 -05:00
|
|
|
|
2008-02-21 20:12:37 -05:00
|
|
|
: <alarm> ( time delay quot -- alarm )
|
|
|
|
check-alarm <box> alarm construct-boa ;
|
2007-11-06 16:51:50 -05:00
|
|
|
|
2008-02-21 20:12:37 -05:00
|
|
|
! Global min-heap
|
2007-11-06 16:51:50 -05:00
|
|
|
SYMBOL: alarms
|
2008-02-21 20:12:37 -05:00
|
|
|
SYMBOL: alarm-thread
|
2007-11-06 16:51:50 -05:00
|
|
|
|
2008-02-21 20:12:37 -05:00
|
|
|
: notify-alarm-thread ( -- )
|
|
|
|
alarm-thread get-global interrupt ;
|
2007-11-06 16:51:50 -05:00
|
|
|
|
2008-02-21 20:12:37 -05:00
|
|
|
: add-alarm ( time delay quot -- alarm )
|
|
|
|
<alarm> [
|
|
|
|
dup dup alarm-time alarms get-global heap-push*
|
|
|
|
swap alarm-entry >box
|
|
|
|
notify-alarm-thread
|
|
|
|
] keep ;
|
2007-11-06 16:51:50 -05:00
|
|
|
|
2008-02-21 20:12:37 -05:00
|
|
|
: cancel-alarm ( alarm -- )
|
|
|
|
alarm-entry box> alarms get-global heap-delete ;
|
2007-11-06 16:51:50 -05:00
|
|
|
|
2008-02-21 20:12:37 -05:00
|
|
|
: alarm-expired? ( alarm now -- ? )
|
|
|
|
>r alarm-time r> <=> 0 <= ;
|
2007-11-06 16:51:50 -05:00
|
|
|
|
2008-02-21 20:12:37 -05:00
|
|
|
: reschedule-alarm ( alarm -- )
|
|
|
|
dup alarm-time over alarm-interval +dt
|
|
|
|
over set-alarm-time
|
|
|
|
add-alarm drop ;
|
2007-11-06 16:51:50 -05:00
|
|
|
|
|
|
|
: call-alarm ( alarm -- )
|
2008-02-21 20:12:37 -05:00
|
|
|
dup alarm-quot try
|
|
|
|
dup alarm-entry box> drop
|
|
|
|
dup alarm-interval [ reschedule-alarm ] [ drop ] if ;
|
|
|
|
|
|
|
|
: (trigger-alarms) ( alarms now -- )
|
|
|
|
over heap-empty? [
|
|
|
|
2drop
|
|
|
|
] [
|
|
|
|
over heap-peek drop over alarm-expired? [
|
|
|
|
over heap-pop drop call-alarm
|
|
|
|
(trigger-alarms)
|
|
|
|
] [
|
|
|
|
2drop
|
|
|
|
] if
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
: trigger-alarms ( alarms -- )
|
|
|
|
now (trigger-alarms) ;
|
|
|
|
|
|
|
|
: next-alarm ( alarms -- ms )
|
|
|
|
dup heap-empty?
|
|
|
|
[ drop f ] [
|
|
|
|
heap-peek drop alarm-time now
|
|
|
|
[ timestamp>unix-time ] 2apply [-] 1000 *
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
: alarm-thread-loop ( -- )
|
|
|
|
alarms get-global
|
|
|
|
dup next-alarm nap drop
|
|
|
|
dup trigger-alarms
|
|
|
|
alarm-thread-loop ;
|
|
|
|
|
|
|
|
: init-alarms ( -- )
|
|
|
|
<min-heap> alarms set-global
|
|
|
|
[ alarm-thread-loop ] "Alarms" spawn
|
|
|
|
alarm-thread set-global ;
|
|
|
|
|
|
|
|
[ init-alarms ] "alarms" add-init-hook
|