summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2011-10-10 15:04:23 -0400
committerAdam <Adam@anope.org>2011-10-10 15:04:23 -0400
commit80f4f317b247ee3756fbc001495310b2f7c4e997 (patch)
tree3fd6abe3dbabe221e08999462b2b52c0687ec9fe
parent9f3d735d9d461e0cea042722ac1c6af98fe6560e (diff)
Put serialized_items on the heap to prevent weird crashes on shutdown from the list being destructed before members in it
-rw-r--r--include/serialize.h20
-rw-r--r--modules/database/db_flatfile.cpp21
-rw-r--r--modules/database/db_sql.cpp5
-rw-r--r--src/base.cpp2
-rw-r--r--src/main.cpp1
5 files changed, 24 insertions, 25 deletions
diff --git a/include/serialize.h b/include/serialize.h
index e4c6bce1f..ff818a61b 100644
--- a/include/serialize.h
+++ b/include/serialize.h
@@ -60,7 +60,7 @@ namespace Serialize
class SerializableBase;
extern std::vector<SerializableBase *> serialized_types;
-extern std::list<SerializableBase *> serialized_items;
+extern std::list<SerializableBase *> *serialized_items;
extern void RegisterTypes();
class SerializableBase
@@ -85,11 +85,6 @@ template<typename Type> class Serializable : public SerializableBase
{
}
- ~SerializableAllocator()
- {
- Unregister();
- }
-
void Register(const Anope::string &n, int pos = -1)
{
this->name = n;
@@ -127,20 +122,21 @@ template<typename Type> class Serializable : public SerializableBase
protected:
Serializable()
{
- serialized_items.push_front(this);
- this->s_iter = serialized_items.begin();
+ if (serialized_items == NULL)
+ serialized_items = new std::list<SerializableBase *>();
+ serialized_items->push_front(this);
+ this->s_iter = serialized_items->begin();
}
Serializable(const Serializable &)
{
- serialized_items.push_front(this);
- this->s_iter = serialized_items.begin();
+ serialized_items->push_front(this);
+ this->s_iter = serialized_items->begin();
}
~Serializable()
{
- if (!serialized_items.empty())
- serialized_items.erase(this->s_iter);
+ serialized_items->erase(this->s_iter);
}
public:
diff --git a/modules/database/db_flatfile.cpp b/modules/database/db_flatfile.cpp
index f17ed6fd1..b913b8529 100644
--- a/modules/database/db_flatfile.cpp
+++ b/modules/database/db_flatfile.cpp
@@ -158,16 +158,17 @@ class DBFlatFile : public Module
return EVENT_CONTINUE;
}
- for (std::list<SerializableBase *>::iterator it = serialized_items.begin(), it_end = serialized_items.end(); it != it_end; ++it)
- {
- SerializableBase *base = *it;
- SerializableBase::serialized_data data = base->serialize();
-
- db << "OBJECT " << base->serialize_name() << "\n";
- for (SerializableBase::serialized_data::iterator dit = data.begin(), dit_end = data.end(); dit != dit_end; ++dit)
- db << "DATA " << dit->first << " " << dit->second.astr() << "\n";
- db << "END\n";
- }
+ if (serialized_items != NULL)
+ for (std::list<SerializableBase *>::iterator it = serialized_items->begin(), it_end = serialized_items->end(); it != it_end; ++it)
+ {
+ SerializableBase *base = *it;
+ SerializableBase::serialized_data data = base->serialize();
+
+ db << "OBJECT " << base->serialize_name() << "\n";
+ for (SerializableBase::serialized_data::iterator dit = data.begin(), dit_end = data.end(); dit != dit_end; ++dit)
+ db << "DATA " << dit->first << " " << dit->second.astr() << "\n";
+ db << "END\n";
+ }
db.close();
diff --git a/modules/database/db_sql.cpp b/modules/database/db_sql.cpp
index 43e7cfe6d..d411d8b6d 100644
--- a/modules/database/db_sql.cpp
+++ b/modules/database/db_sql.cpp
@@ -113,8 +113,11 @@ class DBSQL : public Module
return EVENT_CONTINUE;
}
+ if (serialized_items == NULL)
+ return EVENT_CONTINUE;
+
std::map<Anope::string, SerializableBase::serialized_data> table_layout;
- for (std::list<SerializableBase *>::iterator it = serialized_items.begin(), it_end = serialized_items.end(); it != it_end; ++it)
+ for (std::list<SerializableBase *>::iterator it = serialized_items->begin(), it_end = serialized_items->end(); it != it_end; ++it)
{
SerializableBase *base = *it;
SerializableBase::serialized_data data = base->serialize();
diff --git a/src/base.cpp b/src/base.cpp
index 18450ef90..e45e6365c 100644
--- a/src/base.cpp
+++ b/src/base.cpp
@@ -2,7 +2,7 @@
#include "modules.h"
std::vector<SerializableBase *> serialized_types;
-std::list<SerializableBase *> serialized_items;
+std::list<SerializableBase *> *serialized_items;
void RegisterTypes()
{
diff --git a/src/main.cpp b/src/main.cpp
index 4d812a322..279e9792a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -379,7 +379,6 @@ int main(int ac, char **av, char **envp)
ModuleManager::UnloadModule(m, NULL);
ModuleManager::CleanupRuntimeDirectory();
- serialized_items.clear();
#ifdef _WIN32
OnShutdown();