1
0
mirror of https://github.com/anope/anope.git synced 2026-06-30 05:36:38 +02:00

Put serialized_items on the heap to prevent weird crashes on shutdown from the list being destructed before members in it

This commit is contained in:
Adam
2011-10-10 15:04:23 -04:00
parent 9f3d735d9d
commit 80f4f317b2
5 changed files with 24 additions and 25 deletions
+8 -12
View File
@@ -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:
+11 -10
View File
@@ -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();
+4 -1
View File
@@ -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();
+1 -1
View File
@@ -2,7 +2,7 @@
#include "modules.h"
std::vector<SerializableBase *> serialized_types;
std::list<SerializableBase *> serialized_items;
std::list<SerializableBase *> *serialized_items;
void RegisterTypes()
{
-1
View File
@@ -379,7 +379,6 @@ int main(int ac, char **av, char **envp)
ModuleManager::UnloadModule(m, NULL);
ModuleManager::CleanupRuntimeDirectory();
serialized_items.clear();
#ifdef _WIN32
OnShutdown();