![]() |
|
|
Welcome to the { mindfrost82.com } forums. You are currently viewing our boards as a guest which gives you limited access to view most discussions and access our other features. By joining our free community you will have access to post topics, communicate privately with other members (PM), respond to polls, upload content and access many other special features. Registration is fast, simple and absolutely free so please, join our community today! If you have any problems with the registration process or your account login, please contact contact us. |
|
|||||||
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
|
|||
|
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 http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
|
|||
|
Re: Segfault in .so file.
german diago wrote:
[...] > 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 http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
|
|||
|
Re: Segfault in .so file.
> <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 http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
|
|||
|
Re: Segfault in .so file.
german diago wrote:
> >> <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. > Then I'd really recommend that you post a minimal version of your program which actually *compiles* and shows the misbehavior you describe. O. -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
![]() |
|
| Thread Tools | Search this Thread |
| Display Modes | |
|
|