1 ! Copyright (C) 2005, 2008 Slava Pestov, Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays calendar combinators generic init kernel math
4 namespaces sequences heaps boxes threads debugger quotations
8 TUPLE: alarm quot time interval entry ;
15 : notify-alarm-thread ( -- )
16 alarm-thread get-global interrupt ;
19 dup duration? over not or [ "Not a duration" throw ] unless
20 over timestamp? [ "Not a timestamp" throw ] unless
21 pick callable? [ "Not a quotation" throw ] unless ; inline
23 : <alarm> ( quot time frequency -- alarm )
24 check-alarm <box> alarm boa ;
26 : register-alarm ( alarm -- )
27 dup dup alarm-time alarms get-global heap-push*
31 : alarm-expired? ( alarm now -- ? )
32 >r alarm-time r> before=? ;
34 : reschedule-alarm ( alarm -- )
35 dup alarm-time over alarm-interval time+
39 : call-alarm ( alarm -- )
40 dup alarm-entry box> drop
41 dup alarm-quot "Alarm execution" spawn drop
42 dup alarm-interval [ reschedule-alarm ] [ drop ] if ;
44 : (trigger-alarms) ( alarms now -- )
48 over heap-peek drop over alarm-expired? [
49 over heap-pop drop call-alarm (trigger-alarms)
55 : trigger-alarms ( alarms -- )
56 now (trigger-alarms) ;
58 : next-alarm ( alarms -- timestamp/f )
60 [ drop f ] [ heap-peek drop alarm-time ] if ;
62 : alarm-thread-loop ( -- )
64 dup next-alarm sleep-until
67 : cancel-alarms ( alarms -- )
69 heap-pop-all [ nip alarm-entry box> drop ] assoc-each
73 alarms global [ cancel-alarms <min-heap> ] change-at
74 [ alarm-thread-loop t ] "Alarms" spawn-server
75 alarm-thread set-global ;
77 [ init-alarms ] "alarms" add-init-hook
81 : add-alarm ( quot time frequency -- alarm )
82 <alarm> [ register-alarm ] keep ;
84 : later ( quot dt -- alarm )
87 : every ( quot dt -- alarm )
88 [ hence ] keep add-alarm ;
90 : cancel-alarm ( alarm -- )
91 alarm-entry [ alarms get-global heap-delete ] if-box? ;