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@collabora.com <><, Pseudo Engineer, itinerant idiot
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.