Boost logo

Boost :

From: Vladimir Prus (ghost_at_[hidden])
Date: 2004-07-28 01:12:53


Ben Young wrote:
> On Tuesday 27 July 2004 07:21, Vladimir Prus wrote:
> > Do you mean that reference counting should be done by DLL itself? Why
> > not:
> >
> > template<class T>
> > class plugin_ptr
> > {
> > public:
> > // operator-> and friends
> > private:
> > T* m_ptr;
> > shared_ptr<dll_handle> m_dll;
> > }
> >
> > So, 'dll' won't be deleted until all plugins which use it are dead.
>
> The way we do that at my company is that all objects returned by a plugin
> are held my a shared_ptr which has a custom deleter which decrements a ref
> count on the library itself.

Something like

    void* h = dlopen(......) ;
    boost::shared_ptr<Plugin> p( ...... dlsym(.....),
                                               bind(dlclose, h))

? That's interesting, but is raises two questions:

- What if you get two plugins from the same dll?
- If dll can be reloaded, then, as I mention in another email, we'd need to
notify all 'plugin_map' instances when dll is reloaded, so dll_handle must be
a bit more smart.

What I'm thinking about now is:

class dll_handle : boost::noncopyable {
public:
       // Opens the specified library. If it's already opened, returns
       // pointer to an existing dll_handle.
       shared_ptr<dll_handle> get(const std::string& name);
        void* operator[](const std::string& symbol_name);
private:
        dll_handle(const std::string& name);
};

class dll {
public:
       dll(const std::string& name);
       // default copy-ctor is OK
       template<.......>
       .... call(.......);
       template<......>
       .... import(.......);
private:
        boost::shared_ptr<dll_handle> m_handle;
};

class plugin_ptr {
public:
        // Minimum set of smart_ptr methods
private:
       // Just to keep the DLL in memory when plugin is in memory
       shared_ptr<dll_handle> m_handle;
};

class plugin_map {
public:
        ... interface to be yet defined ...
};

- Volodya


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk