| The Gaudi Framework v27r1

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

GaudiPluginService

    !-----------------------------------------------------------------------------
    ! Package     : GaudiPluginService
    ! Responsible : Marco Clemencic
    ! Purpose     : Provide a generic plugin service.
    ! Commit Id   : 42dec2462c6bee3f5c65240baea2ec6b387d7ac1
    !-----------------------------------------------------------------------------

    ========================== GaudiPluginService v3r1 ===========================

    ! 2015-10-26 - commit de80db5

     - More modernization changes

       Fix (almost) all warnings from clang 3.7, and use clang-modernize to further
       modernize the code.

       Fixes GAUDI-1118.

       See merge request !49

    ! 2015-10-16 - commit bf01805

     - Merge branch 'GAUDI-1111' into 'master'

       remove dependency on Boost from GaudiPluginService

       Reverted the part of commit dddeca32 that introduce the dependency on Boost.

       Fixes GAUDI-1111.

       See merge request !53

    ========================== GaudiPluginService v3r0 ===========================

    ! 2015-09-11 - commit c062cbe

     - C++11 modernization changes

       Some trivial - and some not so trivial! - changes which take advantage of
       C++11...

       See merge request !7

    ========================== GaudiPluginService v2r2 ===========================
    ! 2014-07-04 - Marco Clemencic
     - Improved Doxygen documentation.

    ========================== GaudiPluginService v2r1 ===========================
    ! 2014-10-28 - Marco Clemencic
     - Demangle factory types in warning messages.

    ========================== GaudiPluginService v2r0 ===========================
    ! 2014-09-30 - David Quarrie
     - do not hide C++11 constructs from Reflex for ATLAS (different version of
       GCCXML)

    ! 2014-05-07 - Sebastien Binet
     - leverage C++11 variadic templates for the factories.
     - internally, also use r-value references and std::forward
     - hide the C++11 constructs from Reflex as GCC-XML parser predates C++11

    ========================== GaudiPluginService v1r2 ===========================
    ! 2014-05-12 - Marco Clemencic
     - Fixed listcomponents command lines tests (CMake only).

    ========================== GaudiPluginService v1r1 ===========================

    ! 2014-05-19 - Charles Leggett
     - add HAVE_GAUDI_PLUGINSVC tag for cmt requirements

    ! 2014-05-09 - Charles Leggett
     - add macro HAVE_GAUDI_PLUGINSVC so external packages can see if it's available

    ! 2014-05-09 - Marco Clemencic
     - Improved command line of listcomponents: now it accepts --output and --help.
     - Modified the listcomponents CMT document to use --output instead of output
       redirection. Fixes bug #104455

    ========================== GaudiPluginService v1r0 ===========================
    ! 2014-02-03 - Marco Clemencic
     - Added support for Reflex names for components, enabled with the compile flag
       -DGAUDI_REFLEX_COMPONENT_ALIASES.

    ! 2014-01-10 - Marco Clemencic
     - Fixed error handling in listcomponents.cpp: exit with a failure status code
       if there is an error loading a library.

    ! 2013-12-19 - Marco Clemencic
     - Minor fix to CMake configuration.

    ! 2013-08-28 - Sebastien Binet
     - Added (C++) tests for optional metadata (properties).
     - Added docstrings to the python interface.

    ! 2013-08-27 - Marco Clemencic
     - Fixed symbol visibility.

    ! 2013-08-23 - Marco Clemencic
     - Updated the CMT configuration.

    ! 2013-08-23 - Sebastien Binet
     - Added optional metadata (properties) to the factories.
     - Added a Python module to query the list of factories (based on ctypes).

    ! 2013-07-26 - Marco Clemencic
     - Ported new GaudiPluginService to CMT.

    ! 2013-07-25 - Marco Clemencic
     - Removed the extra level of indirection and simplified the support for
       private/protected constructors.

    ! 2013-07-25 - Marco Clemencic
     - Added an extra level of indirection (a creator class) to allow components
       with protected/private constructors.

    ! 2013-07-24 - Marco Clemencic
     - Do not use the type name in the helper local class created by the DECLARE_*
       macros: it's not really needed and it allows the use of namespaces and
       templates in the parameter passed to DECLARE_*.

    ! 2013-07-24 - Marco Clemencic
     - Added some tests.

    ! 2013-07-23 - Marco Clemencic
     - Added thread safety (with locks) if compiled with C++11.

    ! 2013-07-23 - Marco Clemencic
     - Changes the dlopen flags from (RTLD_LAZY | RTLD_LOCAL) to
       (RTLD_LAZY | RTLD_GLOBAL) to avoid problems with Python binary modules
       imported through the Python C/C++ API.
       The Python binary modules may not be linked to the Python library, so they
       need that the Python symbols are visible globally.

    ! 2013-07-19 - Marco Clemencic
     - Added instructions for the Plugin Service in a README.md file.

    ! 2013-07-18 - Marco Clemencic
     - Modified the symbol resolution policy when loading a component library,
       using RTLD_LAZY instead of RTLD_NOW.
       It allows loading of component libraries with unresolved symbols, but it is
       consistent with the old behavior.

    ! 2013-07-18 - Marco Clemencic
     - Added the macros DECLARE_COMPONENT and DECLARE_COMPONENT_WITH_ID to simplify
       the declaration of component classes when the factory is declared as the
       typedef Factory in a base class.
       In the example below the declaration becomes:

           #include "MyDerivedComponent.h"
           DECLARE_COMPONENT(MyDerivedComponent)

    ! 2013-07-18 - Marco Clemencic
     - Fixed a problem when the DECLARE_* macros are called from within a namespace.

    ! 2013-07-17 - Marco Clemencic
     - First complete implementation of a ROOT/Reflex-free Plugin Service for
       Gaudi. The typical use is:

       - headers

         #include <Gaudi/PluginService.h>

         class IMyInterface { ... };

         class MyBaseComponent: virtual public IMyInterface {
         public:
           typedef Gaudi::PluginService::Factory1<IMyInterface*,
                                                  const std::string&>
                                                  Factory;
           MyBaseComponent(const std::string&);
           ...
         };

         class MyDerivedComponent: public MyBaseComponent {
           ...
         };

       - sources

         #include "MyDerivedComponent.h"
         DECLARE_FACTORY(MyDerivedComponent, MyBaseComponent::Factory)

       - to instantiate

         #include "MyBaseComponent.h"
         IMyInterface* ptr =
             MyBaseComponent::Factory::create("MyDerivedComponent", "argument");