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;
54 if (store && store != m_store) {
62 if (*m_storePtr != m_store) {
63 *m_storePtr = m_store;
69 IProxyDict** m_storePtr;
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); }
115 if (svc) svc->addRef();
128 if (svc) svc->addRef();
246 for (
auto ih: handles) {
247 if (0 != ih) ih->finalReset();
303 if ( 0 ==
count )
delete this;
334 bool canRelease = force;
337 MsgStream gLog(
m_ims,
"DataProxy");
338 if (gLog.level() <= MSG::VERBOSE) {
339 gLog << MSG::VERBOSE <<
"requestRelease(): "
340 << (canRelease ?
" release " :
" reset")
342 <<
name() <<
" CLID " <<
clID() <<
" address " << MSG::hex
343 << object() << MSG::dec <<
endmsg;
357 DataObject* dobj =
m_dObject.exchange (
nullptr);
358 std::atomic_thread_fence (std::memory_order_seq_cst);
359 setGaudiRef(dObject, dobj);
361 if (doreg) dobj->setRegistry(
this);
367 std::atomic_thread_fence (std::memory_order_seq_cst);
435 MsgStream gLog(
m_ims,
"DataProxy");
437 <<
"readData: ERROR recursive read for object"
439 <<
" Returning NULL DataObject pointer " <<
endmsg;
441 catch (
const GaudiException&) {
442 std::cerr <<
"DataProxy::readData: Problem creating MsgStream\n";
449 IConverter* dataLoader;
475 SG::CurrentEventStore::Push push (
store);
477 DataObject* obj =
nullptr;
482 sc = dataLoader->createObj (
address, obj);
483 if (
sc.isSuccess()) {
485 return std::unique_ptr<DataObject>(obj);
488 MsgStream gLog(
m_ims,
"DataProxy");
490 <<
"readData: no address for " <<
clID() <<
"/" <<
name()
491 <<
" but validAddress returned true. You may be trying to retrieve"
492 <<
" alignments during initialization without having defined a campaign."
517 std::unique_ptr<DataObject> obju =
readData (objLock, &m_errno);
519 if (m_errno ==
NOIOA) {
520 MsgStream gLog(
m_ims,
"DataProxy");
522 <<
"accessData: IOA pointer not set" <<
endmsg;
525 MsgStream gLog(
m_ims,
"DataProxy");
527 <<
"accessData: conversion failed for data object "
529 <<
" Returning NULL DataObject pointer " <<
endmsg;
538 void* payload = bucket->
object();
539 m_t2p->t2pRegister(payload,
this);
545 std::vector<CLID> base_clids = bi->
get_bases();
546 for (
unsigned i=0; i < base_clids.size(); ++i) {
549 if (bobj && bobj != payload)
550 m_t2p->t2pRegister (bobj,
this);
555 MsgStream gLog(
m_ims,
"DataProxy");
557 <<
"accessData: ERROR registering object in t2p map"
559 <<
" Returning NULL DataObject pointer " <<
endmsg;
571 std::atomic_thread_fence (std::memory_order_seq_cst);
572 setObject(objLock, obju.release(),
true);
615 if (
nullptr == proxy || !proxy->isValid()) {
619 DataObject* pObject = proxy->accessData();
620 if (
nullptr == pObject) {
624 <<
"this proxy " << MSG::hex << proxy
625 << MSG::dec <<
" has a NULL data object ptr" <<
endmsg;
630 void* result =
SG::Storable_cast (pObject, clid, tinfo,
true, proxy, proxy->isConst());
631 if (
nullptr == result) {
636 if (proxy->transientID(clid) &&
644 if (!proxy->isConst() &&
650 <<
"Request for a non-const object via copying conversion; "
651 <<
"requested CLID = " << clid
652 <<
", proxy primary ID is " << proxy->clID() <<
endmsg ;
657 result = db->object();
664 <<
"Request for an invalid object; requested CLID = "
666 <<
", proxy primary ID is " << proxy->clID() <<
endmsg ;
683 m_t2p->t2pRegister (p,
this);
716 if (proxy && proxy->object()) {
718 if (ctx)
return *ctx;
721 static const EventContext emptyContext;
Helpers for retrieving the payload held by a DataProxy.
Assign a CLID to EventContext.
uint32_t CLID
The Class ID type.
Header file for AthHistogramAlgorithm.
Simple smart pointer for Gaudi-style refcounted objects.
A non-templated base class for DataBucket, allows to access the transient object address as a void*.
virtual void lock()=0
If the held object derives from ILockable, call lock() on it.
virtual void * object()=0
The non-template portion of the BaseInfo implementation.
static const BaseInfoBase * find(CLID clid)
Find the BaseInfoBase instance for clid.
const std::vector< CLID > & get_bases() const
Return the class IDs of all known bases of T (that have class IDs).
Manage DataProxy reference in ElementLink/DataLink.
static void resetCachedSource()
CLID clID() const
Retrieve clid.
void resetBoundHandles(bool hard)
reset the bound DataHandles If HARD is true, then the bound objects should also clear any data that d...
std::lock_guard< objMutex_t > objLock_t
virtual const name_type & name() const override final
Retrieve data object key == string.
std::vector< IResetable * > handleList_t
list of bound DataHandles
IConverter * m_dataLoader
void setConst()
Mark this object as const.
DataObject * accessDataOol()
Out-of-line part of accessData().
bool requestRelease(bool force, bool hard)
Reset/release a proxy at the end of an event.
virtual void setAddress(IOpaqueAddress *ioa) override final
set an IOpaqueAddress
std::unique_ptr< DataObject > readData()
Read in a new copy of the object referenced by this proxy.
bool m_resetFlag
reset and not delete: default is true
bool m_boundHandles
True if there are any bound handles.
virtual void registerTransient(void *p) override final
Register a transient object in a t2p map.
virtual IOpaqueAddress * address() const override final
Retrieve IOpaqueAddress.
virtual unsigned long release() override final
release reference to object
void reset(bool hard=false)
Other methods of DataProxy (not in Interface IRegistry):
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.
IProxyDict * store()
Return the store of which we're a part.
bool isValidAddress() const
is the address valid?
void resetRef()
Drop the reference to the data object.
TransientAddress m_tAddress
void resetOnly(const bool &flag)
set the reset only flag: Clear Store will reset and not delete.
void lock(objLock_t &, DataObject *dobj)
Lock the data object we're holding, if any.
std::atomic< IProxyDict * > m_store
The store of which we are a part.
Athena::IMessageSvcHolder m_ims
std::atomic< DataObject * > m_dObject
void unbindHandle(IResetable *ir)
std::atomic< bool > m_const
Is the proxy currently const?
unsigned long refCount() const
return refCount
bool m_origConst
Was the proxy created as const?
bool bindHandle(IResetable *ir)
const EventContext & contextFromStore() const
Retrieve the EventContext saved in the owning store.
std::lock_guard< mutex_t > lock_t
virtual unsigned long addRef() override final
Add reference to object.
int ir
counter of the current depth
singleton-like access to IMessageSvc via open function and helper
std::string find(const std::string &s)
return a remapped string
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
IMessageSvc * getMessageSvc(bool quiet=false)
DATA * DataProxy_cast(DataProxy *proxy)
cast the proxy into the concrete data object it proxies
T * Storable_cast(DataObject *pDObj, bool quiet=true, IRegisterTransient *irt=0, bool isConst=true)
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
IProxyDict ** getDataSourcePointerFunc_t(const std::string &)
getDataSourcePointerFunc_t * getDataSourcePointerFunc
virtual void lock() override
Lock the container.
static constexpr CLID ID()