Skip to content

Commit f2916c9

Browse files
authored
Add done mode (#177)
1 parent 0915fe9 commit f2916c9

File tree

6 files changed

+129
-84
lines changed

6 files changed

+129
-84
lines changed

docs/src/assets/modes.dot

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@ digraph modes {
1212
"read" -> "panic";
1313

1414
"write" -> "write";
15-
"write" -> "stop";
15+
"write" -> "done";
1616
"write" -> "close";
1717
"write" -> "panic";
1818

1919
"stop" -> "close";
20+
"done" -> "close";
2021

2122
"start" [ shape = point ];
2223
"idle" [ shape = circle ];
2324
"read" [ shape = circle ];
2425
"write" [ shape = circle ];
2526
"stop" [ shape = circle; style=bold; ];
27+
"done" [ shape = circle; style=bold; ];
2628
"close" [ shape = circle; style=bold; ];
2729
"panic" [ shape = circle; style=bold; ];
2830
}

docs/src/assets/modes.svg

Lines changed: 102 additions & 69 deletions
Loading

docs/src/devnotes.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ The `mode` field may be one of the following value:
4646
- `:idle` : initial and intermediate mode, no buffered data
4747
- `:read` : being ready to read data, data may be buffered
4848
- `:write`: being ready to write data, data may be buffered
49-
- `:stop` : transcoding is stopped, data may be buffered
49+
- `:stop` : transcoding is stopped after read, data may be buffered
50+
- `:done` : transcoding is stopped after write, data may be buffered
5051
- `:close`: closed, no buffered data
5152
- `:panic`: an exception has been thrown in codec, data may be buffered but we
5253
cannot do anything

src/state.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ See Developer's notes for details.
99
"""
1010
mutable struct State
1111
# current stream mode
12-
mode::Symbol # {:idle, :read, :write, :stop, :close, :panic}
12+
mode::Symbol # {:idle, :read, :write, :stop, :done, :close, :panic}
1313

1414
# return code of the last method call
1515
code::Symbol # {:ok, :end, :error}
1616

17-
# flag to go :stop on :end
17+
# flag to go :stop or :done on :end
1818
stop_on_end::Bool
1919

2020
# exception thrown while data processing

src/stream.jl

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,9 @@ function Base.isopen(stream::TranscodingStream)
183183
end
184184

185185
function Base.close(stream::TranscodingStream)
186-
stopped = stream.state.mode == :stop
187-
if stream.state.mode != :panic
186+
mode = stream.state.mode
187+
stopped = mode === :stop || mode === :done
188+
if mode != :panic
188189
changemode!(stream, :close)
189190
end
190191
if !stopped
@@ -213,6 +214,8 @@ end
213214
continue
214215
elseif mode == :write
215216
return eof(stream.stream)
217+
elseif mode == :done
218+
return eof(stream.stream)
216219
elseif mode == :close
217220
return true
218221
elseif mode == :stop
@@ -252,7 +255,7 @@ function Base.skip(stream::TranscodingStream, offset::Integer)
252255
mode = stream.state.mode
253256
buffer1 = stream.buffer1
254257
skipped = 0
255-
if mode == :read
258+
if mode === :read || mode === :stop
256259
while !eof(stream) && buffersize(buffer1) < offset - skipped
257260
n = buffersize(buffer1)
258261
emptybuffer!(buffer1)
@@ -619,7 +622,7 @@ function flushbuffer(stream::TranscodingStream, all::Bool=false)
619622
buffer1 = stream.buffer1
620623
buffer2 = stream.buffer2
621624
nflushed::Int = 0
622-
while (all ? buffersize(buffer1) != 0 : makemargin!(buffer1, 0) == 0) && state.mode != :stop
625+
while (all ? buffersize(buffer1) != 0 : makemargin!(buffer1, 0) == 0) && state.mode != :done
623626
if state.code == :end
624627
callstartproc(stream, :write)
625628
end
@@ -684,7 +687,11 @@ function callprocess(stream::TranscodingStream, inbuf::Buffer, outbuf::Buffer)
684687
# When no progress, expand the output buffer.
685688
makemargin!(outbuf, max(16, marginsize(outbuf) * 2))
686689
elseif state.code == :end && state.stop_on_end
687-
changemode!(stream, :stop)
690+
if stream.state.mode == :read
691+
changemode!(stream, :stop)
692+
else
693+
changemode!(stream, :done)
694+
end
688695
end
689696
return Δin, Δout
690697
end
@@ -738,8 +745,6 @@ end
738745
function changemode!(stream::TranscodingStream, newmode::Symbol)
739746
state = stream.state
740747
mode = state.mode
741-
buffer1 = stream.buffer1
742-
buffer2 = stream.buffer2
743748
if mode == newmode
744749
# mode does not change
745750
return
@@ -770,7 +775,7 @@ function changemode!(stream::TranscodingStream, newmode::Symbol)
770775
return
771776
end
772777
elseif mode == :write
773-
if newmode == :close || newmode == :stop
778+
if newmode == :close || newmode == :done
774779
if newmode == :close
775780
flushbufferall(stream)
776781
flushuntilend(stream)
@@ -784,6 +789,11 @@ function changemode!(stream::TranscodingStream, newmode::Symbol)
784789
state.mode = newmode
785790
return
786791
end
792+
elseif mode == :done
793+
if newmode == :close
794+
state.mode = newmode
795+
return
796+
end
787797
elseif mode == :panic
788798
throw_panic_error()
789799
end

test/codecdoubleframe.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,8 @@ DoubleFrameDecoderStream(stream::IO; kwargs...) = TranscodingStream(DoubleFrameD
215215
stream = TranscodingStream(DoubleFrameDecoder(), sink, stop_on_end=true)
216216
write(stream, "[ yy ]sdfsadfasdfdf")
217217
flush(stream)
218-
@test_broken eof(stream)
219-
# TODO This is broken.
220-
# @test_throws ArgumentError read(stream, UInt8)
218+
@test eof(stream)
219+
@test_throws ArgumentError read(stream, UInt8)
221220
@test take!(sink) == b"y"
222221
close(stream)
223222
end

0 commit comments

Comments
 (0)