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