in Source/Shared/arcana/messaging/router.h [41:76]
void fire(const EventT& evt)
{
GSL_CONTRACT_CHECK("thread affinity", m_affinity.check());
using event = std::decay_t<EventT>;
auto& listeners = std::get<listener_group<event>>(m_listeners);
{
auto guard = std::get<sentry<event>>(m_sentries).take();
for (listener<event>& listener : listeners)
{
if (listener.valid)
{
listener.callback(evt);
}
}
}
// if we're no longer iterating the listeners list in this stack
// remove all the unregistered listeners and add the pending ones
if (!std::get<sentry<event>>(m_sentries).is_active())
{
listeners.erase(std::remove_if(listeners.begin(),
listeners.end(),
[](const listener<event>& l) { return !l.valid; }),
listeners.end());
// move the pending listeners to the real list
// and clear the pending list
auto& pending = std::get<listener_group<event>>(m_pending);
std::move(pending.begin(), pending.end(), std::back_inserter(listeners));
pending.clear();
}
}