aboutsummaryrefslogtreecommitdiff
path: root/src/base/io/AutoReadStream.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2024-06-24 00:06:25 +0800
committercrupest <crupest@outlook.com>2024-10-06 18:03:42 +0800
commitb2a331aa527bdd5f4d91727904cc5c66fe897d62 (patch)
treee84d0bfdd4ed63255024e02954963d8c564ad024 /src/base/io/AutoReadStream.cpp
parentdfe62dcf8bcefc523b466e127c3edc4dc2756629 (diff)
downloadcru-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.cpp30
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