make AsyncEvent resumption faster
This commit is contained in:
+5
-2
@@ -13,15 +13,18 @@ AsyncEvent::AsyncEvent(asio::any_io_executor ex)
|
|||||||
: executor(ex), is_set(false) {}
|
: executor(ex), is_set(false) {}
|
||||||
|
|
||||||
void AsyncEvent::set() {
|
void AsyncEvent::set() {
|
||||||
|
std::vector<std::unique_ptr<asio::detail::awaitable_handler<asio::any_io_executor>>> waiters_to_resume;
|
||||||
|
{
|
||||||
lock_guard g(this->lock);
|
lock_guard g(this->lock);
|
||||||
this->is_set = true;
|
this->is_set = true;
|
||||||
for (auto& waiter : this->waiters) {
|
this->waiters.swap(waiters_to_resume);
|
||||||
|
}
|
||||||
|
for (auto& waiter : waiters_to_resume) {
|
||||||
asio::post(this->executor,
|
asio::post(this->executor,
|
||||||
[handler = std::move(waiter)]() mutable {
|
[handler = std::move(waiter)]() mutable {
|
||||||
(*handler)();
|
(*handler)();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
this->waiters.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AsyncEvent::clear() {
|
void AsyncEvent::clear() {
|
||||||
|
|||||||
Reference in New Issue
Block a user