 |
ATLAS Offline Software
|
Go to the documentation of this file.
11 #include "GaudiKernel/DataObject.h"
12 #include "GaudiKernel/IConverter.h"
13 #include "GaudiKernel/GenericAddress.h"
14 #include "GaudiKernel/MsgStream.h"
15 #include "GaudiKernel/EventContext.h"
16 #include "GaudiKernel/GaudiException.h"
51 static std::string storeName =
"StoreGateSvc";
52 m_storePtr = (*SG::getDataSourcePointerFunc) (storeName);
53 m_store = *m_storePtr;
62 if (*m_storePtr != m_store) {
63 *m_storePtr = m_store;
78 template <
class GAUDIREF>
79 void setGaudiRef(GAUDIREF* pgref, GAUDIREF*& pMember) {
80 if (0 != pgref) pgref->addRef();
81 if (0 != pMember) pMember->release();
86 template <
class GAUDIREF>
87 void resetGaudiRef(GAUDIREF*& pMember) { setGaudiRef((GAUDIREF*)0, pMember); }
92 DataProxy::DataProxy():
95 m_boundHandles(false),
99 m_dataLoader(nullptr),
110 bool constFlag,
bool resetOnly)
112 svc, constFlag, resetOnly)
121 bool constFlag,
bool resetOnly)
122 :
DataProxy (std::move(*tAddr),
svc, constFlag, resetOnly)
130 bool constFlag,
bool resetOnly):
132 m_resetFlag(resetOnly),
133 m_boundHandles(false),
135 m_origConst(constFlag),
137 m_tAddress(std::move(tAddr)),
151 bool constFlag,
bool resetOnly):
153 m_resetFlag(resetOnly),
154 m_boundHandles(false),
156 m_origConst(constFlag),
158 m_tAddress(std::move(*tAddr)),
159 m_dataLoader(nullptr),
170 bool constFlag,
bool resetOnly):
172 m_resetFlag(resetOnly),
173 m_boundHandles(false),
175 m_origConst(constFlag),
177 m_tAddress(std::move(tAddr)),
178 m_dataLoader(nullptr),
211 this->
lock (objLock);
271 for (
auto ih: handles) {
272 if (0 != ih) ih->finalReset();
328 if ( 0 ==
count )
delete this;
359 bool canRelease =
force;
362 MsgStream gLog(
m_ims,
"DataProxy");
365 << (canRelease ?
" release " :
" reset")
367 <<
name() <<
" CLID " <<
clID() <<
" address " << MSG::hex
383 setGaudiRef(dObject, dobj);
386 if (doreg) dobj->setRegistry(
this);
455 MsgStream gLog(
m_ims,
"DataProxy");
457 <<
"readData: ERROR recursive read for object"
459 <<
" Returning NULL DataObject pointer " <<
endmsg;
461 catch (
const GaudiException&) {
462 std::cerr <<
"DataProxy::readData: Problem creating MsgStream\n";
469 IConverter* dataLoader;
497 DataObject*
obj =
nullptr;
503 if (
sc.isSuccess()) {
505 return std::unique_ptr<DataObject>(
obj);
530 MsgStream gLog(
m_ims,
"DataProxy");
532 <<
"accessData: IOA pointer not set" <<
endmsg;
535 MsgStream gLog(
m_ims,
"DataProxy");
537 <<
"accessData: conversion failed for data object "
539 <<
" Returning NULL DataObject pointer " <<
endmsg;
545 DataObject*
obj = obju.release();
557 std::vector<CLID> base_clids = bi->
get_bases();
558 for (
unsigned i=0;
i < base_clids.size(); ++
i) {
566 MsgStream gLog(
m_ims,
"DataProxy");
568 <<
"accessData: ERROR registering object in t2p map"
570 <<
" Returning NULL DataObject pointer " <<
endmsg;
622 DataObject* pObject =
proxy->accessData();
623 if (
nullptr == pObject) {
627 <<
"this proxy " << MSG::hex <<
proxy
628 << MSG::dec <<
" has a NULL data object ptr" <<
endmsg;
639 if (
proxy->transientID(clid) &&
647 if (!
proxy->isConst() &&
653 <<
"Request for a non-const object via copying conversion; "
654 <<
"requested CLID = " << clid
655 <<
", proxy primary ID is " <<
proxy->clID() <<
endmsg ;
667 <<
"Request for an invalid object; requested CLID = "
669 <<
", proxy primary ID is " <<
proxy->clID() <<
endmsg ;
721 EventContext* ctx = SG::DataProxy_cast<EventContext> (
proxy);
722 if (ctx)
return *ctx;
725 static const EventContext emptyContext;
DATA * DataProxy_cast(DataProxy *proxy)
cast the proxy into the concrete data object it proxies
std::vector< IResetable * > handleList_t
list of bound DataHandles
bool m_boundHandles
True if there are any bound handles.
singleton-like access to IMessageSvc via open function and helper
std::atomic< IProxyDict * > m_store
The store of which we are a part.
std::string find(const std::string &s)
return a remapped string
virtual void lock()=0
If the held object derives from ILockable, call lock() on it.
void resetBoundHandles(bool hard)
reset the bound DataHandles If HARD is true, then the bound objects should also clear any data that d...
A non-templated base class for DataBucket, allows to access the transient object address as a void*.
virtual sgkey_t stringToKey(const std::string &str, CLID clid)=0
Find the key for a string/CLID pair.
virtual void registerTransient(void *p) override final
Register a transient object in a t2p map.
virtual void * object()=0
Athena::IMessageSvcHolder m_ims
std::lock_guard< objMutex_t > objLock_t
Temporarily change the current store.
const std::vector< CLID > & get_bases() const
Return the class IDs of all known bases of T (that have class IDs).
void lock(objLock_t &)
Lock the data object we're holding, if any.
virtual StatusCode createObj(IConverter *cvt, IOpaqueAddress *addr, DataObject *&refpObject)
Call converter to create an object, possibly with locking.
Assign a CLID to EventContext.
IMessageSvc * getMessageSvc(bool quiet=false)
void unbindHandle(IResetable *ir)
const std::string & name() const
Get the primary (hashed) SG key.
virtual SG::DataProxy * proxy_exact(SG::sgkey_t sgkey) const =0
Get proxy given a hashed key+clid.
a resetable object (e.g. a SG DataHandle)
bool requestRelease(bool force, bool hard)
Reset/release a proxy at the end of an event.
virtual IOpaqueAddress * address() const override final
Retrieve IOpaqueAddress.
const EventContext & contextFromStore() const
Retrieve the EventContext saved in the owning store.
virtual void boundHandle(IResetable *handle)
Tell the store that a handle has been bound to a proxy.
Manage DataProxy reference in ElementLink/DataLink.
::StatusCode StatusCode
StatusCode definition for legacy code.
static void resetCachedSource()
std::atomic< DataObject * > m_dObject
std::lock_guard< mutex_t > lock_t
CLID clID() const
Retrieve string key:
bool isValid(const EventContext *ctx, bool forceUpdate=false)
cache the pointer to the Address provider which can update this transient address
getDataSourcePointerFunc_t * getDataSourcePointerFunc
Default, invalid implementation of ClassID_traits.
bool t2pRegister(const void *const pTrans, DataProxy *const pPers)
bool m_origConst
Was the proxy created as const?
std::atomic< bool > m_const
Is the proxy currently const?
IProxyDict * store()
Return the store of which we're a part.
AthROOTErrorHandlerSvc * svc
bool bindHandle(IResetable *ir)
void reset()
Retrieve IOpaqueAddress.
uint32_t CLID
The Class ID type.
CLID clID() const
Retrieve clid.
virtual unsigned long release() override final
release reference to object
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.
virtual void unboundHandle(IResetable *handle)
Tell the store that a handle has been unbound from a proxy.
virtual unsigned long addRef() override final
Add reference to object.
static const BaseInfoBase * find(CLID clid)
Find the BaseInfoBase instance for clid.
Helpers for retrieving the payload held by a DataProxy.
IProxyDict ** getDataSourcePointerFunc_t(const std::string &)
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
virtual const name_type & name() const override final
Retrieve data object key == string.
void resetRef()
Drop the reference to the data object.
int ir
counter of the current depth
void reset(bool hard=false)
Other methods of DataProxy (not in Interface IRegistry):
T * Storable_cast(DataObject *pDObj, bool quiet=true, IRegisterTransient *irt=0, bool isConst=true)
virtual void setAddress(IOpaqueAddress *ioa) override final
set an IOpaqueAddress
DataObject * accessDataOol()
Out-of-line part of accessData().
bool m_resetFlag
reset and not delete: default is true
The non-template portion of the BaseInfo implementation.
void setConst()
Mark this object as const.
bool isValidAddress() const
is the address valid?
enum ErrNo m_errno
errno-style error code for accessData
void setAddress(CxxUtils::RefCountedPtr< IOpaqueAddress > pAddress)
Retrieve primary clid.
unsigned long refCount() const
return refCount
TransientAddress m_tAddress
std::unique_ptr< DataObject > readData()
Read in a new copy of the object referenced by this proxy.
IConverter * m_dataLoader