mirror of
https://github.com/matrix-construct/construct
synced 2024-11-29 02:02:38 +01:00
ircd::net::socket: Deinline the read/write member template suites.
This commit is contained in:
parent
e2136a3157
commit
4aef8cfdf8
2 changed files with 245 additions and 245 deletions
|
@ -129,248 +129,3 @@ ircd::net::socket::operator()(args&&... a)
|
||||||
{
|
{
|
||||||
return this->wait(std::forward<args>(a)...);
|
return this->wait(std::forward<args>(a)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Yields ircd::ctx until buffers are full.
|
|
||||||
template<class iov>
|
|
||||||
size_t
|
|
||||||
ircd::net::socket::read_all(iov&& bufs)
|
|
||||||
try
|
|
||||||
{
|
|
||||||
static const auto completion
|
|
||||||
{
|
|
||||||
asio::transfer_all()
|
|
||||||
};
|
|
||||||
|
|
||||||
const auto interruption{[this]
|
|
||||||
(ctx::ctx *const &)
|
|
||||||
{
|
|
||||||
this->cancel();
|
|
||||||
}};
|
|
||||||
|
|
||||||
size_t ret; continuation
|
|
||||||
{
|
|
||||||
continuation::asio_predicate, interruption, [this, &ret, &bufs]
|
|
||||||
(auto &yield)
|
|
||||||
{
|
|
||||||
ret = asio::async_read(ssl, std::forward<iov>(bufs), completion, yield);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!ret)
|
|
||||||
throw std::system_error
|
|
||||||
{
|
|
||||||
boost::asio::error::eof, boost::asio::error::get_misc_category()
|
|
||||||
};
|
|
||||||
|
|
||||||
in.bytes += ret;
|
|
||||||
++in.calls;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
catch(const boost::system::system_error &e)
|
|
||||||
{
|
|
||||||
throw_system_error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Yields ircd::ctx until remote has sent at least some data.
|
|
||||||
template<class iov>
|
|
||||||
size_t
|
|
||||||
ircd::net::socket::read_few(iov&& bufs)
|
|
||||||
try
|
|
||||||
{
|
|
||||||
const auto interruption{[this]
|
|
||||||
(ctx::ctx *const &)
|
|
||||||
{
|
|
||||||
this->cancel();
|
|
||||||
}};
|
|
||||||
|
|
||||||
size_t ret; continuation
|
|
||||||
{
|
|
||||||
continuation::asio_predicate, interruption, [this, &ret, &bufs]
|
|
||||||
(auto &yield)
|
|
||||||
{
|
|
||||||
ret = ssl.async_read_some(std::forward<iov>(bufs), yield);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!ret)
|
|
||||||
throw std::system_error
|
|
||||||
{
|
|
||||||
asio::error::eof, asio::error::get_misc_category()
|
|
||||||
};
|
|
||||||
|
|
||||||
in.bytes += ret;
|
|
||||||
++in.calls;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
catch(const boost::system::system_error &e)
|
|
||||||
{
|
|
||||||
throw_system_error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Non-blocking; as much as possible without blocking
|
|
||||||
template<class iov>
|
|
||||||
size_t
|
|
||||||
ircd::net::socket::read_any(iov&& bufs)
|
|
||||||
{
|
|
||||||
assert(!blocking(*this));
|
|
||||||
static const auto completion
|
|
||||||
{
|
|
||||||
asio::transfer_all()
|
|
||||||
};
|
|
||||||
|
|
||||||
boost::system::error_code ec;
|
|
||||||
const size_t ret
|
|
||||||
{
|
|
||||||
asio::read(ssl, std::forward<iov>(bufs), completion, ec)
|
|
||||||
};
|
|
||||||
|
|
||||||
in.bytes += ret;
|
|
||||||
++in.calls;
|
|
||||||
|
|
||||||
if(likely(!ec))
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if(ec == boost::system::errc::resource_unavailable_try_again)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
throw_system_error(ec);
|
|
||||||
__builtin_unreachable();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Non-blocking; One system call only; never throws eof;
|
|
||||||
template<class iov>
|
|
||||||
size_t
|
|
||||||
ircd::net::socket::read_one(iov&& bufs)
|
|
||||||
{
|
|
||||||
assert(!blocking(*this));
|
|
||||||
|
|
||||||
boost::system::error_code ec;
|
|
||||||
const size_t ret
|
|
||||||
{
|
|
||||||
ssl.read_some(std::forward<iov>(bufs), ec)
|
|
||||||
};
|
|
||||||
|
|
||||||
in.bytes += ret;
|
|
||||||
++in.calls;
|
|
||||||
|
|
||||||
if(likely(!ec))
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if(ec == boost::system::errc::resource_unavailable_try_again)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
throw_system_error(ec);
|
|
||||||
__builtin_unreachable();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Yields ircd::ctx until all buffers are sent.
|
|
||||||
template<class iov>
|
|
||||||
size_t
|
|
||||||
ircd::net::socket::write_all(iov&& bufs)
|
|
||||||
try
|
|
||||||
{
|
|
||||||
static const auto completion
|
|
||||||
{
|
|
||||||
asio::transfer_all()
|
|
||||||
};
|
|
||||||
|
|
||||||
const auto interruption{[this]
|
|
||||||
(ctx::ctx *const &)
|
|
||||||
{
|
|
||||||
this->cancel();
|
|
||||||
}};
|
|
||||||
|
|
||||||
size_t ret; continuation
|
|
||||||
{
|
|
||||||
continuation::asio_predicate, interruption, [this, &ret, &bufs]
|
|
||||||
(auto &yield)
|
|
||||||
{
|
|
||||||
ret = asio::async_write(ssl, std::forward<iov>(bufs), completion, yield);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
out.bytes += ret;
|
|
||||||
++out.calls;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
catch(const boost::system::system_error &e)
|
|
||||||
{
|
|
||||||
throw_system_error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Yields ircd::ctx until one or more bytes are sent.
|
|
||||||
template<class iov>
|
|
||||||
size_t
|
|
||||||
ircd::net::socket::write_few(iov&& bufs)
|
|
||||||
try
|
|
||||||
{
|
|
||||||
const auto interruption{[this]
|
|
||||||
(ctx::ctx *const &)
|
|
||||||
{
|
|
||||||
this->cancel();
|
|
||||||
}};
|
|
||||||
|
|
||||||
size_t ret; continuation
|
|
||||||
{
|
|
||||||
continuation::asio_predicate, interruption, [this, &ret, &bufs]
|
|
||||||
(auto &yield)
|
|
||||||
{
|
|
||||||
ret = ssl.async_write_some(std::forward<iov>(bufs), yield);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
out.bytes += ret;
|
|
||||||
++out.calls;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
catch(const boost::system::system_error &e)
|
|
||||||
{
|
|
||||||
throw_system_error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Non-blocking; writes as much as possible without blocking
|
|
||||||
template<class iov>
|
|
||||||
size_t
|
|
||||||
ircd::net::socket::write_any(iov&& bufs)
|
|
||||||
try
|
|
||||||
{
|
|
||||||
static const auto completion
|
|
||||||
{
|
|
||||||
asio::transfer_all()
|
|
||||||
};
|
|
||||||
|
|
||||||
assert(!blocking(*this));
|
|
||||||
const size_t ret
|
|
||||||
{
|
|
||||||
asio::write(ssl, std::forward<iov>(bufs), completion)
|
|
||||||
};
|
|
||||||
|
|
||||||
out.bytes += ret;
|
|
||||||
++out.calls;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
catch(const boost::system::system_error &e)
|
|
||||||
{
|
|
||||||
throw_system_error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Non-blocking; Writes one "unit" of data or less; never more.
|
|
||||||
template<class iov>
|
|
||||||
size_t
|
|
||||||
ircd::net::socket::write_one(iov&& bufs)
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assert(!blocking(*this));
|
|
||||||
const size_t ret
|
|
||||||
{
|
|
||||||
ssl.write_some(std::forward<iov>(bufs))
|
|
||||||
};
|
|
||||||
|
|
||||||
out.bytes += ret;
|
|
||||||
++out.calls;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
catch(const boost::system::system_error &e)
|
|
||||||
{
|
|
||||||
throw_system_error(e);
|
|
||||||
}
|
|
||||||
|
|
245
ircd/net.cc
245
ircd/net.cc
|
@ -2929,6 +2929,251 @@ noexcept
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Yields ircd::ctx until buffers are full.
|
||||||
|
template<class iov>
|
||||||
|
size_t
|
||||||
|
ircd::net::socket::read_all(iov&& bufs)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
static const auto completion
|
||||||
|
{
|
||||||
|
asio::transfer_all()
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto interruption{[this]
|
||||||
|
(ctx::ctx *const &)
|
||||||
|
{
|
||||||
|
this->cancel();
|
||||||
|
}};
|
||||||
|
|
||||||
|
size_t ret; continuation
|
||||||
|
{
|
||||||
|
continuation::asio_predicate, interruption, [this, &ret, &bufs]
|
||||||
|
(auto &yield)
|
||||||
|
{
|
||||||
|
ret = asio::async_read(ssl, std::forward<iov>(bufs), completion, yield);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if(!ret)
|
||||||
|
throw std::system_error
|
||||||
|
{
|
||||||
|
boost::asio::error::eof, boost::asio::error::get_misc_category()
|
||||||
|
};
|
||||||
|
|
||||||
|
in.bytes += ret;
|
||||||
|
++in.calls;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
catch(const boost::system::system_error &e)
|
||||||
|
{
|
||||||
|
throw_system_error(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Yields ircd::ctx until remote has sent at least some data.
|
||||||
|
template<class iov>
|
||||||
|
size_t
|
||||||
|
ircd::net::socket::read_few(iov&& bufs)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const auto interruption{[this]
|
||||||
|
(ctx::ctx *const &)
|
||||||
|
{
|
||||||
|
this->cancel();
|
||||||
|
}};
|
||||||
|
|
||||||
|
size_t ret; continuation
|
||||||
|
{
|
||||||
|
continuation::asio_predicate, interruption, [this, &ret, &bufs]
|
||||||
|
(auto &yield)
|
||||||
|
{
|
||||||
|
ret = ssl.async_read_some(std::forward<iov>(bufs), yield);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if(!ret)
|
||||||
|
throw std::system_error
|
||||||
|
{
|
||||||
|
asio::error::eof, asio::error::get_misc_category()
|
||||||
|
};
|
||||||
|
|
||||||
|
in.bytes += ret;
|
||||||
|
++in.calls;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
catch(const boost::system::system_error &e)
|
||||||
|
{
|
||||||
|
throw_system_error(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Non-blocking; as much as possible without blocking
|
||||||
|
template<class iov>
|
||||||
|
size_t
|
||||||
|
ircd::net::socket::read_any(iov&& bufs)
|
||||||
|
{
|
||||||
|
assert(!blocking(*this));
|
||||||
|
static const auto completion
|
||||||
|
{
|
||||||
|
asio::transfer_all()
|
||||||
|
};
|
||||||
|
|
||||||
|
boost::system::error_code ec;
|
||||||
|
const size_t ret
|
||||||
|
{
|
||||||
|
asio::read(ssl, std::forward<iov>(bufs), completion, ec)
|
||||||
|
};
|
||||||
|
|
||||||
|
in.bytes += ret;
|
||||||
|
++in.calls;
|
||||||
|
|
||||||
|
if(likely(!ec))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if(ec == boost::system::errc::resource_unavailable_try_again)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
throw_system_error(ec);
|
||||||
|
__builtin_unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Non-blocking; One system call only; never throws eof;
|
||||||
|
template<class iov>
|
||||||
|
size_t
|
||||||
|
ircd::net::socket::read_one(iov&& bufs)
|
||||||
|
{
|
||||||
|
assert(!blocking(*this));
|
||||||
|
|
||||||
|
boost::system::error_code ec;
|
||||||
|
const size_t ret
|
||||||
|
{
|
||||||
|
ssl.read_some(std::forward<iov>(bufs), ec)
|
||||||
|
};
|
||||||
|
|
||||||
|
in.bytes += ret;
|
||||||
|
++in.calls;
|
||||||
|
|
||||||
|
if(likely(!ec))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if(ec == boost::system::errc::resource_unavailable_try_again)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
throw_system_error(ec);
|
||||||
|
__builtin_unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Yields ircd::ctx until all buffers are sent.
|
||||||
|
template<class iov>
|
||||||
|
size_t
|
||||||
|
ircd::net::socket::write_all(iov&& bufs)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
static const auto completion
|
||||||
|
{
|
||||||
|
asio::transfer_all()
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto interruption{[this]
|
||||||
|
(ctx::ctx *const &)
|
||||||
|
{
|
||||||
|
this->cancel();
|
||||||
|
}};
|
||||||
|
|
||||||
|
size_t ret; continuation
|
||||||
|
{
|
||||||
|
continuation::asio_predicate, interruption, [this, &ret, &bufs]
|
||||||
|
(auto &yield)
|
||||||
|
{
|
||||||
|
ret = asio::async_write(ssl, std::forward<iov>(bufs), completion, yield);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
out.bytes += ret;
|
||||||
|
++out.calls;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
catch(const boost::system::system_error &e)
|
||||||
|
{
|
||||||
|
throw_system_error(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Yields ircd::ctx until one or more bytes are sent.
|
||||||
|
template<class iov>
|
||||||
|
size_t
|
||||||
|
ircd::net::socket::write_few(iov&& bufs)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const auto interruption{[this]
|
||||||
|
(ctx::ctx *const &)
|
||||||
|
{
|
||||||
|
this->cancel();
|
||||||
|
}};
|
||||||
|
|
||||||
|
size_t ret; continuation
|
||||||
|
{
|
||||||
|
continuation::asio_predicate, interruption, [this, &ret, &bufs]
|
||||||
|
(auto &yield)
|
||||||
|
{
|
||||||
|
ret = ssl.async_write_some(std::forward<iov>(bufs), yield);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
out.bytes += ret;
|
||||||
|
++out.calls;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
catch(const boost::system::system_error &e)
|
||||||
|
{
|
||||||
|
throw_system_error(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Non-blocking; writes as much as possible without blocking
|
||||||
|
template<class iov>
|
||||||
|
size_t
|
||||||
|
ircd::net::socket::write_any(iov&& bufs)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
static const auto completion
|
||||||
|
{
|
||||||
|
asio::transfer_all()
|
||||||
|
};
|
||||||
|
|
||||||
|
assert(!blocking(*this));
|
||||||
|
const size_t ret
|
||||||
|
{
|
||||||
|
asio::write(ssl, std::forward<iov>(bufs), completion)
|
||||||
|
};
|
||||||
|
|
||||||
|
out.bytes += ret;
|
||||||
|
++out.calls;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
catch(const boost::system::system_error &e)
|
||||||
|
{
|
||||||
|
throw_system_error(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Non-blocking; Writes one "unit" of data or less; never more.
|
||||||
|
template<class iov>
|
||||||
|
size_t
|
||||||
|
ircd::net::socket::write_one(iov&& bufs)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
assert(!blocking(*this));
|
||||||
|
const size_t ret
|
||||||
|
{
|
||||||
|
ssl.write_some(std::forward<iov>(bufs))
|
||||||
|
};
|
||||||
|
|
||||||
|
out.bytes += ret;
|
||||||
|
++out.calls;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
catch(const boost::system::system_error &e)
|
||||||
|
{
|
||||||
|
throw_system_error(e);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ircd::net::socket::handle_ready(const std::weak_ptr<socket> wp,
|
ircd::net::socket::handle_ready(const std::weak_ptr<socket> wp,
|
||||||
const net::ready type,
|
const net::ready type,
|
||||||
|
|
Loading…
Reference in a new issue