|  | Segfault in .so file. |  | |
| | | german diago |  |
| Posted: Thu Aug 07, 2008 11:05 am Post subject: Segfault in .so file. |  |
| |  | |
Hello. I'm trying to implement a plugin system and I have this code:
//myplugin.cpp #include "Plugin.hpp"
namespace mp {
class MyPlugin : public Plugin { ...} }
REGISTER_PLUGIN("MyPlugin", MyPlugin, mp);
//Plugin.hpp class PluginsManager : public Singleton<PluginsManager> { private: map<string, function<shared_ptr<Plugin> > factory_;
public: bool registerPlugin(const string id, function<shared_ptr<Plugin> > factoryfunc) { //Segfaults because of this (I think) factory_[id] = factoryfunc; return true; } }
#define REGISTER_PLUGIN(id, plugtype, ns) shared_ptr<Plugin> create##ns##plugtype { return\ shared_ptr<Plugin>(new plugtype); }\ const static bool registered##ns##plugtype = PluginsManager()::instance().registerPlugin(id,\ &create##ns##plugtype)
int main() { //OK, Loads the .so file associated with myplugin and the code from REGISTER_PLUGIN is inmediatly //executed. When the code is executed, it segfaults. PluginsManager::instance().init(); }
My plugin system inits the PluginsManager, which uses a singleton which can be used as a shared library. I think the segfault takes place when accessing factory_[id] = factoryfunc. If I put these statements (which are nonsense):
factory_[id]; factoryfunc;
in registerPlugin, it does not segfault. I used the debugger and the segfault takes place inside an atomic operation coded in assembly for shared_ptr, I think. Anyone can help how to avoid this segfault. The boost version is 1.35, and the compiler, the one who comes with Ubuntu 8.04 (I think it is gcc 4.2.1). Thanks for your time.
-- [ See LINK for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
| |
| | | Oncaphillis |  |
| Posted: Thu Aug 07, 2008 3:58 pm Post subject: Re: Segfault in .so file. |  |
| |  | |
german diago wrote:
[...]
| Quote: | namespace mp {
class MyPlugin : public Plugin { ...} }
REGISTER_PLUGIN("MyPlugin", MyPlugin, mp);
//Plugin.hpp class PluginsManager : public Singleton<PluginsManager { private: map<string, function<shared_ptr<Plugin> > factory_;
public: bool registerPlugin(const string id, function<shared_ptr<Plugin factoryfunc) { //Segfaults because of this (I think) factory_[id] = factoryfunc; return true; } }
#define REGISTER_PLUGIN(id, plugtype, ns) shared_ptr<Plugin create##ns##plugtype { return\ shared_ptr<Plugin>(new plugtype); }\ const static bool registered##ns##plugtype = PluginsManager()::instance().registerPlugin(id,\ &create##ns##plugtype)
int main() { //OK, Loads the .so file associated with myplugin and the code from REGISTER_PLUGIN is inmediatly //executed. When the code is executed, it segfaults. PluginsManager::instance().init(); }
My plugin system inits the PluginsManager, which uses a singleton which can be used as a shared library. I think the segfault takes place when accessing factory_[id] = factoryfunc. If I put these statements (which are nonsense):
|
Hi,
The least to say is that you're spiraling towards a high degree of obfuscation. Your first plugin design simply initialized a the map[id] with a pointer to the plugin object. Now you want to initialize the map entry with a boost::function<...> returning a boost::shared_ptr< Plugin *>. And all of this is declared within a macro where you kind of "mixin" the namespace.
I had a hard time following that.
Anyway this:
<snip> bool registerPlugin(const string id, function<shared_ptr<Plugin> > factoryfunc) </snip>
smells kind of fishy. Statements like function< shared_ptr<XX> > f; do not even compile under my boost 1.34.1 the function<> template needs a full signature I guess like:
<snip> function< shared_ptr<XX> () > f; </snip>
May be it defaults to "no argument" under 1.35
O.
-- [ See LINK for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
| |
| | | german diago |  |
| Posted: Sun Aug 10, 2008 7:13 pm Post subject: Re: Segfault in .so file. |  |
| Quote: | snip function< shared_ptr<XX> () > f; /snip
May be it defaults to "no argument" under 1.35
|
Sorry, it was an error. I meant (and I did) what you're telling me.
The problem seems to be something related to shared_ptr. It segfaults in an atomic operation.
-- [ See LINK for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
| |
|
|