factor/extra/alarms/alarms.factor

92 lines
2.3 KiB
Factor
Raw Normal View History

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
2008-02-22 17:16:00 -05:00
namespaces sequences heaps boxes threads debugger quotations
assocs math.order ;
2007-11-06 16:51:50 -05:00
IN: alarms
TUPLE: alarm quot time interval entry ;
2007-11-06 16:51:50 -05:00
2008-02-21 20:19:21 -05:00
<PRIVATE
2008-02-21 21:57:41 -05:00
SYMBOL: alarms
SYMBOL: alarm-thread
: notify-alarm-thread ( -- )
alarm-thread get-global interrupt ;
2008-02-21 20:12:37 -05:00
: check-alarm
2008-02-26 19:47:05 -05:00
dup duration? over not or [ "Not a duration" throw ] unless
over timestamp? [ "Not a timestamp" throw ] unless
pick callable? [ "Not a quotation" throw ] unless ; inline
2007-11-06 16:51:50 -05:00
: <alarm> ( quot time frequency -- alarm )
check-alarm <box> alarm boa ;
2007-11-06 16:51:50 -05:00
2008-02-21 21:57:41 -05:00
: register-alarm ( alarm -- )
dup dup alarm-time alarms get-global heap-push*
swap alarm-entry >box
notify-alarm-thread ;
2007-11-06 16:51:50 -05:00
2008-02-21 20:12:37 -05:00
: alarm-expired? ( alarm now -- ? )
2008-02-26 18:33:48 -05:00
>r alarm-time r> before=? ;
2007-11-06 16:51:50 -05:00
2008-02-21 20:12:37 -05:00
: reschedule-alarm ( alarm -- )
2008-02-26 18:33:48 -05:00
dup alarm-time over alarm-interval time+
2008-02-21 20:12:37 -05:00
over set-alarm-time
2008-02-21 21:57:41 -05:00
register-alarm ;
2007-11-06 16:51:50 -05:00
: call-alarm ( alarm -- )
2008-02-21 20:12:37 -05:00
dup alarm-entry box> drop
2008-03-12 03:36:58 -04:00
dup alarm-quot "Alarm execution" spawn drop
2008-02-21 20:12:37 -05:00
dup alarm-interval [ reschedule-alarm ] [ drop ] if ;
: (trigger-alarms) ( alarms now -- )
over heap-empty? [
2drop
] [
over heap-peek drop over alarm-expired? [
2008-03-03 03:22:27 -05:00
over heap-pop drop call-alarm (trigger-alarms)
2008-02-21 20:12:37 -05:00
] [
2drop
] if
] if ;
: trigger-alarms ( alarms -- )
now (trigger-alarms) ;
2008-02-23 23:29:46 -05:00
: next-alarm ( alarms -- timestamp/f )
2008-02-21 20:12:37 -05:00
dup heap-empty?
2008-02-23 23:29:46 -05:00
[ drop f ] [ heap-peek drop alarm-time ] if ;
2008-02-21 20:12:37 -05:00
: alarm-thread-loop ( -- )
alarms get-global
dup next-alarm sleep-until
2008-03-12 03:36:58 -04:00
trigger-alarms ;
2008-02-21 20:12:37 -05:00
2008-02-22 17:16:00 -05:00
: cancel-alarms ( alarms -- )
[
heap-pop-all [ nip alarm-entry box> drop ] assoc-each
] when* ;
2008-02-21 20:12:37 -05:00
: init-alarms ( -- )
2008-02-22 17:16:00 -05:00
alarms global [ cancel-alarms <min-heap> ] change-at
2008-03-12 03:36:58 -04:00
[ alarm-thread-loop t ] "Alarms" spawn-server
2008-02-21 20:12:37 -05:00
alarm-thread set-global ;
[ init-alarms ] "alarms" add-init-hook
2008-02-21 20:19:21 -05:00
PRIVATE>
: add-alarm ( quot time frequency -- alarm )
2008-02-21 21:57:41 -05:00
<alarm> [ register-alarm ] keep ;
2008-02-21 20:19:21 -05:00
: later ( quot dt -- alarm )
from-now f add-alarm ;
: every ( quot dt -- alarm )
[ from-now ] keep add-alarm ;
2008-02-21 20:19:21 -05:00
: cancel-alarm ( alarm -- )
2008-02-29 20:10:30 -05:00
alarm-entry [ alarms get-global heap-delete ] if-box? ;