summaryrefslogtreecommitdiffstats
path: root/fastos
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2016-09-15 11:01:53 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2016-09-15 11:04:14 +0000
commit34457de36ea84b1ffc4fc286050ef05e96a0adff (patch)
treec6fecfe35d78f31008dea84111ad9a0213535487 /fastos
parent135f7d9c334413ac8f59db7ae04d1ee711bfbfef (diff)
Honour the chunking during all use of the interface.
Diffstat (limited to 'fastos')
-rw-r--r--fastos/src/vespa/fastos/file.cpp8
-rw-r--r--fastos/src/vespa/fastos/file.h2
-rw-r--r--fastos/src/vespa/fastos/linux_file.cpp19
-rw-r--r--fastos/src/vespa/fastos/linux_file.h1
4 files changed, 20 insertions, 10 deletions
diff --git a/fastos/src/vespa/fastos/file.cpp b/fastos/src/vespa/fastos/file.cpp
index 8e349d6c4e6..e1592ffb409 100644
--- a/fastos/src/vespa/fastos/file.cpp
+++ b/fastos/src/vespa/fastos/file.cpp
@@ -76,13 +76,7 @@ FastOS_FileInterface::ReadBuf(void *buffer, size_t length)
void
FastOS_FileInterface::WriteBuf(const void *buffer, size_t length)
{
- const char * data = static_cast<const char *>(buffer);
- while (length > 0) {
- size_t len = std::min(_writeChunkSize, length);
- WriteBufInternal(data, len);
- data += len;
- length -= len;
- }
+ WriteBufInternal(buffer, length);
}
void
diff --git a/fastos/src/vespa/fastos/file.h b/fastos/src/vespa/fastos/file.h
index ebe835172fe..2dfbcb3eb5a 100644
--- a/fastos/src/vespa/fastos/file.h
+++ b/fastos/src/vespa/fastos/file.h
@@ -107,7 +107,6 @@ protected:
bool _directIOEnabled;
bool _syncWritesEnabled;
static FailedHandler _failedHandler;
-;
public:
static int getDefaultFAdviseOptions() { return _defaultFAdviseOptions; }
@@ -518,6 +517,7 @@ public:
* Set the write chunk size used in WriteBuf.
*/
void SetWriteChunkSize(size_t writeChunkSize);
+ size_t getWriteChunkSize() const { return _writeChunkSize; }
/**
* Get restrictions for direct disk I/O. The file should be opened
diff --git a/fastos/src/vespa/fastos/linux_file.cpp b/fastos/src/vespa/fastos/linux_file.cpp
index e57e00645af..b34e54c27b8 100644
--- a/fastos/src/vespa/fastos/linux_file.cpp
+++ b/fastos/src/vespa/fastos/linux_file.cpp
@@ -189,9 +189,24 @@ FastOS_Linux_File::Read(void *buffer, size_t len)
ssize_t
FastOS_Linux_File::Write2(const void *buffer, size_t length)
{
- if (length == 0) { return 0; }
- ssize_t writeRes;
+ const char * data = static_cast<const char *>(buffer);
+ ssize_t written(0);
+ while (written < ssize_t(length)) {
+ size_t len = std::min(getWriteChunkSize(), length - written);
+ ssize_t writtenNow = internalWrite2(data + written, len);
+ if (writtenNow > 0) {
+ written += writtenNow;
+ } else {
+ return written;
+ }
+ }
+ return written;
+}
+ssize_t
+FastOS_Linux_File::internalWrite2(const void *buffer, size_t length)
+{
+ ssize_t writeRes;
if (_directIOEnabled) {
if (DIRECTIOPOSSIBLE(buffer, length, _filePointer)) {
writeRes = writeInternal(_filedes, buffer, length, _filePointer);
diff --git a/fastos/src/vespa/fastos/linux_file.h b/fastos/src/vespa/fastos/linux_file.h
index 41fe097adb8..894e2cee200 100644
--- a/fastos/src/vespa/fastos/linux_file.h
+++ b/fastos/src/vespa/fastos/linux_file.h
@@ -46,6 +46,7 @@ public:
static size_t getMaxDirectIOMemAlign();
static void *allocateGenericDirectIOBuffer(size_t byteSize, void *&realPtr);
private:
+ ssize_t internalWrite2(const void *buffer, size_t len);
ssize_t readUnalignedEnd(void *buffer, size_t length, int64_t readOffset);
ssize_t writeUnalignedEnd(const void *buffer, size_t length, int64_t readOffset);
ssize_t ReadBufInternal(void *buffer, size_t length, int64_t readOffset);