The Gaudi Framework  v33r2 (a6f0ec87)
Application.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #include <Gaudi/Application.h>
13 #include <GaudiKernel/Bootstrap.h>
14 #include <GaudiKernel/IAppMgrUI.h>
19 #include <GaudiKernel/IProperty.h>
21 #include <GaudiKernel/Property.h>
22 #include <gsl/span>
23 #include <type_traits>
24 
25 #define GAUDI_ASSERT_THROW_NAME( cond, msg, name ) \
26  if ( !cond ) throw GaudiException{msg, name, StatusCode::FAILURE};
27 
28 #define GAUDI_ASSERT_THROW( cond, msg ) \
29  if ( !cond ) throw GaudiException{msg, this->name(), StatusCode::FAILURE};
30 
31 namespace {
32  void consumeOptions( SmartIF<IProperty> prop, Gaudi::Application::Options& options ) {
33  GAUDI_ASSERT_THROW_NAME( prop, "invalid IProperty", "Gaudi::Application" );
35  const auto prefix_size = prefix.size();
36 
37  auto opt = options.upper_bound( prefix );
38  while ( opt != end( options ) && std::string_view( opt->first ).substr( 0, prefix_size ) == prefix ) {
39  GAUDI_ASSERT_THROW_NAME( prop->setProperty( opt->first.substr( prefix_size ), opt->second ),
40  "failure setting " + opt->first + " to " + opt->second, "Gaudi::Application" );
41  // drop processed option and increase iterator
42  opt = options.erase( opt );
43  }
44  }
45 } // namespace
46 
47 Gaudi::Application::Factory::ReturnType Gaudi::Application::create( std::string_view type, Options opts ) {
48  if ( type == "Gaudi::Application" ) { return std::make_unique<Application>( std::move( opts ) ); }
49  return Factory::create( type, std::move( opts ) );
50 }
51 
53  // # Prepare the application
54  // - instantiate
56  GAUDI_ASSERT_THROW_NAME( app, "failure instantiating ApplicationMgr", "Gaudi::Application" );
57 
58  // - main configuration
59  consumeOptions( app.as<IProperty>(), options );
60  // - start minimal services
61  GAUDI_ASSERT_THROW_NAME( app->configure(), "failure creating basic services", "Gaudi::Application" );
62 
63  consumeOptions( SmartIF<IMessageSvc>{app}.as<IProperty>(), options );
64 
65  // - prepare job configuration
66  {
67  auto sloc = app.as<ISvcLocator>();
68  auto jos = sloc->service<IJobOptionsSvc>( "JobOptionsSvc" );
69  std::for_each( begin( options ), end( options ), [&jos]( const auto& item ) {
70  std::string_view name = item.first;
71  const auto sep_pos = name.find_last_of( '.' );
72  std::string_view client = name.substr( 0, sep_pos );
73  name.remove_prefix( sep_pos + 1 );
74  jos->addPropertyToCatalogue( std::string{client}, Gaudi::Property<std::string>{std::string{name}, item.second} )
75  .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ );
76  } );
77  }
78 }
79 
80 Gaudi::Application::~Application() { app->terminate().ignore(); }
81 
83  auto prop = app.as<IProperty>();
84  auto processor = app.as<IEventProcessor>();
85 
87  evtMax.assign( prop->getProperty( "EvtMax" ) );
88 
89  // - get ready to process events
90  if ( app->initialize() ) {
91  if ( app->start() ) {
92  // - main processing loop
93  if ( !processor->executeRun( evtMax ) ) setAppReturnCode( prop, Gaudi::ReturnCode::GenericFailure ).ignore();
94 
95  app->stop().ignore();
96  } else
98  app->finalize().ignore();
99  } else
101  return getAppReturnCode( prop );
102 }
103 
104 namespace {
105  struct c_opt_t {
106  char* key;
107  char* value;
108  };
109 } // namespace
110 
111 #ifdef GAUDI_HASCLASSVISIBILITY
112 # pragma GCC visibility push( default )
113 #endif
114 
115 extern "C" {
116 // helper to invoke the factory from Python
117 Gaudi::Application* _py_Gaudi__Application__create( const char* name, const c_opt_t* options, unsigned long n ) {
119  gsl::span py_opts{options, static_cast<std::remove_cv_t<decltype( gsl::dynamic_extent )>>( n )};
120  for ( auto& opt : py_opts ) { opts[opt.key] = opt.value; }
121  return Gaudi::Application::create( name, std::move( opts ) ).release();
122 }
123 int _py_Gaudi__Application__run( Gaudi::Application* self ) { return self->run(); }
125 }
126 
127 #ifdef GAUDI_HASCLASSVISIBILITY
128 # pragma GCC visibility pop
129 #endif
int getAppReturnCode(const SmartIF< IProperty > &appmgr)
Get the application (current) return code.
Definition: AppReturnCode.h:79
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition: ISvcLocator.h:35
Implementation of property with value of concrete type.
Definition: Property.h:370
#define GAUDI_ASSERT_THROW_NAME(cond, msg, name)
Definition: Application.cpp:25
virtual int run()
Implement the application main logic:
Definition: Application.cpp:82
SmartIF< IFace > as() const
return a new SmartIF instance to another interface
Definition: SmartIF.h:117
constexpr int GenericFailure
Definition: AppReturnCode.h:28
virtual const std::string & name() const =0
Retrieve the name of the instance.
STL class.
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:86
virtual StatusCode setProperty(const Gaudi::Details::PropertyBase &p)=0
Set the property by property.
Main interface for the JobOptions service.
Gaudi::Application * _py_Gaudi__Application__create(const char *name, const c_opt_t *options, unsigned long n)
string prefix
Definition: gaudirun.py:343
def end
Definition: IOTest.py:123
def create(cls, appType, opts)
Definition: __init__.py:105
StatusCode setAppReturnCode(SmartIF< IProperty > &appmgr, int value, bool force=false)
Set the application return code.
Definition: AppReturnCode.h:59
T move(T... args)
Gaudi application entry point.
Definition: __init__.py:81
Application(Options opts)
Construct and configure the application from the provided options.
Definition: Application.cpp:52
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:168
int _py_Gaudi__Application__run(Gaudi::Application *self)
virtual ~Application()
Definition: Application.cpp:80
The IEventProcessor is the interface to process events.
AttribStringParser::Iterator begin(const AttribStringParser &parser)
The IProperty is the basic interface for all components which have properties that can be set or get.
Definition: IProperty.h:30
T for_each(T... args)
void _py_Gaudi__Application__delete(Gaudi::Application *self)
GAUDI_API IAppMgrUI * createApplicationMgr(const std::string &dllname, const std::string &factname)
std::map< std::string, std::string > Options
Definition: Application.h:29