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 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();

View File

@ -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;
} }
} }