1 ! Copyright (C) 2005, 2008 Slava Pestov, Doug Coleman
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: math kernel io sequences io.buffers io.timeouts generic
4 byte-vectors system io.encodings math.order io.backend
5 continuations debugger classes byte-arrays namespaces splitting
6 dlists assocs io.encodings.binary inspector accessors
10 SYMBOL: default-buffer-size
11 64 1024 * default-buffer-size set-global
13 TUPLE: port handle timeout disposed ;
15 M: port timeout timeout>> ;
17 M: port set-timeout (>>timeout) ;
19 : <port> ( handle class -- port )
20 new swap >>handle ; inline
22 TUPLE: buffered-port < port buffer ;
24 : <buffered-port> ( handle class -- port )
26 default-buffer-size get <buffer> >>buffer ; inline
28 TUPLE: input-port < buffered-port ;
30 : <input-port> ( handle -- input-port )
31 input-port <buffered-port> ;
33 HOOK: (wait-to-read) io-backend ( port -- )
35 : wait-to-read ( port -- eof? )
36 dup buffer>> buffer-empty? [
37 dup (wait-to-read) buffer>> buffer-empty?
40 M: input-port stream-read1
42 dup wait-to-read [ drop f ] [ buffer>> buffer-pop ] if ;
44 : read-step ( count port -- byte-array/f )
45 dup wait-to-read [ 2drop f ] [ buffer>> buffer-read ] if ;
47 M: input-port stream-read-partial ( max stream -- byte-array/f )
49 >r 0 max >integer r> read-step ;
51 : read-loop ( count port accum -- )
52 pick over length - dup 0 > [
54 over push-all read-loop
62 M: input-port stream-read
74 TUPLE: output-port < buffered-port ;
76 : <output-port> ( handle -- output-port )
77 output-port <buffered-port> ;
79 : can-write? ( len buffer -- ? )
80 [ buffer-fill + ] keep buffer-capacity <= ;
82 : wait-to-write ( len port -- )
83 tuck buffer>> can-write? [ drop ] [ stream-flush ] if ;
85 M: output-port stream-write1
88 buffer>> byte>buffer ;
90 M: output-port stream-write
92 over length over buffer>> buffer-size > [
93 [ buffer>> buffer-size <groups> ]
94 [ [ stream-write ] curry ] bi
97 [ >r length r> wait-to-write ]
98 [ buffer>> >buffer ] 2bi
101 HOOK: (wait-to-write) io-backend ( port -- )
103 GENERIC: shutdown ( handle -- )
105 M: object shutdown drop ;
107 : port-flush ( port -- )
108 dup buffer>> buffer-empty?
109 [ drop ] [ dup (wait-to-write) port-flush ] if ;
111 M: output-port stream-flush ( port -- )
112 [ check-disposed ] [ port-flush ] bi ;
114 M: output-port dispose*
116 [ handle>> &dispose drop ]
118 [ handle>> shutdown ]
122 M: buffered-port dispose*
124 [ [ [ buffer-free ] when* f ] change-buffer drop ]
127 M: port cancel-operation handle>> cancel-operation ;
131 [ handle>> &dispose drop ]
132 [ handle>> shutdown ]