The Gaudi Framework  v32r0 (3325bb39)
DataObjectHandleBase.cpp
Go to the documentation of this file.
2 #include "GaudiKernel/AlgTool.h"
6 #include <Gaudi/Algorithm.h>
7 
8 #include <boost/tokenizer.hpp>
9 #include <ostream>
10 #include <sstream>
11 #include <string>
12 
14 
15 //---------------------------------------------------------------------------
17  : Gaudi::DataHandle( other )
18  , m_EDS( std::move( other.m_EDS ) )
19  , m_MS( std::move( other.m_MS ) )
20  , m_init( other.m_init )
21  , m_optional( other.m_optional )
22  , m_wasRead( other.m_wasRead )
23  , m_wasWritten( other.m_wasWritten )
24  , m_searchDone( other.m_searchDone ) {
25  m_owner->declare( *this );
26 }
27 
28 //---------------------------------------------------------------------------
30  // avoid modification of searchDone in other while we are copying
32  // FIXME: operator= should not change our owner, only our 'value'
34  m_EDS = other.m_EDS;
35  m_MS = other.m_MS;
36  m_init = other.m_init;
37  m_optional = other.m_optional;
38  m_wasRead = other.m_wasRead;
39  m_wasWritten = other.m_wasWritten;
40  m_searchDone = other.m_searchDone;
41  return *this;
42 }
43 
44 //---------------------------------------------------------------------------
46  : Gaudi::DataHandle( k, a, owner ) {
47  m_owner->declare( *this );
48 }
49 
50 //---------------------------------------------------------------------------
51 
53  : DataObjectHandleBase( DataObjID( k ), a, owner ) {}
54 
55 //---------------------------------------------------------------------------
57 
58 //---------------------------------------------------------------------------
60  DataObject* p = nullptr;
61  if ( LIKELY( m_searchDone ) ) { // fast path: searchDone, objKey is in its final state
62  m_EDS->retrieveObject( objKey(), p ).ignore();
63  return p;
64  }
65 
66  // slow path -- move into seperate function to improve code generation?
67 
68  // convenience towards users -- remind them to register
69  // but as m_MS is not yet set, we cannot use a MsgStream...
70  if ( !m_init ) {
71  std::cerr << ( owner() ? owner()->name() : "<UNKNOWN>:" ) << "DataObjectHandle: uninitialized data handle"
72  << std::endl;
73  }
74 
75  // as m_searchDone is not true yet, objKey may change... so in this
76  // branch we _first_ grab the mutex, to avoid objKey changing while we use it
77 
78  // take a lock to be sure we only execute this once at a time
80 
81  StatusCode sc = m_EDS->retrieveObject( objKey(), p );
82  if ( m_searchDone ) { // another thread has done the search while we were blocked
83  // on the mutex. As a result, nothing left to do but return...
84  sc.ignore();
85  return p;
86  }
87 
88  if ( !sc.isSuccess() ) {
89  auto tokens = boost::tokenizer<boost::char_separator<char>>{objKey(), boost::char_separator<char>{":"}};
90  // let's try our alternatives (if any)
91  auto alt = std::find_if( tokens.begin(), tokens.end(),
92  [&]( const std::string& n ) { return m_EDS->retrieveObject( n, p ).isSuccess(); } );
93  if ( alt != tokens.end() ) {
94  MsgStream log( m_MS, owner()->name() + ":DataObjectHandle" );
95  log << MSG::DEBUG << ": could not find \"" << objKey() << "\" -- using alternative source: \"" << *alt
96  << "\" instead" << endmsg;
97  // found something -- set it as default; this is not atomic, but
98  // at least in `fetch` there is no use of `objKey` that races with
99  // this assignment... (but there may be others!)
100  setKey( *alt );
101  }
102  }
103  m_searchDone = true;
104  return p;
105 }
106 
107 //---------------------------------------------------------------------------
108 
110 
111 //---------------------------------------------------------------------------
113  std::string m;
114  switch ( mode() ) {
116  m = "R";
117  break;
118  case Gaudi::DataHandle::Mode::Writer:
119  m = "W";
120  break;
121  default:
122  m = "UNKNOWN";
123  break;
124  }
125  return "DataObjectHandleBase('" + toString() + "', '" + m + "')";
126 }
127 
128 //---------------------------------------------------------------------------
130 
131 //---------------------------------------------------------------------------
132 
134 
135  assert( !m_init );
136 
137  if ( !owner() ) return false;
138 
139  setRead( false );
140  setWritten( false );
141 
142  Gaudi::Algorithm* algorithm = dynamic_cast<Gaudi::Algorithm*>( owner() );
143  if ( algorithm ) {
144  // Fetch the event Data Service from the algorithm
145  m_EDS = algorithm->evtSvc();
146  m_MS = algorithm->msgSvc();
147  } else {
148  AlgTool* tool = dynamic_cast<AlgTool*>( owner() );
149  if ( tool ) {
150  m_EDS = tool->evtSvc();
151  m_MS = tool->msgSvc();
152  } else {
153  throw GaudiException( "owner is neither AlgTool nor Gaudi::Algorithm", "Invalid Cast", StatusCode::FAILURE );
154  }
155  }
156  m_init = true;
157  return true;
158 }
159 
160 //---------------------------------------------------------------------------
161 
163 
164 //---------------------------------------------------------------------------
165 
167 
168  str << d.fullKey() << " m: " << d.mode();
169  if ( d.owner() ) str << " o: " << d.owner()->name();
170  str << " opt: " << d.isOptional();
171  return str;
172 }
void setWritten(bool wasWritten=true)
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
SmartIF< IDataProviderSvc > & evtSvc() const
shortcut for method eventSvc
Definition: Algorithm.h:265
Define general base for Gaudi exception.
virtual void declare(Gaudi::DataHandle &)=0
virtual const std::string & objKey() const
Definition: DataHandle.h:47
bool isSuccess() const
Definition: StatusCode.h:267
virtual Mode mode() const
Definition: DataHandle.h:42
T endl(T...args)
SmartIF< IDataProviderSvc > m_EDS
STL namespace.
StatusCode parse(GaudiUtils::HashMap< K, V > &result, const std::string &input)
Basic parser for the types of HashMap used in DODBasicMapper.
virtual void renounce(Gaudi::DataHandle &)=0
void setRead(bool wasRead=true)
std::string toString() const
virtual void setKey(const DataObjID &key) const
Definition: DataHandle.h:44
bool m_searchDone
Whether the search part of the fetch method (so dealing with alt names was already executed or not...
Provide serialization function (output only) for some common STL classes (vectors, lists, pairs, maps) plus GaudiUtils::Map and GaudiUtils::HashMap.
PropertyMgr & operator=(const PropertyMgr &)=delete
STL class.
DataObjectHandleBase & operator=(const DataObjectHandleBase &)
virtual const DataObjID & fullKey() const
Definition: DataHandle.h:48
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
constexpr double m
Definition: SystemOfUnits.h:92
IDataHandleHolder * m_owner
Definition: DataHandle.h:66
const DataObjID INVALID_DATAOBJID
const SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
void fromString(const std::string &s)
IDataProviderSvc * evtSvc() const
accessor to event service service
Definition: AlgTool.cpp:88
#define LIKELY(x)
Definition: Kernel.h:88
T find_if(T...args)
virtual StatusCode retrieveObject(IRegistry *pDirectory, std::string_view path, DataObject *&pObject)=0
Retrieve object identified by its directory entry.
DataObjectHandleBase GaudiKernel/DataObjectHandleBase.h.
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
std::mutex m_searchMutex
A Mutex protecting the calls to the search part of the fetch method, so that we are sure that we only...
DataHandle(const DataObjID &k, Mode a=Reader, IDataHandleHolder *owner=nullptr)
Definition: DataHandle.h:31
Base class from which all the concrete tool classes should be derived.
Definition: AlgTool.h:47
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:79
string s
Definition: gaudirun.py:316
std::string pythonRepr() const override
constexpr static const auto FAILURE
Definition: StatusCode.h:86
DataObject * fetch() const
SmartIF< IMessageSvc > m_MS
bool isOptional() const
Check if the data object declared is optional for the algorithm.
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
friend std::ostream & operator<<(std::ostream &str, const DataObjectHandleBase &d)
Header file for std:chrono::duration-based Counters.
Definition: __init__.py:1
def Reader(readerType, filename, qacross, qToEngine)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
virtual const std::string & name() const =0
Retrieve the name of the instance.
virtual IDataHandleHolder * owner() const
Definition: DataHandle.h:40
DataObjectHandleBase(const DataObjID &k, Gaudi::DataHandle::Mode a, IDataHandleHolder *owner)