1 ! Copyright (C) 2005, 2008 Slava Pestov, Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs boxes calendar
4 combinators.short-circuit fry heaps init kernel math.order
5 namespaces quotations threads math system ;
9 { quot callable initial: [ ] }
19 : notify-alarm-thread ( -- )
20 alarm-thread get-global interrupt ;
22 GENERIC: >nanoseconds ( obj -- duration/f )
24 M: real >nanoseconds >integer ;
25 M: duration >nanoseconds duration>nanoseconds >integer ;
27 : <alarm> ( quot start interval -- alarm )
29 swap >nanoseconds >>interval
30 swap >nanoseconds nano-count + >>start
34 : register-alarm ( alarm -- )
35 [ dup start>> alarms get-global heap-push* ]
39 : alarm-expired? ( alarm n -- ? )
42 : reschedule-alarm ( alarm -- )
43 dup interval>> nano-count + >>start register-alarm ;
45 : call-alarm ( alarm -- )
47 [ dup interval>> [ reschedule-alarm ] [ drop ] if ]
48 [ quot>> "Alarm execution" spawn drop ] tri ;
50 : (trigger-alarms) ( alarms n -- )
54 over heap-peek drop over alarm-expired? [
55 over heap-pop drop call-alarm (trigger-alarms)
61 : trigger-alarms ( alarms -- )
62 nano-count (trigger-alarms) ;
64 : next-alarm ( alarms -- nanos/f )
65 dup heap-empty? [ drop f ] [ heap-peek drop start>> ] if ;
67 : alarm-thread-loop ( -- )
69 dup next-alarm sleep-until
72 : cancel-alarms ( alarms -- )
74 heap-pop-all [ nip entry>> box> drop ] assoc-each
78 alarms [ cancel-alarms <min-heap> ] change-global
79 [ alarm-thread-loop t ] "Alarms" spawn-server
80 alarm-thread set-global ;
82 [ init-alarms ] "alarms" add-startup-hook
86 : add-alarm ( quot start interval -- alarm )
87 <alarm> [ register-alarm ] keep ;
89 : later ( quot duration -- alarm ) f add-alarm ;
91 : every ( quot duration -- alarm ) dup add-alarm ;
93 : cancel-alarm ( alarm -- )
94 entry>> [ alarms get-global heap-delete ] if-box? ;