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:
+8
-12
@@ -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:
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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
@@ -2,7 +2,7 @@
|
||||
#include "modules.h"
|
||||
|
||||
std::vector<SerializableBase *> serialized_types;
|
||||
std::list<SerializableBase *> serialized_items;
|
||||
std::list<SerializableBase *> *serialized_items;
|
||||
|
||||
void RegisterTypes()
|
||||
{
|
||||
|
||||
@@ -379,7 +379,6 @@ int main(int ac, char **av, char **envp)
|
||||
ModuleManager::UnloadModule(m, NULL);
|
||||
|
||||
ModuleManager::CleanupRuntimeDirectory();
|
||||
serialized_items.clear();
|
||||
|
||||
#ifdef _WIN32
|
||||
OnShutdown();
|
||||
|
||||
Reference in New Issue
Block a user