mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-12 03:59:03 -04:00
Allow static initialization of dynamic_reference objects
This commit is contained in:
parent
3cc56cf2e6
commit
37413602c1
@ -307,6 +307,7 @@ class CoreExport dynamic_reference_base : public interfacebase
|
|||||||
void SetProvider(const std::string& newname);
|
void SetProvider(const std::string& newname);
|
||||||
void lookup();
|
void lookup();
|
||||||
operator bool();
|
operator bool();
|
||||||
|
static void reset_all();
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -1401,9 +1402,6 @@ class CoreExport ModuleManager
|
|||||||
/** List of data services keyed by name */
|
/** List of data services keyed by name */
|
||||||
std::multimap<std::string, ServiceProvider*> DataProviders;
|
std::multimap<std::string, ServiceProvider*> DataProviders;
|
||||||
|
|
||||||
/** List of all dynamic references that are currently active */
|
|
||||||
std::vector<dynamic_reference_base*> ActiveDynrefs;
|
|
||||||
|
|
||||||
/** Simple, bog-standard, boring constructor.
|
/** Simple, bog-standard, boring constructor.
|
||||||
*/
|
*/
|
||||||
ModuleManager();
|
ModuleManager();
|
||||||
|
@ -23,6 +23,15 @@
|
|||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static std::vector<dynamic_reference_base*>* dynrefs = NULL;
|
||||||
|
|
||||||
|
void dynamic_reference_base::reset_all()
|
||||||
|
{
|
||||||
|
if (!dynrefs)
|
||||||
|
return;
|
||||||
|
for(unsigned int i = 0; i < dynrefs->size(); i++)
|
||||||
|
(*dynrefs)[i]->ClearCache();
|
||||||
|
}
|
||||||
|
|
||||||
// Version is a simple class for holding a modules version number
|
// Version is a simple class for holding a modules version number
|
||||||
template<>
|
template<>
|
||||||
@ -350,8 +359,8 @@ void ModuleManager::DoSafeUnload(Module* mod)
|
|||||||
if (curr->second->creator == mod)
|
if (curr->second->creator == mod)
|
||||||
DataProviders.erase(curr);
|
DataProviders.erase(curr);
|
||||||
}
|
}
|
||||||
for(unsigned int i = 0; i < ServerInstance->Modules->ActiveDynrefs.size(); i++)
|
|
||||||
ServerInstance->Modules->ActiveDynrefs[i]->ClearCache();
|
dynamic_reference_base::reset_all();
|
||||||
|
|
||||||
/* Tidy up any dangling resolvers */
|
/* Tidy up any dangling resolvers */
|
||||||
ServerInstance->Res->CleanResolvers(mod);
|
ServerInstance->Res->CleanResolvers(mod);
|
||||||
@ -435,8 +444,7 @@ void ModuleManager::DelService(ServiceProvider& item)
|
|||||||
if (curr->second == &item)
|
if (curr->second == &item)
|
||||||
DataProviders.erase(curr);
|
DataProviders.erase(curr);
|
||||||
}
|
}
|
||||||
for(unsigned int i = 0; i < ServerInstance->Modules->ActiveDynrefs.size(); i++)
|
dynamic_reference_base::reset_all();
|
||||||
ServerInstance->Modules->ActiveDynrefs[i]->ClearCache();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -467,19 +475,26 @@ ServiceProvider* ModuleManager::FindService(ServiceType type, const std::string&
|
|||||||
dynamic_reference_base::dynamic_reference_base(const std::string& Name)
|
dynamic_reference_base::dynamic_reference_base(const std::string& Name)
|
||||||
: name(Name), value(NULL)
|
: name(Name), value(NULL)
|
||||||
{
|
{
|
||||||
ServerInstance->Modules->ActiveDynrefs.push_back(this);
|
if (!dynrefs)
|
||||||
|
dynrefs = new std::vector<dynamic_reference_base*>;
|
||||||
|
dynrefs->push_back(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
dynamic_reference_base::~dynamic_reference_base()
|
dynamic_reference_base::~dynamic_reference_base()
|
||||||
{
|
{
|
||||||
for(unsigned int i = 0; i < ServerInstance->Modules->ActiveDynrefs.size(); i++)
|
for(unsigned int i = 0; i < dynrefs->size(); i++)
|
||||||
{
|
{
|
||||||
if (ServerInstance->Modules->ActiveDynrefs[i] == this)
|
if (dynrefs->at(i) == this)
|
||||||
{
|
{
|
||||||
unsigned int last = ServerInstance->Modules->ActiveDynrefs.size() - 1;
|
unsigned int last = dynrefs->size() - 1;
|
||||||
if (i != last)
|
if (i != last)
|
||||||
ServerInstance->Modules->ActiveDynrefs[i] = ServerInstance->Modules->ActiveDynrefs[last];
|
dynrefs->at(i) = dynrefs->at(last);
|
||||||
ServerInstance->Modules->ActiveDynrefs.erase(ServerInstance->Modules->ActiveDynrefs.begin() + last);
|
dynrefs->erase(dynrefs->begin() + last);
|
||||||
|
if (dynrefs->empty())
|
||||||
|
{
|
||||||
|
delete dynrefs;
|
||||||
|
dynrefs = NULL;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user