ATLAS Offline Software
DataProxy.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include <algorithm>
6 
7 #include <cassert>
8 #include <stdexcept>
9 
12 
13 #include "GaudiKernel/DataObject.h"
14 #include "GaudiKernel/IConverter.h"
15 #include "GaudiKernel/GenericAddress.h"
16 #include "GaudiKernel/MsgStream.h"
17 #include "GaudiKernel/EventContext.h"
18 
20 #include "SGTools/T2pMap.h"
25 
26 #include "SGTools/DataProxy.h"
27 using SG::DataProxy;
29 using std::find;
30 
31 
32 namespace SG {
33  typedef IProxyDict** getDataSourcePointerFunc_t (const std::string&);
35 
36  class DataProxyHolder
37  {
38  public:
39  static void resetCachedSource();
40  };
41 }
42 
43 namespace {
44 
45 class PushStore
46 {
47 public:
48  PushStore (IProxyDict* store)
49  {
50  static std::string storeName = "StoreGateSvc";
51  m_storePtr = (*SG::getDataSourcePointerFunc) (storeName);
52  m_store = *m_storePtr;
53  if (store && store != m_store) {
54  *m_storePtr = store;
56  }
57  }
58 
59  ~PushStore()
60  {
61  if (*m_storePtr != m_store) {
62  *m_storePtr = m_store;
64  }
65  }
66 
67 private:
68  IProxyDict** m_storePtr;
69  IProxyDict* m_store;
70 };
71 
72 }
73 
74 
75 namespace {
77  template <class GAUDIREF>
78  void setGaudiRef(GAUDIREF* pgref, GAUDIREF*& pMember) {
79  if (0 != pgref) pgref->addRef();
80  if (0 != pMember) pMember->release();
81  pMember = pgref;
82  }
83 
85  template <class GAUDIREF>
86  void resetGaudiRef(GAUDIREF*& pMember) { setGaudiRef((GAUDIREF*)0, pMember); }
87 
88 } //end of unnamed namespace
89 
90 // Default Constructor
91 DataProxy::DataProxy():
92  m_refCount(0),
93  m_resetFlag(true),
94  m_boundHandles(false),
95  m_const(false),
96  m_origConst(false),
97  m_dObject(nullptr),
98  m_dataLoader(nullptr),
99  m_t2p(nullptr),
100  m_store(nullptr),
101  m_errno(ALLOK)
102 {
103 }
104 
105 // DataProxy constructor with Transient Address
106 // (typically called from Proxy Provider)
108  IConverter* svc,
109  bool constFlag, bool resetOnly)
110  : DataProxy (std::move(*tAddr),
111  svc, constFlag, resetOnly)
112 {
113  delete tAddr;
114 }
115 
116 // DataProxy constructor with Transient Address
117 // (typically called from Proxy Provider)
118 DataProxy::DataProxy(std::unique_ptr<TransientAddress> tAddr,
119  IConverter* svc,
120  bool constFlag, bool resetOnly)
121  : DataProxy (std::move(*tAddr), svc, constFlag, resetOnly)
122 {
123  //assert( tAddr->clID() != 0 );
124  if (svc) svc->addRef();
125 }
126 
128  IConverter* svc,
129  bool constFlag, bool resetOnly):
130  m_refCount(0),
131  m_resetFlag(resetOnly),
132  m_boundHandles(false),
133  m_const(constFlag),
134  m_origConst(constFlag),
135  m_dObject(0),
136  m_tAddress(std::move(tAddr)),
137  m_dataLoader(svc),
138  m_t2p(nullptr),
139  m_store(nullptr),
140  m_errno(ALLOK)
141 {
142  //assert( tAddr->clID() != 0 );
143  if (svc) svc->addRef();
144 }
145 
146 // with Data Object:
147 // (typically called from a StoreGate record
148 DataProxy::DataProxy(DataObject* dObject,
149  TransientAddress* tAddr,
150  bool constFlag, bool resetOnly):
151  m_refCount(0),
152  m_resetFlag(resetOnly),
153  m_boundHandles(false),
154  m_const(constFlag),
155  m_origConst(constFlag),
156  m_dObject(0),
157  m_tAddress(std::move(*tAddr)),
158  m_dataLoader(nullptr),
159  m_t2p(nullptr),
160  m_store(nullptr),
161  m_errno(ALLOK)
162 {
163  setObject(dObject);
164  delete tAddr;
165 }
166 
167 DataProxy::DataProxy(DataObject* dObject,
168  TransientAddress&& tAddr,
169  bool constFlag, bool resetOnly):
170  m_refCount(0),
171  m_resetFlag(resetOnly),
172  m_boundHandles(false),
173  m_const(constFlag),
174  m_origConst(constFlag),
175  m_dObject(0),
176  m_tAddress(std::move(tAddr)),
177  m_dataLoader(nullptr),
178  m_t2p(nullptr),
179  m_store(nullptr),
180  m_errno(ALLOK)
181 {
182  setObject(dObject);
183 }
184 
185 // Destructor
187 {
188  finalReset();
189 }
190 
192 {
193  lock_t lock (m_mutex);
194  m_t2p = t2p;
195 }
196 
197 
205 {
206  objLock_t objLock (m_objMutex);
207  lock_t lock (m_mutex);
208  if (!m_const) {
209  m_const = true;
210  this->lock (objLock);
211  }
212 }
213 
215  assert(ir);
216  lock_t lock (m_mutex);
217  if (ir->isSet()) {
218  return false;
219  } else {
220  m_handles.push_back(ir);
221  m_boundHandles = true;
222  if (IProxyDict* store = m_store)
223  store->boundHandle(ir);
224  return true;
225  }
226 }
227 
228 
231 {
232  DataObject* dobj = m_dObject;
233  resetGaudiRef(dobj);
234  m_dObject = dobj;
235  m_tAddress.reset();
237 }
238 
239 
240 void DataProxy::reset (bool hard /*= false*/)
241 {
242  resetBoundHandles (hard);
243 
244  objLock_t objLock (m_objMutex);
245  lock_t lock (m_mutex);
246  resetRef();
247 }
248 
249 
251 {
252  handleList_t handles;
253  {
254  objLock_t objLock (m_objMutex);
255  lock_t lock (m_mutex);
256  m_const=false; //hack to force the resetting of proxy ptr in VarHandleBase
257 
258  handles = m_handles;
259 
260  DataObject* dobj = m_dObject;
261  resetGaudiRef(dobj);
262  m_dObject = dobj;
263  resetGaudiRef(m_dataLoader);
264 
265  if (m_handles.empty()) {
266  m_boundHandles = false;
267  }
268  }
269 
270  for (auto ih: handles) {
271  if (0 != ih) ih->finalReset();
272  }
273 }
274 
277  handleList_t handles;
278  {
279  lock_t lock (m_mutex);
280  // Early exit if the list is empty.
281  if (!m_boundHandles) return;
282 
283  // Make a copy and drop the lock, so we're not holding the lock
284  // during the callback.
285  handles = m_handles;
286  }
287 
288  for (IResetable* h : handles) {
289  h->reset(hard);
290  }
291 }
292 
294  assert(ir);
295  lock_t lock (m_mutex);
296  auto ifr = find(m_handles.begin(), m_handles.end(), ir );
297  if (ifr != m_handles.end()) {
298  m_handles.erase(ifr);
299  if (IProxyDict* store = m_store)
301  }
302  m_boundHandles = !m_handles.empty();
303 }
304 
306 unsigned long DataProxy::refCount() const
307 {
308  lock_t lock (m_mutex);
309  return m_refCount;
310 }
311 
313 unsigned long DataProxy::addRef()
314 {
315  lock_t lock (m_mutex);
316  return ++m_refCount;
317 }
318 
320 unsigned long DataProxy::release()
321 {
322  unsigned long count;
323  {
324  lock_t lock (m_mutex);
325  count = --m_refCount;
326  }
327  if ( 0 == count ) delete this;
328  return count;
329 }
330 
331 
353 bool DataProxy::requestRelease(bool force, bool hard) {
354 
355  if (m_boundHandles) {
356  resetBoundHandles(hard);
357  }
358  bool canRelease = force;
359  if (!m_resetFlag) canRelease = true;
360 #ifndef NDEBUG
361  MsgStream gLog(m_ims, "DataProxy");
362  if (gLog.level() <= MSG::VERBOSE) {
363  gLog << MSG::VERBOSE << "requestRelease(): "
364  << (canRelease ? " release " : " reset")
365  <<" object "
366  << name() << " CLID " << clID() << " address " << MSG::hex
367  << object() << MSG::dec << endmsg;
368  }
369 #endif
370  if (!canRelease) {
371  resetRef();
372  }
373  return canRelease;
374 }
375 
379 void DataProxy::setObject(objLock_t& objLock, DataObject* dObject, bool doreg)
380 {
381  DataObject* dobj = m_dObject;
382  setGaudiRef(dObject, dobj);
383  m_dObject = dobj;
384  if (0 != dobj) {
385  if (doreg) dobj->setRegistry(this);
386  if (m_const) this->lock (objLock);
387  }
388 }
389 
390 
392 void DataProxy::setObject(DataObject* dObject, bool doreg /*= true*/)
393 {
394  objLock_t objLock (m_objMutex);
395  setObject (objLock, dObject, doreg);
396 }
397 
398 
399 // set IOpaqueAddress
400 void DataProxy::setAddress(IOpaqueAddress* address)
401 {
402  lock_t lock (m_mutex);
404 }
406 
407 
420 std::unique_ptr<DataObject> DataProxy::readData()
421 {
422  // Public wrapper for readData().
423  objLock_t objLock (m_objMutex);
424  return readData (objLock, nullptr);
425 }
426 
427 
439 std::unique_ptr<DataObject> DataProxy::readData (objLock_t&, ErrNo* errNo)
440 {
441  if (errNo) {
442  if (*errNo == RECURSIVEREAD) {
443  MsgStream gLog(m_ims, "DataProxy");
444  gLog << MSG::ERROR
445  << "readData: ERROR recursive read for object"
446  <<m_tAddress.clID() << '/' << m_tAddress.name() << '\n'
447  <<" Returning NULL DataObject pointer " << endmsg;
448  return nullptr;
449  }
450  *errNo = RECURSIVEREAD;
451  }
452 
453  IConverter* dataLoader;
454  IProxyDict* store;
455  IOpaqueAddress* address;
456  {
457  lock_t lock (m_mutex);
458  if (0 == m_dataLoader) {
459  //MsgStream gLog(m_ims, "DataProxy");
460  //gLog << MSG::WARNING
461  // << "accessData: IConverter ptr not set" <<endmsg;
462  if (errNo) *errNo=NOCNVSVC;
463  return nullptr;
464  }
465 
466  dataLoader = m_dataLoader;
467  store = m_store;
468  address = m_tAddress.address();
469  }
470 
471  if (!isValidAddress()) {
472  //MsgStream gLog(m_ims, "DataProxy");
473  //gLog << MSG::WARNING
474  // << "accessData: IOA pointer not set" <<endmsg;
475  if (errNo) *errNo=NOIOA;
476  return nullptr;
477  }
478 
480 
481  DataObject* obj = nullptr;
482  StatusCode sc;
483  if (store)
484  sc = store->createObj (dataLoader, address, obj);
485  else
486  sc = dataLoader->createObj (address, obj);
487  if (sc.isSuccess()) {
488  if (errNo && *errNo == RECURSIVEREAD) *errNo = ALLOK;
489  return std::unique_ptr<DataObject>(obj);
490  }
491  if (errNo) *errNo = CNVFAILED;
492  return nullptr;
493 }
494 
495 
498 {
499  // This is done in the inlined accessData().
500  //if (0 != m_dObject) return m_dObject; // cached object
501 
502  objLock_t objLock (m_objMutex);
503 
504  if (isValidAddress()) {
505  // An address provider called by isValidAddress may have set the object
506  // pointer directly, rather than filling in the address. So check
507  // the cached object pointer again.
508  if (0 != m_dObject) return m_dObject; // cached object
509  }
510 
511  std::unique_ptr<DataObject> obju = readData (objLock, &m_errno);
512  if (!obju) {
513  if (m_errno == NOIOA) {
514  MsgStream gLog(m_ims, "DataProxy");
515  gLog << MSG::WARNING
516  << "accessData: IOA pointer not set" <<endmsg;
517  }
518  else if (m_errno == CNVFAILED) {
519  MsgStream gLog(m_ims, "DataProxy");
520  gLog << MSG::WARNING
521  << "accessData: conversion failed for data object "
522  <<m_tAddress.clID() << '/' << m_tAddress.name() << '\n'
523  <<" Returning NULL DataObject pointer " << endmsg;
524  }
525  setObject(objLock, 0, true);
526  return 0;
527  }
528 
529  DataObject* obj = obju.release();
530  setObject(objLock, obj, true);
531  DataBucketBase* bucket = dynamic_cast<DataBucketBase*>(obj);
532  if (m_t2p) {
533  if (bucket) {
534  void* payload = bucket->object();
535  m_t2p->t2pRegister(payload, this);
536  m_errno=ALLOK;
537 
538  // Register bases as well.
540  if (bi) {
541  std::vector<CLID> base_clids = bi->get_bases();
542  for (unsigned i=0; i < base_clids.size(); ++i) {
543  void* bobj = SG::DataProxy_cast (this, base_clids[i]);
544  if (bobj && bobj != payload)
545  m_t2p->t2pRegister (bobj, this);
546  }
547  }
548  }
549  else {
550  MsgStream gLog(m_ims, "DataProxy");
551  gLog << MSG::ERROR
552  << "accessData: ERROR registering object in t2p map"
553  <<m_tAddress.clID() << '/' << m_tAddress.name() << '\n'
554  <<" Returning NULL DataObject pointer " << endmsg;
555  obj=0;
556  setObject(objLock, 0, true);
558  }
559  }
560 
561  return obj;
562 }
563 
564 
565 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
567 {
568  // Looking up the context is relatively expensive.
569  // So first try isValid() without the context.
570  {
571  lock_t lock (m_mutex);
572  if (const_cast<DataProxy*>(this)->m_tAddress.isValid(nullptr)) {
573  return true;
574  }
575  }
576  // Get the context. (Must not be holding m_mutex here.)
577  const EventContext& ctx = contextFromStore();
578  // Try again with the context.
579  lock_t lock (m_mutex);
580  return const_cast<DataProxy*>(this)->m_tAddress.isValid(&ctx);
581 }
582 
584 {
585  // Be sure to get the context before acquiring the lock.
586  const EventContext& ctx = contextFromStore();
587  lock_t lock (m_mutex);
588  return m_tAddress.isValid(&ctx, true);
589 }
590 
601 {
602  if (0 == proxy || !proxy->isValid())
603  return 0;
604  DataObject* pObject = proxy->accessData();
605  if (0 == pObject)
606  return 0;
607  return SG::Storable_cast (pObject, clid, proxy, proxy->isConst());
608 }
609 
610 
616 {
617  lock_t lock (m_mutex);
618  if (m_t2p)
619  m_t2p->t2pRegister (p, this);
620 }
621 
622 
629 {
630  DataObject* dobj = m_dObject;
631  DataBucketBase* bucket = dynamic_cast<DataBucketBase*>(dobj);
632  if (bucket)
633  bucket->lock();
634 }
635 
636 
646 const EventContext& DataProxy::contextFromStore() const
647 {
649  if (store) {
650  static const SG::sgkey_t ctxkey =
652  SG::DataProxy* proxy = store->proxy_exact (ctxkey);
653  if (proxy && proxy->object()) {
654  EventContext* ctx = SG::DataProxy_cast<EventContext> (proxy);
655  if (ctx) return *ctx;
656  }
657  }
658  static const EventContext emptyContext;
659  return emptyContext;
660 }
SGTest::store
TestStore store
Definition: TestStore.cxx:23
CurrentEventStore.h
Hold a pointer to the current event store.
SG::DataProxy::handleList_t
std::vector< IResetable * > handleList_t
list of bound DataHandles
Definition: DataProxy.h:329
SG::DataProxy::m_boundHandles
bool m_boundHandles
True if there are any bound handles.
Definition: DataProxy.h:313
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:392
SG
Forward declaration.
Definition: CaloCellPacker_400_500.h:32
getMessageSvc.h
singleton-like access to IMessageSvc via open function and helper
SG::DataProxy::m_store
std::atomic< IProxyDict * > m_store
The store of which we are a part.
Definition: DataProxy.h:350
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
DataBucketBase::lock
virtual void lock()=0
If the held object derives from ILockable, call lock() on it.
SG::DataProxy::resetBoundHandles
void resetBoundHandles(bool hard)
reset the bound DataHandles If HARD is true, then the bound objects should also clear any data that d...
Definition: DataProxy.cxx:276
calibdata.force
bool force
Definition: calibdata.py:19
DataBucketBase
A non-templated base class for DataBucket, allows to access the transient object address as a void*.
Definition: DataBucketBase.h:24
IStringPool::stringToKey
virtual sgkey_t stringToKey(const std::string &str, CLID clid)=0
Find the key for a string/CLID pair.
DataBucketBase.h
SG::DataProxy::registerTransient
virtual void registerTransient(void *p) override final
Register a transient object in a t2p map.
Definition: DataProxy.cxx:615
DataBucketBase::object
virtual void * object()=0
SG::DataProxy::m_t2p
T2pMap * m_t2p
Definition: DataProxy.h:326
SG::DataProxy::m_ims
Athena::IMessageSvcHolder m_ims
Definition: DataProxy.h:347
SG::DataProxy::objLock_t
std::lock_guard< objMutex_t > objLock_t
Definition: DataProxy.h:343
SG::CurrentEventStore::Push
Temporarily change the current store.
Definition: SGTools/SGTools/CurrentEventStore.h:58
SG::TransientAddress
Definition: TransientAddress.h:32
SG::DataProxy::RECURSIVEREAD
@ RECURSIVEREAD
Definition: DataProxy.h:49
SG::TransientAddress::reset
void reset()
Retrieve IOpaqueAddress.
Definition: TransientAddress.h:187
SG::BaseInfoBase::get_bases
const std::vector< CLID > & get_bases() const
Return the class IDs of all known bases of T (that have class IDs).
Definition: BaseInfo.cxx:304
SG::DataProxy::NOCNVSVC
@ NOCNVSVC
Definition: DataProxy.h:48
SG::DataProxy::lock
void lock(objLock_t &)
Lock the data object we're holding, if any.
Definition: DataProxy.cxx:628
IProxyDict::createObj
virtual StatusCode createObj(IConverter *cvt, IOpaqueAddress *addr, DataObject *&refpObject)
Call converter to create an object, possibly with locking.
Definition: IProxyDict.cxx:70
IProxyDict
A proxy dictionary.
Definition: AthenaKernel/AthenaKernel/IProxyDict.h:47
EventContextClid.h
Assign a CLID to EventContext.
XMLtoHeader.count
count
Definition: XMLtoHeader.py:85
SG::DataProxy::NOIOA
@ NOIOA
Definition: DataProxy.h:48
SG::DataProxy::unbindHandle
void unbindHandle(IResetable *ir)
Definition: DataProxy.cxx:293
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
SG::TransientAddress::name
const std::string & name() const
Get the primary (hashed) SG key.
Definition: TransientAddress.h:208
IProxyDict::proxy_exact
virtual SG::DataProxy * proxy_exact(SG::sgkey_t sgkey) const =0
Get proxy given a hashed key+clid.
IResetable
a resetable object (e.g. a SG DataHandle)
Definition: IResetable.h:15
SG::DataProxy::requestRelease
bool requestRelease(bool force, bool hard)
Reset/release a proxy at the end of an event.
Definition: DataProxy.cxx:353
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
SG::DataProxy::address
virtual IOpaqueAddress * address() const override final
Retrieve IOpaqueAddress.
SG::DataProxy::contextFromStore
const EventContext & contextFromStore() const
Retrieve the EventContext saved in the owning store.
Definition: DataProxy.cxx:646
IProxyDict::boundHandle
virtual void boundHandle(IResetable *handle)
Tell the store that a handle has been bound to a proxy.
Definition: IProxyDict.cxx:23
lumiFormat.i
int i
Definition: lumiFormat.py:85
SG::DataProxy::m_objMutex
objMutex_t m_objMutex
Definition: DataProxy.h:344
SG::DataProxyHolder
Manage DataProxy reference in ElementLink/DataLink.
Definition: DataProxyHolder.h:61
IResetable.h
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::DataProxyHolder::resetCachedSource
static void resetCachedSource()
SG::DataProxy::m_dObject
std::atomic< DataObject * > m_dObject
Definition: DataProxy.h:320
SG::DataProxy::lock_t
std::lock_guard< mutex_t > lock_t
Definition: DataProxy.h:338
SG::TransientAddress::clID
CLID clID() const
Retrieve string key:
Definition: TransientAddress.h:201
SG::TransientAddress::isValid
bool isValid(const EventContext *ctx, bool forceUpdate=false)
cache the pointer to the Address provider which can update this transient address
Definition: TransientAddress.cxx:179
SG::getDataSourcePointerFunc
getDataSourcePointerFunc_t * getDataSourcePointerFunc
ClassID_traits
Default, invalid implementation of ClassID_traits.
Definition: Control/AthenaKernel/AthenaKernel/ClassID_traits.h:40
SG::T2pMap::t2pRegister
bool t2pRegister(const void *const pTrans, DataProxy *const pPers)
Definition: T2pMap.h:34
SG::DataProxy::m_origConst
bool m_origConst
Was the proxy created as const?
Definition: DataProxy.h:318
SG::DataProxy::m_const
std::atomic< bool > m_const
Is the proxy currently const?
Definition: DataProxy.h:316
SG::DataProxy::T2PREGFAILED
@ T2PREGFAILED
Definition: DataProxy.h:48
SG::DataProxy::store
IProxyDict * store()
Return the store of which we're a part.
SG::DataProxy::setT2p
void setT2p(T2pMap *t2p)
Definition: DataProxy.cxx:191
Handler::svc
AthROOTErrorHandlerSvc * svc
Definition: AthROOTErrorHandlerSvc.cxx:10
SG::DataProxy::bindHandle
bool bindHandle(IResetable *ir)
Definition: DataProxy.cxx:214
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
SG::DataProxy::m_refCount
unsigned int m_refCount
Definition: DataProxy.h:303
SG::DataProxy::clID
CLID clID() const
Retrieve clid.
SG::DataProxy::~DataProxy
virtual ~DataProxy()
Definition: DataProxy.cxx:186
SG::DataProxy::release
virtual unsigned long release() override final
release reference to object
Definition: DataProxy.cxx:320
SG::DataProxy::ALLOK
@ ALLOK
Definition: DataProxy.h:48
SG::DataProxy::setObject
void setObject(DataObject *obj, bool doreg=true)
set DataObject If doreg is true, then call setRegistry to set the backpointer from obj to the proxt.
Definition: DataProxy.cxx:392
SG::DataProxy::DataProxy
DataProxy()
Definition: DataProxy.cxx:91
SG::DataProxy_cast
DATA * DataProxy_cast(DataProxy *proxy)
cast the proxy into the concrete data object it proxies
IProxyDict.h
IProxyDict::unboundHandle
virtual void unboundHandle(IResetable *handle)
Tell the store that a handle has been unbound from a proxy.
Definition: IProxyDict.cxx:33
SG::DataProxy::addRef
virtual unsigned long addRef() override final
Add reference to object.
Definition: DataProxy.cxx:313
SG::BaseInfoBase::find
static const BaseInfoBase * find(CLID clid)
Find the BaseInfoBase instance for clid.
Definition: BaseInfo.cxx:569
SG::DataProxy::ErrNo
ErrNo
Definition: DataProxy.h:48
SG::getDataSourcePointerFunc_t
IProxyDict ** getDataSourcePointerFunc_t(const std::string &)
Definition: DataProxy.cxx:33
SG::DataProxy::updateAddress
bool updateAddress()
Definition: DataProxy.cxx:583
SG::sgkey_t
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
Definition: CxxUtils/CxxUtils/sgkey_t.h:32
SG::DataProxy::name
virtual const name_type & name() const override final
Retrieve data object key == string.
RTTAlgmain.address
address
Definition: RTTAlgmain.py:55
SG::DataProxy::resetRef
void resetRef()
Drop the reference to the data object.
Definition: DataProxy.cxx:230
PixelModuleFeMask_create_db.payload
string payload
Definition: PixelModuleFeMask_create_db.py:69
SG::TransientAddress::setAddress
void setAddress(IOpaqueAddress *pAddress)
Retrieve primary clid.
Definition: TransientAddress.cxx:172
ir
int ir
counter of the current depth
Definition: fastadd.cxx:49
SG::DataProxy::reset
void reset(bool hard=false)
Other methods of DataProxy (not in Interface IRegistry):
Definition: DataProxy.cxx:240
SG::Storable_cast
T * Storable_cast(DataObject *pDObj, bool quiet=true, IRegisterTransient *irt=0, bool isConst=true)
Definition: StorableConversions.h:42
SG::DataProxy::setAddress
virtual void setAddress(IOpaqueAddress *ioa) override final
set an IOpaqueAddress
Definition: DataProxy.cxx:400
h
SG::DataProxy::accessDataOol
DataObject * accessDataOol()
Out-of-line part of accessData().
Definition: DataProxy.cxx:497
SG::DataProxy::m_resetFlag
bool m_resetFlag
reset and not delete: default is true
Definition: DataProxy.h:306
TransientAddress.h
SG::BaseInfoBase
The non-template portion of the BaseInfo implementation.
Definition: Control/AthenaKernel/AthenaKernel/BaseInfo.h:451
SG::DataProxy::setConst
void setConst()
Mark this object as const.
Definition: DataProxy.cxx:204
SG::DataProxy::CNVFAILED
@ CNVFAILED
Definition: DataProxy.h:48
SG::DataProxy::isValidAddress
bool isValidAddress() const
is the address valid?
Definition: DataProxy.cxx:566
pickleTool.object
object
Definition: pickleTool.py:30
SG::DataProxy::m_errno
enum ErrNo m_errno
errno-style error code for accessData
Definition: DataProxy.h:353
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
SG::DataProxy::refCount
unsigned long refCount() const
return refCount
Definition: DataProxy.cxx:306
SG::DataProxy::finalReset
void finalReset()
Definition: DataProxy.cxx:250
SG::DataProxy::m_tAddress
TransientAddress m_tAddress
Definition: DataProxy.h:322
python.PyAthena.obj
obj
Definition: PyAthena.py:132
SG::DataProxy::errNo
ErrNo errNo() const
SG::DataProxy::m_mutex
mutex_t m_mutex
Definition: DataProxy.h:339
SG::DataProxy
Definition: DataProxy.h:45
SG::DataProxy::readData
std::unique_ptr< DataObject > readData()
Read in a new copy of the object referenced by this proxy.
Definition: DataProxy.cxx:420
SG::T2pMap
Definition: T2pMap.h:21
SG::DataProxy::m_dataLoader
IConverter * m_dataLoader
Definition: DataProxy.h:324
SG::DataProxy::m_handles
handleList_t m_handles
Definition: DataProxy.h:330
T2pMap.h
DataProxy.h