Google
 
Webnews.only-4-geeks.com
Interesting places
news.only-4-geeks.com Forum Index » C++

Segfault in .so file.

 
Jump to:  
 
german diago
PostPosted: 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
PostPosted: 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
PostPosted: 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! ]
 

Page 1 of 1 .:.

Google
 
Webnews.only-4-geeks.com

Windows Update | C++ | C | PHP | JavaScript | Photoshop | Programming | Windows 2000 | Python | Windows XP | Object | Flash | Flash - ActionScript | Paint Shop Pro | Excel | PowerPoint | Access | Word | Windows 98 | Internet Explorer 6.0 | CorelDraw12 | Java | XML | asm x86 | Linux Mandrake | Linux RedHat | Outlook |  | news from newsgroups |_ | s

Web Templates

Awesome Website Templates ©

Shazza moja miłość - Big Cyc grecja biuro rachunkwe poznan Armatura kuchenna agencje tłumaczeń