summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2009-09-30 16:28:43 +0000
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2009-09-30 16:28:43 +0000
commit5fd6471070ecf0f9a0074714c57211e922257014 (patch)
tree0fe57ecdcbc4f15ce5ccc1f53f37424020d50ce1
parente279597c0b166d627bff09ecc8f1fcd28a631660 (diff)
Detect, complain, and don't crash when objects are inserted into cull list twice
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11782 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--include/cull_list.h4
-rw-r--r--src/cull_list.cpp25
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);
+ }
}
}