1 ! Copyright (C) 2008, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors concurrency.mailboxes continuations destructors
4 fry io.backend io.timeouts kernel namespaces sequences system
8 HOOK: init-monitors io-backend ( -- )
10 M: object init-monitors ;
12 HOOK: dispose-monitors io-backend ( -- )
14 M: object dispose-monitors ;
16 : with-monitors ( quot -- )
19 [ dispose-monitors ] [ ] cleanup
22 TUPLE: monitor < disposable path queue timeout ;
24 M: monitor timeout timeout>> ;
26 M: monitor set-timeout timeout<< ;
30 SYMBOL: monitor-disposed
35 [ monitor-disposed ] dip queue>> mailbox-put ;
37 : new-monitor ( path mailbox class -- monitor )
42 TUPLE: file-change path changed monitor ;
44 : queue-change ( path changes monitor -- )
47 [ file-change boa ] keep
51 HOOK: (monitor) io-backend ( path recursive? mailbox -- monitor )
53 : <monitor> ( path recursive? -- monitor )
56 : next-change ( monitor -- change )
58 [ ] [ queue>> ] [ timeout ] tri mailbox-get-timeout
59 dup monitor-disposed eq? [ drop already-disposed ] [ nip ] if ;
64 SYMBOL: +rename-file-old+
65 SYMBOL: +rename-file-new+
68 : with-monitor ( path recursive? quot -- )
69 [ <monitor> ] dip with-disposal ; inline
71 : run-monitor ( path recursive? quot -- )
72 '[ [ @ t ] loop ] with-monitor ; inline
74 "io.monitors." os name>> append require