summaryrefslogtreecommitdiffstats
path: root/util/stream/direct_io.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <[email protected]>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <[email protected]>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/stream/direct_io.cpp
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/stream/direct_io.cpp')
-rw-r--r--util/stream/direct_io.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/util/stream/direct_io.cpp b/util/stream/direct_io.cpp
new file mode 100644
index 00000000000..649033af341
--- /dev/null
+++ b/util/stream/direct_io.cpp
@@ -0,0 +1,47 @@
+#include "direct_io.h"
+
+#include <util/generic/utility.h>
+
+size_t TRandomAccessFileInput::DoRead(void* buf, size_t len) {
+ const size_t result = File.Pread(buf, len, Position);
+ Position += result;
+ return result;
+}
+
+TRandomAccessFileInput::TRandomAccessFileInput(TDirectIOBufferedFile& file, ui64 position)
+ : File(file)
+ , Position(position)
+{
+}
+
+size_t TRandomAccessFileInput::DoSkip(size_t len) {
+ size_t skiped = Min(len, (size_t)Min((ui64)Max<size_t>(), File.GetLength() - Position));
+ Position += skiped;
+ return skiped;
+}
+
+TRandomAccessFileOutput::TRandomAccessFileOutput(TDirectIOBufferedFile& file)
+ : File(&file)
+{
+}
+
+void TRandomAccessFileOutput::DoWrite(const void* buf, size_t len) {
+ File->Write(buf, len);
+}
+
+void TRandomAccessFileOutput::DoFlush() {
+ File->FlushData();
+}
+
+TBufferedFileOutputEx::TBufferedFileOutputEx(const TString& path, EOpenMode oMode, size_t buflen)
+ : TRandomAccessFileOutput(*(new TDirectIOBufferedFile(path, oMode, buflen)))
+ , FileHolder(File)
+{
+}
+
+void TBufferedFileOutputEx::DoFinish() {
+ FileHolder->Finish();
+}
+
+void TBufferedFileOutputEx::DoFlush() {
+}