diff options
-rw-r--r-- | src/system/FileDescriptor.cxx | 18 | ||||
-rw-r--r-- | src/system/FileDescriptor.hxx | 6 | ||||
-rw-r--r-- | test/run_filter.cxx | 32 |
3 files changed, 26 insertions, 30 deletions
diff --git a/src/system/FileDescriptor.cxx b/src/system/FileDescriptor.cxx index 35f84470f..d5c506802 100644 --- a/src/system/FileDescriptor.cxx +++ b/src/system/FileDescriptor.cxx @@ -298,6 +298,24 @@ FileDescriptor::FullRead(void *_buffer, size_t length) } } +void +FileDescriptor::FullWrite(const void *_buffer, size_t length) +{ + const uint8_t *buffer = (const uint8_t *)_buffer; + + while (length > 0) { + ssize_t nbytes = Write(buffer, length); + if (nbytes <= 0) { + if (nbytes < 0) + throw MakeErrno("Failed to write"); + throw std::runtime_error("Failed to write"); + } + + buffer += nbytes; + length -= nbytes; + } +} + #ifndef _WIN32 int diff --git a/src/system/FileDescriptor.hxx b/src/system/FileDescriptor.hxx index b3839c71b..1121d7891 100644 --- a/src/system/FileDescriptor.hxx +++ b/src/system/FileDescriptor.hxx @@ -237,6 +237,12 @@ public: return ::write(fd, buffer, length); } + /** + * Write until all of the given buffer has been written. + * Throws on error. + */ + void FullWrite(const void *buffer, size_t length); + #ifndef _WIN32 int Poll(short events, int timeout) const noexcept; diff --git a/test/run_filter.cxx b/test/run_filter.cxx index 5113a7250..dc8f11586 100644 --- a/test/run_filter.cxx +++ b/test/run_filter.cxx @@ -71,34 +71,6 @@ ReadOrThrow(FileDescriptor fd, void *buffer, size_t size) } static size_t -WriteOrThrow(FileDescriptor fd, const void *buffer, size_t size) -{ - auto nbytes = fd.Write(buffer, size); - if (nbytes < 0) - throw MakeErrno("Write failed"); - - return nbytes; -} - -static void -FullWrite(FileDescriptor fd, ConstBuffer<uint8_t> src) -{ - while (!src.empty()) { - size_t nbytes = WriteOrThrow(fd, src.data, src.size); - if (nbytes == 0) - throw std::runtime_error("Write failed"); - - src.skip_front(nbytes); - } -} - -static void -FullWrite(FileDescriptor fd, ConstBuffer<void> src) -{ - FullWrite(fd, ConstBuffer<uint8_t>::FromVoid(src)); -} - -static size_t ReadFrames(FileDescriptor fd, void *_buffer, size_t size, size_t frame_size) { auto buffer = (uint8_t *)_buffer; @@ -166,14 +138,14 @@ try { break; auto dest = filter->FilterPCM({(const void *)buffer, (size_t)nbytes}); - FullWrite(output_fd, dest); + output_fd.FullWrite(dest.data, dest.size); } while (true) { auto dest = filter->Flush(); if (dest.IsNull()) break; - FullWrite(output_fd, dest); + output_fd.FullWrite(dest.data, dest.size); } /* cleanup and exit */ |