Update duplex streams for new-slots

db4
Slava Pestov 2008-04-13 00:21:48 -05:00
parent c97e13a236
commit a5d5dfb0df
1 changed files with 29 additions and 27 deletions

View File

@ -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 ;