io/FileDescriptor: pass std::span to Full{Read,Write}()

This commit is contained in:
Max Kellermann 2023-09-26 20:40:05 +02:00 committed by Max Kellermann
parent 9a0b3775d8
commit 09a2da89a2
6 changed files with 18 additions and 23 deletions

View File

@ -249,38 +249,32 @@ FileDescriptor::GetSize() const noexcept
} }
void void
FileDescriptor::FullRead(void *_buffer, std::size_t length) const FileDescriptor::FullRead(std::span<std::byte> dest) const
{ {
auto buffer = (std::byte *)_buffer; while (!dest.empty()) {
ssize_t nbytes = Read(dest.data(), dest.size());
while (length > 0) {
ssize_t nbytes = Read(buffer, length);
if (nbytes <= 0) { if (nbytes <= 0) {
if (nbytes < 0) if (nbytes < 0)
throw MakeErrno("Failed to read"); throw MakeErrno("Failed to read");
throw std::runtime_error("Unexpected end of file"); throw std::runtime_error("Unexpected end of file");
} }
buffer += nbytes; dest = dest.subspan(nbytes);
length -= nbytes;
} }
} }
void void
FileDescriptor::FullWrite(const void *_buffer, std::size_t length) const FileDescriptor::FullWrite(std::span<const std::byte> src) const
{ {
auto buffer = (const std::byte *)_buffer; while (!src.empty()) {
ssize_t nbytes = Write(src.data(), src.size());
while (length > 0) {
ssize_t nbytes = Write(buffer, length);
if (nbytes <= 0) { if (nbytes <= 0) {
if (nbytes < 0) if (nbytes < 0)
throw MakeErrno("Failed to write"); throw MakeErrno("Failed to write");
throw std::runtime_error("Failed to write"); throw std::runtime_error("Failed to write");
} }
buffer += nbytes; src = src.subspan(nbytes);
length -= nbytes;
} }
} }

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <cstddef> #include <cstddef>
#include <span>
#include <utility> #include <utility>
#include <unistd.h> #include <unistd.h>
@ -224,7 +225,7 @@ public:
* Read until all of the given buffer has been filled. Throws * Read until all of the given buffer has been filled. Throws
* on error. * on error.
*/ */
void FullRead(void *buffer, std::size_t length) const; void FullRead(std::span<std::byte> dest) const;
ssize_t Write(const void *buffer, std::size_t length) const noexcept { ssize_t Write(const void *buffer, std::size_t length) const noexcept {
return ::write(fd, buffer, length); return ::write(fd, buffer, length);
@ -234,7 +235,7 @@ public:
* Write until all of the given buffer has been written. * Write until all of the given buffer has been written.
* Throws on error. * Throws on error.
*/ */
void FullWrite(const void *buffer, std::size_t length) const; void FullWrite(std::span<const std::byte> src) const;
#ifndef _WIN32 #ifndef _WIN32
int Poll(short events, int timeout) const noexcept; int Poll(short events, int timeout) const noexcept;

View File

@ -28,7 +28,7 @@ ReadFrames(FileDescriptor fd, void *_buffer, std::size_t size,
const size_t modulo = nbytes % frame_size; const size_t modulo = nbytes % frame_size;
if (modulo > 0) { if (modulo > 0) {
size_t rest = frame_size - modulo; size_t rest = frame_size - modulo;
fd.FullRead(buffer + nbytes, rest); fd.FullRead({(std::byte *)buffer + nbytes, rest});
nbytes += rest; nbytes += rest;
} }

View File

@ -116,7 +116,7 @@ RunConvert(PcmConvert &convert, size_t in_frame_size,
buffer.Consume(src.size()); buffer.Consume(src.size());
auto output = convert.Convert(src); auto output = convert.Convert(src);
out_fd.FullWrite(output.data(), output.size()); out_fd.FullWrite(output);
} }
while (true) { while (true) {
@ -124,7 +124,7 @@ RunConvert(PcmConvert &convert, size_t in_frame_size,
if (output.data() == nullptr) if (output.data() == nullptr)
break; break;
out_fd.FullWrite(output.data(), output.size()); out_fd.FullWrite(output);
} }
} }

View File

@ -87,14 +87,14 @@ try {
break; break;
auto dest = filter->FilterPCM(std::span{buffer}.first(nbytes)); auto dest = filter->FilterPCM(std::span{buffer}.first(nbytes));
output_fd.FullWrite(dest.data(), dest.size()); output_fd.FullWrite(dest);
} }
while (true) { while (true) {
auto dest = filter->Flush(); auto dest = filter->Flush();
if (dest.data() == nullptr) if (dest.data() == nullptr)
break; break;
output_fd.FullWrite(dest.data(), dest.size()); output_fd.FullWrite(dest);
} }
/* cleanup and exit */ /* cleanup and exit */

View File

@ -170,13 +170,13 @@ dump_input_stream(InputStream &is, FileDescriptor out,
} }
} }
char buffer[MAX_CHUNK_SIZE]; std::byte buffer[MAX_CHUNK_SIZE];
assert(chunk_size <= sizeof(buffer)); assert(chunk_size <= sizeof(buffer));
size_t num_read = is.Read(lock, buffer, chunk_size); size_t num_read = is.Read(lock, buffer, chunk_size);
if (num_read == 0) if (num_read == 0)
break; break;
out.FullWrite(buffer, num_read); out.FullWrite({buffer, num_read});
} }
is.Check(); is.Check();