The Gaudi Framework  v29r0 (ff2e7097)
PartitionSwitchAlg.cpp
Go to the documentation of this file.
1 // ====================================================================
2 // PartitionSwitchAlg.cpp
3 // --------------------------------------------------------------------
4 //
5 // Author : Markus Frank
6 //
7 // ====================================================================
9 #include "GaudiKernel/IAlgTool.h"
11 #include "GaudiKernel/IToolSvc.h"
12 #include "GaudiKernel/SmartIF.h"
13 
24 class PartitionSwitchAlg : public extends<Algorithm, IPartitionControl>
25 {
26 
27  using STATUS = StatusCode;
28  using CSTR = const std::string&;
29 
30 private:
31  Gaudi::Property<std::string> m_partName{this, "Partition", "", "option to set the requested partition name"};
32  Gaudi::Property<std::string> m_toolType{this, "Tool", "PartitionSwitchTool",
33  "option to set the tool manipulating the multi-service name"};
34 
37 
38 public:
39  using extends::extends;
40 
42  ~PartitionSwitchAlg() override = default;
43 
45  STATUS initialize() override
46  {
47  SmartIF<IAlgTool> tool( m_actor );
48  STATUS sc = toolSvc()->retrieveTool( m_toolType, m_actor, this );
49  if ( sc.isFailure() ) {
50  error() << "Unable to load PartitionSwitchTool " << m_toolType << endmsg;
51  return sc;
52  }
54  if ( tool ) toolSvc()->releaseTool( tool );
56  IInterface* partititon = nullptr;
57  sc = m_actor->get( m_partName, partititon );
58  if ( !sc.isSuccess() ) {
59  error() << "Cannot access partition \"" << m_partName << "\"" << endmsg;
60  }
61  return sc;
62  }
63 
65  STATUS finalize() override
66  {
67  SmartIF<IAlgTool> tool( m_actor );
68  if ( tool ) toolSvc()->releaseTool( tool );
69  m_actor = nullptr;
70  return STATUS::SUCCESS;
71  }
72 
74  STATUS execute() override
75  {
76  if ( m_actor ) {
77  STATUS sc = m_actor->activate( m_partName );
78  if ( !sc.isSuccess() ) {
79  error() << "Cannot activate partition \"" << m_partName << "\"!" << endmsg;
80  }
81  return sc;
82  }
83  error() << "The partition control tool \"" << name() << "." << m_toolType << "\" cannot be accessed!" << endmsg;
84  return STATUS::FAILURE;
85  }
86 
87 private:
89  {
90  error() << msg << " Status=" << sc.getCode() << endmsg;
91  return sc;
92  }
93  template <typename... FArgs, typename... Args>
94  StatusCode fwd_( StatusCode ( IPartitionControl::*fun )( FArgs... ), Args&&... args )
95  {
96  return m_actor ? ( m_actor->*fun )( std::forward<Args>( args )... ) : NO_INTERFACE;
97  }
98  template <typename... FArgs, typename... Args>
99  StatusCode fwd_( StatusCode ( IPartitionControl::*fun )( FArgs... ) const, Args&&... args ) const
100  {
101  return m_actor ? ( m_actor->*fun )( std::forward<Args>( args )... ) : NO_INTERFACE;
102  }
103 
104 public:
106  STATUS create( CSTR nam, CSTR typ ) override
107  {
108  auto sc = fwd_<CSTR, CSTR>( &IPartitionControl::create, nam, typ );
109  return sc.isSuccess() ? sc : log_( sc, "Cannot create partition: " + nam + " of type " + typ );
110  }
112  STATUS create( CSTR nam, CSTR typ, IInterface*& pPartition ) override
113  {
114  auto sc = fwd_<CSTR, CSTR, IInterface*&>( &IPartitionControl::create, nam, typ, pPartition );
115  return sc.isSuccess() ? sc : log_( sc, "Cannot create partition: " + nam + " of type " + typ );
116  }
118  STATUS drop( CSTR nam ) override
119  {
120  auto sc = fwd_<CSTR>( &IPartitionControl::drop, nam );
121  return sc.isSuccess() ? sc : log_( sc, "Cannot drop partition: " + nam );
122  }
124  STATUS drop( IInterface* pPartition ) override
125  {
126  auto sc = fwd_<IInterface*>( &IPartitionControl::drop, pPartition );
127  return sc.isSuccess() ? sc : log_( sc, "Cannot drop partition by Interface." );
128  }
130  STATUS activate( CSTR nam ) override
131  {
132  auto sc = fwd_<CSTR>( &IPartitionControl::activate, nam );
133  return sc.isSuccess() ? sc : log_( sc, "Cannot activate partition: " + nam );
134  }
136  STATUS activate( IInterface* pPartition ) override
137  {
138  auto sc = fwd_<IInterface*>( &IPartitionControl::activate, pPartition );
139  return sc.isSuccess() ? sc : log_( sc, "Cannot activate partition by Interface." );
140  }
142  STATUS get( CSTR nam, IInterface*& pPartition ) const override
143  {
144  auto sc = fwd_<CSTR, IInterface*&>( &IPartitionControl::get, nam, pPartition );
145  return sc.isSuccess() ? sc : log_( sc, "Cannot get partition " + nam );
146  }
148  STATUS activePartition( std::string& nam, IInterface*& pPartition ) const override
149  {
150  auto sc = fwd_<std::string&, IInterface*&>( &IPartitionControl::activePartition, nam, pPartition );
151  return sc.isSuccess() ? sc : log_( sc, "Cannot determine active partition." );
152  }
153 };
154 
StatusCode fwd_(StatusCode(IPartitionControl::*fun)(FArgs...) const, Args &&...args) const
Small smart pointer class with automatic reference counting for IInterface.
Definition: IConverter.h:15
MsgStream & msg() const
shortcut for the method msgStream(MSG::INFO)
STATUS initialize() override
Initialize.
const std::string & name() const override
The identifying name of the algorithm object.
Definition: Algorithm.cpp:731
Implementation of property with value of concrete type.
Definition: Property.h:319
unsigned long getCode() const
Get the status code by value.
Definition: StatusCode.h:94
STATUS drop(IInterface *pPartition) override
Drop a partition object. The name identifies the partition uniquely.
StatusCode log_(StatusCode sc, const std::string &msg) const
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:75
SmartIF< IToolSvc > & toolSvc() const
The standard ToolSvc service, Return a pointer to the service if present.
Definition: Algorithm.cpp:803
virtual StatusCode create(const std::string &name, const std::string &type)=0
Create a partition object. The name identifies the partition uniquely.
STATUS finalize() override
Finalize.
STATUS activePartition(std::string &nam, IInterface *&pPartition) const override
Access the active partition object.
Gaudi::Property< std::string > m_toolType
StatusCode fwd_(StatusCode(IPartitionControl::*fun)(FArgs...), Args &&...args)
Gaudi::Property< std::string > m_partName
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:86
StatusCode retrieveTool(const std::string &type, T *&tool, const IInterface *parent=nullptr, bool createIf=true)
Retrieve specified tool sub-type with tool dependent part of the name automatically assigned...
Definition: IToolSvc.h:139
#define DECLARE_COMPONENT(type)
Definition: PluginService.h:33
STL class.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
~PartitionSwitchAlg() override=default
Standard Destructor.
STATUS drop(CSTR nam) override
Drop a partition object. The name identifies the partition uniquely.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
virtual StatusCode get(const std::string &name, IInterface *&pPartition) const =0
Access a partition object. The name identifies the partition uniquely.
Definition of the basic interface.
Definition: IInterface.h:277
STATUS create(CSTR nam, CSTR typ, IInterface *&pPartition) override
Create a partition object. The name identifies the partition uniquely.
Small algorithm which switches the partition of a configurable multi-service.
STATUS activate(IInterface *pPartition) override
Activate a partition object.
virtual StatusCode activePartition(std::string &name, IInterface *&pPartition) const =0
Access the active partition object.
Create / access partitions.
Base class used to extend a class implementing other interfaces.
Definition: extends.h:10
double fun(const std::vector< double > &x)
Definition: PFuncTest.cpp:26
STATUS create(CSTR nam, CSTR typ) override
Create a partition object. The name identifies the partition uniquely.
IPartitionControl * m_actor
reference to Partition Controller
virtual StatusCode drop(const std::string &name)=0
Drop a partition object. The name identifies the partition uniquely.
virtual StatusCode activate(const std::string &name)=0
Activate a partition object. The name identifies the partition uniquely.
virtual StatusCode releaseTool(IAlgTool *tool)=0
Release the tool.
STATUS activate(CSTR nam) override
Activate a partition object. The name identifies the partition uniquely.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
STATUS execute() override
Execute procedure.