From Michael Gronager, with updates from Robert Osfield, to add support

for Registry::closeAllLibrary and forced Registry destruction via
Registry::instance(true).
This commit is contained in:
Robert Osfield 2003-12-13 16:36:29 +00:00
parent 1025643170
commit 0cbe10d399
3 changed files with 19 additions and 9 deletions

View File

@ -67,7 +67,7 @@ class OSGDB_EXPORT Registry : public osg::Referenced
{ {
public: public:
static Registry* instance(); static Registry* instance(bool erase = false);
/** read the command line arguments.*/ /** read the command line arguments.*/
void readCommandLine(osg::ArgumentParser& commandLine); void readCommandLine(osg::ArgumentParser& commandLine);
@ -98,6 +98,8 @@ class OSGDB_EXPORT Registry : public osg::Referenced
bool loadLibrary(const std::string& fileName); bool loadLibrary(const std::string& fileName);
/** close the attached library with specified name.*/ /** close the attached library with specified name.*/
bool closeLibrary(const std::string& fileName); bool closeLibrary(const std::string& fileName);
/** close all libraries.*/
void closeAllLibraries();
/** get a reader writer which handles specified extension.*/ /** get a reader writer which handles specified extension.*/
ReaderWriter* getReaderWriterForExtension(const std::string& ext); ReaderWriter* getReaderWriterForExtension(const std::string& ext);

View File

@ -41,12 +41,14 @@ DynamicLibrary::DynamicLibrary(const std::string& name,HANDLE handle)
{ {
_name = name; _name = name;
_handle = handle; _handle = handle;
osg::notify(osg::INFO)<<"Opened DynamicLibrary "<<_name<<std::endl;
} }
DynamicLibrary::~DynamicLibrary() DynamicLibrary::~DynamicLibrary()
{ {
if (_handle) if (_handle)
{ {
osg::notify(osg::INFO)<<"Closing DynamicLibrary "<<_name<<std::endl;
#if defined(WIN32) && !defined(__CYGWIN__) #if defined(WIN32) && !defined(__CYGWIN__)
FreeLibrary((HMODULE)_handle); FreeLibrary((HMODULE)_handle);
#elif defined(__DARWIN_OSX__) #elif defined(__DARWIN_OSX__)

View File

@ -116,10 +116,15 @@ void PrintFilePathList(std::ostream& stream,const FilePathList& filepath)
} }
} }
Registry* Registry::instance() Registry* Registry::instance(bool erase)
{ {
static ref_ptr<Registry> s_nodeFactory = new Registry; static ref_ptr<Registry> s_nodeFactory = new Registry;
return s_nodeFactory.get(); if (erase)
{
s_nodeFactory->closeAllLibraries();
s_nodeFactory = 0;
}
return s_nodeFactory.get(); // will return NULL on erase
} }
@ -192,6 +197,7 @@ Registry::Registry()
Registry::~Registry() Registry::~Registry()
{ {
closeAllLibraries();
} }
#ifndef WIN32 #ifndef WIN32
@ -354,8 +360,6 @@ void Registry::addDotOsgWrapper(DotOsgWrapper* wrapper)
{ {
if (wrapper==0L) return; if (wrapper==0L) return;
if (_openingLibrary) notify(INFO) << "Opening Library : "<< std::endl;
//notify(INFO) << "osg::Registry::addDotOsgWrapper("<<wrapper->getName()<<")"<< std::endl; //notify(INFO) << "osg::Registry::addDotOsgWrapper("<<wrapper->getName()<<")"<< std::endl;
const DotOsgWrapper::Associates& assoc = wrapper->getAssociates(); const DotOsgWrapper::Associates& assoc = wrapper->getAssociates();
@ -442,8 +446,6 @@ void Registry::addReaderWriter(ReaderWriter* rw)
{ {
if (rw==0L) return; if (rw==0L) return;
// if (_openingLibrary) notify(INFO) << "Opening Library : "<< std::endl;
// notify(INFO) << "osg::Registry::addReaderWriter("<<rw->className()<<")"<< std::endl; // notify(INFO) << "osg::Registry::addReaderWriter("<<rw->className()<<")"<< std::endl;
_rwList.push_back(rw); _rwList.push_back(rw);
@ -563,6 +565,10 @@ bool Registry::closeLibrary(const std::string& fileName)
return false; return false;
} }
void Registry::closeAllLibraries()
{
_dlList.clear();
}
Registry::DynamicLibraryList::iterator Registry::getLibraryItr(const std::string& fileName) Registry::DynamicLibraryList::iterator Registry::getLibraryItr(const std::string& fileName)
{ {