Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


thought-dump:

* loader != "com.sun.star.loader.SharedLibrary" (i.e., Java, Python, ...) remains unchanged

* external code (extensions) remains unchanged (i.e., stuck with the original .component XML format for now; no prefix="...", extension="...", constructor="..."; mandatory component_getImplementationEnvironment); this allows to experiment with the new features internally

* assume all LO-internal C++ implementations are ComponentContext-based (i.e., use cppu::createSingleComponentFactory or cppu::createOneInstanceComponentFactory rather than legacy ServiceManager-based cppu::createSingleFactory or cppu::createOneInstanceFactory); reaching this state is effectively an easy hack

* implementations of non-single-instance services can be rewritten using the new .component XML <implementation constructor="..." feature, cf. <http://cgit.freedesktop.org/libreoffice/core/commit/?id=ae3a0c8da50b36db395984637f5ad74d3b4887bc> "Add .component <implementation constructor='...' feature"; this is effectively an easy hack (note that service manager's createInstanceWithArguments[andContext] no longer uses the css.lang.XInitialization protocol on those implementations)

* for implementations of single-instance services/singletons, we can:

** either stick with the recently introduced prefix="direct" feature, where the service manager obtains a factory for them; any instantiated object instances will continue to be disposed well ahead of exit via disposing the ComponentContext in desktop::Desktop::DeInit (desktop/source/app/app.cxx)

** or also use the constructor="..." feature, in which case the individual constructor functions would need to hold a single instance, which could postpone that instance's destruction to atexit, with all dreaded consequences (an option might be to hold the single instance weakly)

** or use some <implementation single-instance="true" flag in .component XML and implement the logic of holding a single instance in the service manager, which would dispose them when it gets disposed well ahead of exit

* next step is to let certain occurrences of UNO service constructor (and singleton getter) calls in C++ code call corresponding constructor functions directly (instead of going via service manager's createInstanceWith[ArgumentsAnd]Context); conditions under which this simplification can be done:

** caller and implementation use the same environment (e.g., both gcc3; this is not the case e.g. for connectivity/source/drivers/jdbc/jdbc.component's environment="@CPPU_ENV@:affine")

** and caller knows that the constructor function is visible (i.e., the library/executable supplying it is loaded)

** note that there are always situations where UNO services are not called via constructor, though; e.g., the constructor-less css.uri.UriSchemeParser_* services are always created via dynamically computed name

* idea is to set aside for every UNO service/singleton S two macros LO_URE_CTOR_ENV_<S'> and LO_URE_CTOR_FUN_<S'>, and a macro LO_URE_CURRENT_ENV, and modify cppumaker to generate constructor code as

#if defined LO_URE_CURRENT_ENV && defined LO_URE_CTOR_ENV_<S'> \
    && defined LO_URE_CTOR_FUN<S'> && LO_URE_CURRENT_ENV == LO_URE_CTOR_ENV_<S'>

extern "C" cppu::ConstructorFunction_type LO_URE_CTOR_FUN<S'>;

static css::uno::Reference<X> S::create(
    css::uno::Reference<css::uno::XComponentContext> const & the_context)
{
    return LO_URE_CTOR_FUN<S'>(
        the_context, css::uno::Sequence<css::uno::Any>());
}

#else

// ... existing code ...

#endif

and

** when compiling .cxx files for which the env in which they will be run is statically known (which could e.g. be the case for /every/ .cxx file for Android/iOS when we restrict ourselves to just that env there, as we already effectively do), pass -DLO_URE_CURRENT_ENV=...

** when compiling .cxx files for which it is known that the constructor function for some S will be visible (which could e.g. be ~always the case when compiling for a single big executable on Android/iOS), define the LO_URE_CTOR_ENV_<S'> and LO_URE_CTOR_FUN_<S'> macros, either via -D or via some strategically included header

where S' is some schema to convert UNOIDL service/singleton names into legal yet unambiguous parts of C++ identifiers, and the encoding of environments (which are normally strings) in LO_URE_CURRENT_ENV and LO_URE_CTOR_ENV_<S'> macros must be such that they can be used in the preprocessor == expression above

Stephan

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.