0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-09-28 11:48:54 +02:00

ircd::ctx: Optimize asio timer cancel action for ctx::wake().

This commit is contained in:
Jason Volk 2020-02-23 13:24:20 -08:00
parent 8f5b40e9d5
commit ea30ee38f9

View file

@ -281,6 +281,40 @@ catch(const std::exception &e)
return false;
}
// Optimize ctx::wake() by reimplementing the timer cancel's op scheduler to
// enqueue as a defer (private/priority queue) rather than to the post queue.
#if defined(BOOST_ASIO_HAS_EPOLL)
using epoll_time_traits = boost::asio::time_traits<boost::posix_time::ptime>;
template<>
inline std::size_t
boost::asio::detail::epoll_reactor::cancel_timer(timer_queue<epoll_time_traits> &queue,
typename timer_queue<epoll_time_traits>::per_timer_data &t,
std::size_t max)
{
std::size_t ret;
op_queue<operation> ops;
{
const mutex::scoped_lock lock(mutex_);
ret = queue.cancel_timer(t, ops, max);
}
auto *const thread_info
{
static_cast<scheduler_thread_info *>(scheduler::thread_call_stack::top())
};
for(auto *op(ops.front()); op; ops.pop(), op = ops.front())
{
static const bool is_continuation(true);
scheduler_.post_immediate_completion(op, is_continuation);
thread_info->private_outstanding_work -= is_continuation;
}
return ret;
}
#endif
/// Throws if this context has been flagged for interruption and clears
/// the flag.
[[gnu::hot]]