0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-27 07:54:05 +01:00

ircd::fs: Break apart / improve make_iov() related stack / cleanup typedefs.

This commit is contained in:
Jason Volk 2018-12-01 15:33:30 -08:00
parent 2dc36775a8
commit 965ecd16e5
4 changed files with 54 additions and 34 deletions

View file

@ -18,17 +18,23 @@ extern "C"
namespace ircd::fs namespace ircd::fs
{ {
using const_iovec_view = vector_view<const struct ::iovec>;
using iovec_view = vector_view<struct ::iovec>;
using const_buffers = vector_view<const const_buffer>; using const_buffers = vector_view<const const_buffer>;
using mutable_buffers = vector_view<const mutable_buffer>; using mutable_buffers = vector_view<const mutable_buffer>;
// utility; count the total bytes of an iov. // utility; count the total bytes of an iov.
size_t bytes(const vector_view<const struct ::iovec> &); size_t bytes(const const_iovec_view &);
// Transforms our buffers to struct iovec ones.
const_iovec_view make_iov(const iovec_view &, const const_buffers &);
const_iovec_view make_iov(const iovec_view &, const mutable_buffers &);
// Transforms our buffers to struct iovec ones. This is done using an // Transforms our buffers to struct iovec ones. This is done using an
// internal thread_local array of IOV_MAX. The returned view is of that // internal thread_local array of IOV_MAX. The returned view is of that
// array. We get away with using a single buffer because the synchronous // array. We get away with using a single buffer because the synchronous
// readv()/writev() calls block the thread and for AIO the iov is copied out // readv()/writev() calls block the thread and for AIO the iov is copied out
// of userspace on io_submit(). // of userspace on io_submit().
vector_view<const struct ::iovec> make_iov(const const_buffers &); const_iovec_view make_iov(const const_buffers &);
vector_view<const struct ::iovec> make_iov(const mutable_buffers &); const_iovec_view make_iov(const mutable_buffers &);
} }

View file

@ -84,7 +84,7 @@ ircd::fs::aio::fdsync(const fd &fd,
// //
ircd::fs::aio::request::read::read(const int &fd, ircd::fs::aio::request::read::read(const int &fd,
const vector_view<const struct ::iovec> &iov, const const_iovec_view &iov,
const read_opts &opts) const read_opts &opts)
:request{fd} :request{fd}
{ {
@ -129,7 +129,7 @@ ircd::fs::aio::read(const fd &fd,
// //
ircd::fs::aio::request::write::write(const int &fd, ircd::fs::aio::request::write::write(const int &fd,
const vector_view<const struct ::iovec> &iov, const const_iovec_view &iov,
const write_opts &opts) const write_opts &opts)
:request{fd} :request{fd}
{ {
@ -548,7 +548,7 @@ catch(const ctx::terminated &)
throw; throw;
} }
ircd::vector_view<const struct ::iovec> ircd::fs::const_iovec_view
ircd::fs::aio::request::iovec() ircd::fs::aio::request::iovec()
const const
{ {

View file

@ -17,8 +17,8 @@ namespace ircd::fs::aio
struct request; struct request;
void prefetch(const fd &, const size_t &, const read_opts &); void prefetch(const fd &, const size_t &, const read_opts &);
size_t write(const fd &, const vector_view<const const_buffer> &, const write_opts &); size_t write(const fd &, const const_buffers &, const write_opts &);
size_t read(const fd &, const vector_view<const mutable_buffer> &, const read_opts &); size_t read(const fd &, const mutable_buffers &, const read_opts &);
void fdsync(const fd &, const fsync_opts &); void fdsync(const fd &, const fsync_opts &);
void fsync(const fd &, const fsync_opts &); void fsync(const fd &, const fsync_opts &);
} }
@ -74,7 +74,7 @@ struct ircd::fs::aio::request
ssize_t errcode {0}; ssize_t errcode {0};
public: public:
vector_view<const struct ::iovec> iovec() const; const_iovec_view iovec() const;
size_t operator()(); size_t operator()();
void cancel(); void cancel();
@ -87,14 +87,14 @@ struct ircd::fs::aio::request
struct ircd::fs::aio::request::read struct ircd::fs::aio::request::read
:request :request
{ {
read(const int &fd, const vector_view<const struct ::iovec> &, const read_opts &); read(const int &fd, const const_iovec_view &, const read_opts &);
}; };
/// Write request control block /// Write request control block
struct ircd::fs::aio::request::write struct ircd::fs::aio::request::write
:request :request
{ {
write(const int &fd, const vector_view<const struct ::iovec> &, const write_opts &); write(const int &fd, const const_iovec_view &, const write_opts &);
}; };
/// fdsync request control block /// fdsync request control block

View file

@ -1138,58 +1138,72 @@ namespace ircd::fs
thread_local std::array<struct ::iovec, IOV_MAX> _iov_; thread_local std::array<struct ::iovec, IOV_MAX> _iov_;
} }
ircd::vector_view<const struct ::iovec> ircd::fs::const_iovec_view
ircd::fs::make_iov(const mutable_buffers &bufs) ircd::fs::make_iov(const mutable_buffers &bufs)
{ {
if(unlikely(bufs.size() > IOV_MAX)) if(unlikely(bufs.size() > _iov_.size()))
throw error throw error
{ {
make_error_code(std::errc::invalid_argument), make_error_code(std::errc::invalid_argument),
"Buffer count of %zu excheeds IOV_MAX of %zu", "Buffer count of %zu exceeds IOV_MAX of %zu",
bufs.size(), bufs.size(),
IOV_MAX _iov_.size()
}; };
return make_iov(iovec_view(_iov_.data(), _iov_.size()), bufs);
}
ircd::fs::const_iovec_view
ircd::fs::make_iov(const const_buffers &bufs)
{
if(unlikely(bufs.size() > _iov_.size()))
throw error
{
make_error_code(std::errc::invalid_argument),
"Buffer count of %zu exceeds IOV_MAX of %zu",
bufs.size(),
_iov_.size()
};
return make_iov(iovec_view(_iov_.data(), _iov_.size()), bufs);
}
ircd::fs::const_iovec_view
ircd::fs::make_iov(const iovec_view &iov,
const mutable_buffers &bufs)
{
size_t i(0); size_t i(0);
for(; i < bufs.size(); ++i) for(; i < bufs.size() && i < iov.size(); ++i)
_iov_.at(i) = _iov_.at(i) =
{ {
buffer::data(bufs[i]), buffer::size(bufs[i]) buffer::data(bufs[i]), buffer::size(bufs[i])
}; };
return return const_iovec_view
{ {
_iov_.data(), i iov.data(), i
}; };
} }
ircd::vector_view<const struct ::iovec> ircd::fs::const_iovec_view
ircd::fs::make_iov(const const_buffers &bufs) ircd::fs::make_iov(const iovec_view &iov,
const const_buffers &bufs)
{ {
if(unlikely(bufs.size() > IOV_MAX))
throw error
{
make_error_code(std::errc::invalid_argument),
"Buffer count of %zu excheeds IOV_MAX of %zu",
bufs.size(),
IOV_MAX
};
size_t i(0); size_t i(0);
for(; i < bufs.size(); ++i) for(; i < bufs.size() && i < iov.size(); ++i)
_iov_.at(i) = iov.at(i) =
{ {
const_cast<char *>(buffer::data(bufs[i])), buffer::size(bufs[i]) const_cast<char *>(buffer::data(bufs[i])), buffer::size(bufs[i])
}; };
return return const_iovec_view
{ {
_iov_.data(), i iov.data(), i
}; };
} }
size_t size_t
ircd::fs::bytes(const vector_view<const struct ::iovec> &iov) ircd::fs::bytes(const const_iovec_view &iov)
{ {
return std::accumulate(begin(iov), end(iov), size_t(0), [] return std::accumulate(begin(iov), end(iov), size_t(0), []
(auto ret, const auto &iov) (auto ret, const auto &iov)