diff options
-rw-r--r-- | include/cull_list.h | 4 | ||||
-rw-r--r-- | src/cull_list.cpp | 25 |
2 files changed, 18 insertions, 11 deletions
diff --git a/include/cull_list.h b/include/cull_list.h index bd2fb45da..2b3ed1391 100644 --- a/include/cull_list.h +++ b/include/cull_list.h @@ -21,12 +21,12 @@ */ class CoreExport CullList { - std::set<classbase*> list; + std::vector<classbase*> list; public: /** Adds an item to the cull list */ - void AddItem(classbase* item) { list.insert(item); } + void AddItem(classbase* item) { list.push_back(item); } /** Applies the cull list (deletes the contents) */ diff --git a/src/cull_list.cpp b/src/cull_list.cpp index c45dff46c..5715c3147 100644 --- a/src/cull_list.cpp +++ b/src/cull_list.cpp @@ -11,20 +11,27 @@ * --------------------------------------------------- */ -/* $Core */ - #include "inspircd.h" -#include "cull_list.h" +#include <typeinfo> void CullList::Apply() { - std::vector<classbase*> todel(list.begin(), list.end()); - list.clear(); - for(std::vector<classbase*>::iterator i = todel.begin(); i != todel.end(); i++) + std::set<classbase*> gone; + for(unsigned int i=0; i < list.size(); i++) { - classbase* c = *i; - c->cull(); - delete c; + classbase* c = list[i]; + if (gone.insert(c).second) + { + ServerInstance->Logs->Log("CULLLIST", DEBUG, "Deleting %s @%p", typeid(*c).name(), + (void*)c); + c->cull(); + delete c; + } + else + { + ServerInstance->Logs->Log("CULLLIST",DEBUG, "WARNING: Object @%p culled twice!", + (void*)c); + } } } |