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); }
125 if (svc) svc->addRef();
144 if (svc) svc->addRef();
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");
363 if (gLog.level() <= MSG::VERBOSE) {
364 gLog << MSG::VERBOSE <<
"requestRelease(): "
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;
502 sc = dataLoader->createObj (
address, obj);
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();
550 void* payload = bucket->
object();
551 m_t2p->t2pRegister(payload,
this);
557 std::vector<CLID> base_clids = bi->
get_bases();
558 for (
unsigned i=0; i < base_clids.size(); ++i) {
560 if (bobj && bobj != payload)
561 m_t2p->t2pRegister (bobj,
this);
566 MsgStream gLog(
m_ims,
"DataProxy");
568 <<
"accessData: ERROR registering object in t2p map"
570 <<
" Returning NULL DataObject pointer " <<
endmsg;
618 if (
nullptr == proxy || !proxy->isValid()) {
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 ;
686 m_t2p->t2pRegister (p,
this);
720 if (proxy && proxy->object()) {
722 if (ctx)
return *ctx;
725 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).
Temporarily change the current store.
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 lock(objLock_t &)
Lock the data object we're holding, if any.
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.
enum ErrNo m_errno
errno-style error code for accessData
TransientAddress m_tAddress
void resetOnly(const bool &flag)
set the reset only flag: Clear Store will reset and not delete.
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