diff options
author | crupest <crupest@outlook.com> | 2024-06-24 00:06:25 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2024-10-06 18:03:42 +0800 |
commit | b2a331aa527bdd5f4d91727904cc5c66fe897d62 (patch) | |
tree | e84d0bfdd4ed63255024e02954963d8c564ad024 /src/base/io/AutoReadStream.cpp | |
parent | dfe62dcf8bcefc523b466e127c3edc4dc2756629 (diff) | |
download | cru-b2a331aa527bdd5f4d91727904cc5c66fe897d62.tar.gz cru-b2a331aa527bdd5f4d91727904cc5c66fe897d62.tar.bz2 cru-b2a331aa527bdd5f4d91727904cc5c66fe897d62.zip |
Done Stream refactor.
NEED TEST: BufferStream, AutoReadStream, SubProcess.
Diffstat (limited to 'src/base/io/AutoReadStream.cpp')
-rw-r--r-- | src/base/io/AutoReadStream.cpp | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/base/io/AutoReadStream.cpp b/src/base/io/AutoReadStream.cpp index c24f61d1..0c035648 100644 --- a/src/base/io/AutoReadStream.cpp +++ b/src/base/io/AutoReadStream.cpp @@ -5,9 +5,12 @@ namespace cru::io { -AutoReadStream::AutoReadStream(Stream* stream, bool auto_delete, +AutoReadStream::AutoReadStream(Stream* stream, bool auto_close, + bool auto_delete, const AutoReadStreamOptions& options) - : Stream(false, true, stream->CanSeek()) { + : Stream(false, true, stream->CanSeek()), + auto_close_(auto_close), + auto_delete_(auto_delete) { auto buffer_stream_options = options.GetBufferStreamOptions(); stream_ = stream; size_per_read_ = buffer_stream_options.GetBlockSizeOrDefault(); @@ -16,13 +19,11 @@ AutoReadStream::AutoReadStream(Stream* stream, bool auto_delete, } AutoReadStream::~AutoReadStream() { - if (auto_delete_) { - delete stream_; - } + DoClose(); + background_thread_.join(); } Index AutoReadStream::DoRead(std::byte* buffer, Index offset, Index size) { - std::unique_lock lock(buffer_stream_mutex_); return buffer_stream_->Read(buffer, offset, size); } @@ -33,7 +34,17 @@ Index AutoReadStream::DoWrite(const std::byte* buffer, Index offset, void AutoReadStream::DoFlush() { stream_->Flush(); } -void AutoReadStream::DoClose() {} +void AutoReadStream::DoClose() { + CRU_STREAM_BEGIN_CLOSE + if (auto_close_) { + stream_->Close(); + } + if (auto_delete_) { + delete stream_; + stream_ = nullptr; + } + buffer_stream_->Close(); +} void AutoReadStream::BackgroundThreadRun() { std::vector<std::byte> buffer(size_per_read_); @@ -46,11 +57,10 @@ void AutoReadStream::BackgroundThreadRun() { } else { buffer_stream_->Write(buffer.data(), read); } - } catch (const StreamAlreadyClosedException& exception) { - buffer_stream_->SetEof(); + } catch (const StreamClosedException& exception) { + buffer_stream_->Close(); break; } } } - } // namespace cru::io |