[Clam-devel] reloading plugins and static variables...

Natanael Olaiz nolaiz at gmail.com
Thu Aug 7 17:43:03 PDT 2008


The words of the experience.... THANKS DAVID!!!!!! :-D

El 08/07/2008 09:23 PM, David García Garzón escribió:
> Using an static member could lead to problems as there is no guarantee that 
> one static variable is initialized before another one. Best use a static 
> local variable in a function (often a static method in a class):
>
> class X
> {
> 	static string & currentLibrary()
> 	{
> 		static string sCurrentLibrary;
> 		return sCurrentLibrary;
> 	}
> }
>
> C++ guarantees that sCurrentLibrary is initialized the first time you enter 
> the function, but then as the object is static (in the sense of not in stack) 
> when you change the value it is kept for the next call. This way, if any 
> other static initialization calls the function, the object is initialized 
> before using it.
>
> This trick is used in a lot of places in CLAM, mostly Factories and similar 
> objects.
>   

Yes, I saw that, but I just didn't realize about the reference... I 
though that was used only as a method to get the value.


Thanks a lot.

Regards,
Natanael.

> David.
>
>
> On Divendres 08 Agost 2008, Natanael Olaiz wrote:
>   
>> Hi.
>>
>> I'm testing the David suggestions to keep a list of loaded dynamic
>> libraries (i.e. plugins), and the currently loaded.
>> I declared:
>>
>>     public:
>>         static std::string _currentlyLoading;
>>
>> on RunTimeLibraryLoader.hxx. Is initialized on RunTimeLibraryLoader.cxx as:
>>
>>     std::string RunTimeLibraryLoader::_currentlyLoading=std::string();
>>
>> Is used it on virtual RunTimeLibraryLoader::FullyLoadLibrary, which is
>> called from virtual RunTimeLibraryLoader::LoadLibrariesFromPath, which
>> is called from virtual RunTimeLibraryLoader::Load.
>> For ladspa plugins loadings (calling Load() from a derived class) it
>> works OK. But on AutomaticRunTimeProcessingLibraryLoader (which is on
>> RunTimeProcessingLibraryLoader.cxx, instantiates a derived class from
>> RunTimeLibraryLoader as an object, and call the Load() from there) gaves
>> me a segmentation fault, like if the static variable were not defined.
>> Furthermore, trying to access directly
>> RunTimeLibraryLoader::_currentlyLoading (for instance:
>> RunTimeLibraryLoader::_currentlyLoading="testing";) is the same.
>>
>> TraceBack:
>>     #0: std::string::asign       /usr/lib/libstdc++.so.6
>>     #1: std::string::operator=   /usr/lib/libstdc++.so.6
>>     #2: AutomaticRunTimeProcessingLibraryLoader   (the above assignation
>> _currentlyLoading="testing")
>>
>> AutomaticRun..... is instantiated as a static object. Could be that the
>> problem? I tried defining the variable as extern, without luck...
>>
>> This is making me mad... :-/ The linker doesn't says anything when
>> compiling...
>>
>> Any clue?
>>
>>
>> Regards,
>> Natanael.
>>     
>
>
>
>   





More information about the clam-devel mailing list