Efficient UNO component linkage & GC ...
Michael Meeks
michael.meeks at collabora.com
Thu Dec 12 05:47:27 PST 2013
Hi Stephan,
Thanks for the review ! Matus should start work on this shortly.
On Fri, 2013-10-11 at 17:20 +0200, Stephan Bergmann wrote:
> DllComponentLoader is mostly dead by now, only comes into play during
...
> Handling of the prefix feature is done entirely in
> cppuhelper/source/servicemanger.cxx and cppu::loadSharedLibComponentFactory.
Ah right my bad; as you say we should add this here:
> To split into smaller, unconnected parts would mean to split existing
> <component> XML entities into smaller ones, each with its own prefix
That would suck IMHO :-) we have enough scattered files.
> Or, as you detail below, go further and add more efficient support for
> the "single-object-implementation" factory case. (Do you have any idea
> whether this is worth it, given we have to continue supporting the other
> case for extension-compatibility anyway?)
Sure it's worth it given we're primarily looking for size savings for
mobile; for the Linux case we get only marginal wins here I think.
> Anyway, given that the current "prefix" feature should only be used by
> internal code we have under full control (see recent discussion
> elsewhere on this mailing list), should we go down that road, I'd prefer
> to replace the existing "prefix" feature with something new (e.g., an
> extension of the components XML schema that associates an individual
> <implementation> rather than a <component> with a prefix attribute),
> rather than keeping both. (Though we could support both for a
> transition period while we incrementally update the existing code.)
Yep - agreed; it's nice we're flexible here, just some inevitable
transition period where we'd try the direct symbol approach, and then
fallback to the old prefix'd factory function.
> What would likely be more entertaining is to get rid of the
> cppu::createSingleFactory layer of indirection. (As you come to in part
> three. But note that there are service implementations that rather act
> like singletons and always hand out the same object instance; that needs
> to be taken care of.)
Yes - hopefully that's easily done. Luckily it's all internal, was just
chatting with Matus and considering the symbol could point to a C struct
easily enough something like:
extern "C" struct {
const char *pImplementationName;
ComponentInstantiation pCreateFunction
const char *pServiceNames[];
} ComponentEntryPoint;
And have some wrappers to help with converting the ComponentEntryPoint
record into the results we want from the XServiceInfo methods
(getSupportedServiceNames etc.)
> An alternative is to extend the components XML schema to support lookup
> of the factory function directly in the executable (say) rather than a
> given dynamic library (e.g., by having a local="true" attribute rather
> than a uri="..." one). Since the uri attributes are already inserted
> into the .component XML files at build-time, it shouldn't be too hard to
> combine that with a configurable list of components that end up directly
> linked into the executable.
Interesting idea. I'd like to see how this shakes out in a few
iterations here I think. I agree that we're going to need something
like:
<component loader="com.sun.star.loader.SharedLibrary" prefix="svx"
xmlns="http://openoffice.org/2010/uno-components">
- <implementation name="com.sun.star.comp.Draw.GraphicExporter">
+ <implementation name="com.sun.star.comp.Draw.GraphicExporter" direct="true">
<service name="com.sun.star.drawing.GraphicExportFilter"/>
</implementation>
<implementation name="com.sun.star.comp.Svx.GraphicExportHelper">
<service name="com.sun.star.document.BinaryStreamResolver"/>
<service name="com.sun.star.document.GraphicObjectResolver"/>
</implementation>
Incidentally - do we actually use the service information in anger ?
ie. could we not populate / store the data required for the XServiceInfo
interface from the services.rdb at run-time, rather than having it
duplicated in the code ? or is there some benefit to that ?
> In addition to having them stored as XML files that are parsed at start-up in
> cppuhelper::ServiceManager::init, one could optionally have them
> pre-compiled into some data structure that is accessible from
> cppuhelper/source/servicemanager.cxx. In which case the data structures
> for such local="true" components could directly contain function
> pointers to the corresponding factories.
Very true =) perhaps that would get rid of the whole native-code.cxx
mess as well - centralizing it and making it fully generic - that would
be nice.
> > * Part three - faster component instantiation
> >
> > The wonderful work Noel has been doing around more beautiful
> > ways to instantiate components should dove-tail with this nicely.
...
> > Which should be much smaller and neater.
>
> Question is how much that "much" would actually be. (And one would have
> to generate two variants of service/singleton C++ headers, an optimized
> one for internal use and a traditional one for external use.)
Well if we call directly into the method that instantiates the object,
then LTO can potentially start to inline a lot of things and ignore a
lot of exceptions that we know are not thrown etc. presumably it may
have some benefits for a merged-libs case.
Anyhow - thanks for the feedback - moving ahead here soon (I hope) on
master.
ATB,
Michael.
--
michael.meeks at collabora.com <><, Pseudo Engineer, itinerant idiot
More information about the LibreOffice
mailing list