diff options
author | Adam <Adam@anope.org> | 2011-10-10 15:04:23 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2011-10-10 15:04:23 -0400 |
commit | 80f4f317b247ee3756fbc001495310b2f7c4e997 (patch) | |
tree | 3fd6abe3dbabe221e08999462b2b52c0687ec9fe | |
parent | 9f3d735d9d461e0cea042722ac1c6af98fe6560e (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.h | 20 | ||||
-rw-r--r-- | modules/database/db_flatfile.cpp | 21 | ||||
-rw-r--r-- | modules/database/db_sql.cpp | 5 | ||||
-rw-r--r-- | src/base.cpp | 2 | ||||
-rw-r--r-- | src/main.cpp | 1 |
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(); |