Boost logo

Boost :

From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2007-12-18 10:43:58


Hello Emil,

thanks for your comments.

Emil Dotchevski wrote:
> This is not a full review, just a few comments:
>
> The supplied documentation mentions nothing about the lifetime of a factory.

A factory (in this context) is just a function object.

>
> There are two features that I would need from a factory system like this.
>
> First, the ability to register and unregister factories.

A registry is intentionally not provided as the requirements typically
differ greatly between projects. Although this submission makes it
trivial to write one from scratch,

    map< string, boost::function< favorite_smart_ptr<T>(args) > >

to begin with.

> I would
> suggest explicit registration that returns a shared_ptr to the factory
> function, while keeping weak_ptr to it. This way, if the factory
> serves a type that is defined in a DLL, it can be automatically
> unregistered when the DLL is unloaded.

Something like this

     // We're in DLL.CPP here

     namespace {
         shared_ptr< function< plugin*() > > sentinel;
     }

     void plugin_entrypoint(plugin_registry r)
     {
         sentinel.reset(r.register_plugin(
             "my_plugin", factory<my_plugin*>()));
     }

     // Also note: The code is untested and unpolished -
     // it's provided for communication purposes only.

?

Now that I look at some code it seems like it might work but it's
certainly not the be-all end-all of factory registries,
'plugin_registry' is still a trivial thing and returning that
'shared_ptr' seems sorta weird (though it admittedly saves us some work).

Further, automatic unloading won't work portably with some ABIs.

> Second, I would prefer the factory table to not be global, instead its
> type can be documented so it is up to the client code to decide if
> they want it to be global or not.

If I wanted to provide a registry, I'd certainly agree here.

> Finally, it's worth mentioning that in the presence of DLLs using
> type_info directly is unsafe, since dereferencing a pointer that
> points a type_info object obtained from a DLL causes a crash if the
> DLL is unloaded.

Yeah, accessing unloaded memory (or even running unloaded code) seems a
bad idea in general not only with 'type_info' objects ;-)...

Regards,
Tobias


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