Update duplex streams for new-slots
parent
c97e13a236
commit
a5d5dfb0df
|
@ -1,75 +1,77 @@
|
||||||
! Copyright (C) 2005 Slava Pestov.
|
! Copyright (C) 2005, 2008 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: kernel continuations io accessors ;
|
||||||
IN: io.streams.duplex
|
IN: io.streams.duplex
|
||||||
USING: kernel continuations io ;
|
|
||||||
|
|
||||||
! We ensure that the stream can only be closed once, to preserve
|
! We ensure that the stream can only be closed once, to preserve
|
||||||
! integrity of duplex I/O ports.
|
! integrity of duplex I/O ports.
|
||||||
|
|
||||||
TUPLE: duplex-stream in out closed? ;
|
TUPLE: duplex-stream in out closed ;
|
||||||
|
|
||||||
: <duplex-stream> ( in out -- stream )
|
: <duplex-stream> ( in out -- stream )
|
||||||
f duplex-stream construct-boa ;
|
f duplex-stream construct-boa ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
ERROR: stream-closed-twice ;
|
ERROR: stream-closed-twice ;
|
||||||
|
|
||||||
: check-closed ( stream -- )
|
: check-closed ( stream -- stream )
|
||||||
duplex-stream-closed? [ stream-closed-twice ] when ;
|
dup closed>> [ stream-closed-twice ] when ; inline
|
||||||
|
|
||||||
: duplex-stream-in+ ( duplex -- stream )
|
: in ( duplex -- stream ) check-closed in>> ;
|
||||||
dup check-closed duplex-stream-in ;
|
|
||||||
|
|
||||||
: duplex-stream-out+ ( duplex -- stream )
|
: out ( duplex -- stream ) check-closed out>> ;
|
||||||
dup check-closed duplex-stream-out ;
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
M: duplex-stream stream-flush
|
M: duplex-stream stream-flush
|
||||||
duplex-stream-out+ stream-flush ;
|
out stream-flush ;
|
||||||
|
|
||||||
M: duplex-stream stream-readln
|
M: duplex-stream stream-readln
|
||||||
duplex-stream-in+ stream-readln ;
|
in stream-readln ;
|
||||||
|
|
||||||
M: duplex-stream stream-read1
|
M: duplex-stream stream-read1
|
||||||
duplex-stream-in+ stream-read1 ;
|
in stream-read1 ;
|
||||||
|
|
||||||
M: duplex-stream stream-read-until
|
M: duplex-stream stream-read-until
|
||||||
duplex-stream-in+ stream-read-until ;
|
in stream-read-until ;
|
||||||
|
|
||||||
M: duplex-stream stream-read-partial
|
M: duplex-stream stream-read-partial
|
||||||
duplex-stream-in+ stream-read-partial ;
|
in stream-read-partial ;
|
||||||
|
|
||||||
M: duplex-stream stream-read
|
M: duplex-stream stream-read
|
||||||
duplex-stream-in+ stream-read ;
|
in stream-read ;
|
||||||
|
|
||||||
M: duplex-stream stream-write1
|
M: duplex-stream stream-write1
|
||||||
duplex-stream-out+ stream-write1 ;
|
out stream-write1 ;
|
||||||
|
|
||||||
M: duplex-stream stream-write
|
M: duplex-stream stream-write
|
||||||
duplex-stream-out+ stream-write ;
|
out stream-write ;
|
||||||
|
|
||||||
M: duplex-stream stream-nl
|
M: duplex-stream stream-nl
|
||||||
duplex-stream-out+ stream-nl ;
|
out stream-nl ;
|
||||||
|
|
||||||
M: duplex-stream stream-format
|
M: duplex-stream stream-format
|
||||||
duplex-stream-out+ stream-format ;
|
out stream-format ;
|
||||||
|
|
||||||
M: duplex-stream make-span-stream
|
M: duplex-stream make-span-stream
|
||||||
duplex-stream-out+ make-span-stream ;
|
out make-span-stream ;
|
||||||
|
|
||||||
M: duplex-stream make-block-stream
|
M: duplex-stream make-block-stream
|
||||||
duplex-stream-out+ make-block-stream ;
|
out make-block-stream ;
|
||||||
|
|
||||||
M: duplex-stream make-cell-stream
|
M: duplex-stream make-cell-stream
|
||||||
duplex-stream-out+ make-cell-stream ;
|
out make-cell-stream ;
|
||||||
|
|
||||||
M: duplex-stream stream-write-table
|
M: duplex-stream stream-write-table
|
||||||
duplex-stream-out+ stream-write-table ;
|
out stream-write-table ;
|
||||||
|
|
||||||
M: duplex-stream dispose
|
M: duplex-stream dispose
|
||||||
#! The output stream is closed first, in case both streams
|
#! The output stream is closed first, in case both streams
|
||||||
#! are attached to the same file descriptor, the output
|
#! are attached to the same file descriptor, the output
|
||||||
#! buffer needs to be flushed before we close the fd.
|
#! buffer needs to be flushed before we close the fd.
|
||||||
dup duplex-stream-closed? [
|
dup closed>> [
|
||||||
t over set-duplex-stream-closed?
|
t >>closed
|
||||||
[ dup duplex-stream-out dispose ]
|
[ dup out>> dispose ]
|
||||||
[ dup duplex-stream-in dispose ] [ ] cleanup
|
[ dup in>> dispose ] [ ] cleanup
|
||||||
] unless drop ;
|
] unless drop ;
|
||||||
|
|
Loading…
Reference in New Issue