From 523bf19f302b9555bfa8d52ea02c193152b335e0 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 26 Apr 2018 15:17:28 -0700 Subject: [PATCH] ircd::m::hook: Add a set to track all hooks for a site. --- include/ircd/m/hook.h | 1 + ircd/m/m.cc | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/include/ircd/m/hook.h b/include/ircd/m/hook.h index d4094347c..a3cc0deed 100644 --- a/include/ircd/m/hook.h +++ b/include/ircd/m/hook.h @@ -60,6 +60,7 @@ struct ircd::m::hook::site std::multimap sender; std::multimap state_key; std::multimap type; + std::set hooks; friend class hook; bool add(hook &); diff --git a/ircd/m/m.cc b/ircd/m/m.cc index a232f2c38..21b7c4fdc 100644 --- a/ircd/m/m.cc +++ b/ircd/m/m.cc @@ -2540,6 +2540,16 @@ catch(const std::exception &e) bool ircd::m::hook::site::add(hook &hook) { + if(!hooks.emplace(&hook).second) + { + log::warning + { + "Hook %p already registered to site %s", &hook, name() + }; + + return false; + } + if(json::get<"origin"_>(hook.matching)) origin.emplace(at<"origin"_>(hook.matching), &hook); @@ -2589,6 +2599,12 @@ ircd::m::hook::site::del(hook &hook) if(json::get<"type"_>(hook.matching)) unmap(type, at<"type"_>(hook.matching)); + const auto erased + { + hooks.erase(&hook) + }; + + assert(erased); --count; return true; }