Allow static initialization of dynamic_reference objects

This commit is contained in:
Daniel De Graaf 2010-03-22 11:33:25 -05:00
parent 3cc56cf2e6
commit 37413602c1
2 changed files with 26 additions and 13 deletions

View File

@ -307,6 +307,7 @@ class CoreExport dynamic_reference_base : public interfacebase
void SetProvider(const std::string& newname);
void lookup();
operator bool();
static void reset_all();
};
template<typename T>
@ -1401,9 +1402,6 @@ class CoreExport ModuleManager
/** List of data services keyed by name */
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.
*/
ModuleManager();

View File

@ -23,6 +23,15 @@
#include <dirent.h>
#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
template<>
@ -350,8 +359,8 @@ void ModuleManager::DoSafeUnload(Module* mod)
if (curr->second->creator == mod)
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 */
ServerInstance->Res->CleanResolvers(mod);
@ -435,8 +444,7 @@ void ModuleManager::DelService(ServiceProvider& item)
if (curr->second == &item)
DataProviders.erase(curr);
}
for(unsigned int i = 0; i < ServerInstance->Modules->ActiveDynrefs.size(); i++)
ServerInstance->Modules->ActiveDynrefs[i]->ClearCache();
dynamic_reference_base::reset_all();
return;
}
default:
@ -467,19 +475,26 @@ ServiceProvider* ModuleManager::FindService(ServiceType type, const std::string&
dynamic_reference_base::dynamic_reference_base(const std::string& Name)
: 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()
{
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)
ServerInstance->Modules->ActiveDynrefs[i] = ServerInstance->Modules->ActiveDynrefs[last];
ServerInstance->Modules->ActiveDynrefs.erase(ServerInstance->Modules->ActiveDynrefs.begin() + last);
dynrefs->at(i) = dynrefs->at(last);
dynrefs->erase(dynrefs->begin() + last);
if (dynrefs->empty())
{
delete dynrefs;
dynrefs = NULL;
}
return;
}
}