 |
ATLAS Offline Software
|
Go to the documentation of this file.
14 #include <unordered_map>
28 #include "GaudiKernel/IClassIDSvc.h"
29 #include "GaudiKernel/IHistorySvc.h"
30 #include "GaudiKernel/ISvcLocator.h"
31 #include "GaudiKernel/IConversionSvc.h"
32 #include "GaudiKernel/Incident.h"
33 #include "GaudiKernel/IOpaqueAddress.h"
34 #include "GaudiKernel/MsgStream.h"
35 #include "GaudiKernel/StatusCode.h"
36 #include "GaudiKernel/DataHistory.h"
74 template <
class T>
void*
ptr(T*
p) {
return static_cast<void*
>(
p); }
104 m_pCLIDSvc(
"ClassIDSvc",
name),
105 m_pDataLoader(
"EventPersistencySvc",
name),
106 m_pPPSHandle(
"ProxyProviderSvc",
name),
108 m_pHistorySvc(
"HistorySvc",
name),
110 m_pIncSvc(
"IncidentSvc",
name),
112 m_ActivateHistory(false),
114 m_pIOVSvc(
"IOVSvc",
name),
115 m_storeLoaded(false),
116 m_remap_impl (
new SG::RemapImpl),
127 declareProperty(
"IncidentSvc",
m_pIncSvc);
168 if (!(
m_pIncSvc.retrieve()).isSuccess()) {
169 error() <<
"Could not locate IncidentSvc "
171 return StatusCode::FAILURE;
187 SG_MSG_DEBUG(
" Failed to preLoad proxies");
188 return StatusCode::FAILURE;
196 return StatusCode::SUCCESS;
211 return StatusCode::SUCCESS;
221 ISvcManager* pISM(
dynamic_cast<ISvcManager*
>(serviceLocator().
get()));
223 return StatusCode::FAILURE;
224 pISM->setPriority(
name(), pISM->getPriority(
name())+1).ignore();
225 verbose() <<
"stop: setting service priority to " << pISM->getPriority(
name())
226 <<
" so that event stores get finalized and cleared before other stores" <<
endmsg;
228 return StatusCode::SUCCESS;
234 if (inc.type() ==
"EndEvent") {
236 SG_MSG_DEBUG(
"Dumping StoreGate Contents");
275 std::ostringstream
s;
287 debug() <<
"Clearing store with forceRemove="
299 return StatusCode::SUCCESS;
310 const bool FORCEREMOVE(
true);
326 const bool FORCEREMOVE(
true);
329 return StatusCode::SUCCESS;
334 static const InterfaceID IID(
"SGImplSvc", 1, 0);
345 if ( IProxyDict::interfaceID().versionMatch(riid) ) {
348 else if ( IProxyDict::interfaceID().versionMatch(riid) ) {
351 else if ( IHiveStoreMgr::interfaceID().versionMatch(riid) ) {
361 return Service::queryInterface(riid, ppvInterface);
364 return StatusCode::SUCCESS;
372 IOpaqueAddress* pAddress,
373 bool clearAddressFlag)
376 assert(0 != pAddress);
377 CLID dataID = pAddress->clID();
381 warning() <<
"recordAddress: Invalid Class ID found in IOpaqueAddress @"
382 << pAddress <<
". IOA will not be recorded"
384 return StatusCode::FAILURE;
393 if (
dp &&
dp->provider()) {
394 std::string clidTypeName;
395 m_pCLIDSvc->getTypeNameOfID(dataID, clidTypeName).ignore();
396 warning() <<
"recordAddress: failed for key="<< skey <<
", type "
398 <<
" (CLID " << dataID <<
')'
399 <<
"\n there is already a persistent version of this object. Will not record a duplicate! "
401 return StatusCode::FAILURE;
416 pAddress, clearAddressFlag),
422 else if ((0 !=
dp) && (0 ==
dp->address()))
426 dp->setAddress(pAddress);
431 m_pCLIDSvc->getTypeNameOfID(dataID, errType).ignore();
432 warning() <<
"recordAddress: preexisting proxy @" <<
dp
433 <<
" with non-NULL IOA found for key "
434 << skey <<
" type " << errType <<
" (" << dataID <<
"). \n"
435 <<
"Cannot record IOpaqueAddress @" << pAddress
437 return StatusCode::FAILURE;
440 return StatusCode::SUCCESS;
451 assert(0 != pAddress);
453 CLID dataID = pAddress->clID();
455 string gK = (pAddress->par())[1];
456 if (gK.empty()) gK = (pAddress->par())[0];
471 if (0 !=
dp->object())
474 warning() <<
" setupProxy:: error setting up proxy for key "
475 << gK <<
" and clid " << dataID
476 <<
"\n Pre-existing valid DataProxy @"<<
dp
477 <<
" found in Store for key " <<
dp->object()->name()
478 <<
" with clid " <<
dp->object()->clID()
484 dp->setObject(pDObj);
485 if (!allowMods)
dp->setConst();
491 !allowMods, resetOnly);
493 warning() <<
" setupProxy:: could not addToStore proxy @" <<
dp
519 bool includeAlias,
bool onlyValid)
523 return store()->
keys(
id, vkeys, includeAlias, onlyValid);
529 return (0 !=
dp) ?
dp->transientID(linkID) :
false;
551 return (
m_pIOVSvc->regFcn(toolName,
c2,fcn,trigger) );
560 auto out_buffer = std::string{};
561 auto out = std::back_inserter(out_buffer);
562 const std::string me =
name();
563 std::format_to(
out,
"{}: <<<<<<<<<<<<<<<<< Data Store Dump >>>>>>>>>>>>>>> \n", me);
564 std::format_to(
out,
"{}: SGImplSvc()::dump() which is {} \n", me,
m_storeLoaded ?
"LOADED" :
"NOT LOADED");
566 DataStore::ConstStoreIterator s_iter, s_end;
569 for (; s_iter != s_end; ++s_iter)
572 CLID id = s_iter->first;
575 m_pCLIDSvc->getTypeNameOfID(
id, tname).ignore();
576 std::format_to(
out,
"{}: Found {} {} for ClassID {} ({}): \n", me, nProxy, ((nProxy == 1) ?
"proxy" :
"proxies"),
id, tname);
582 while (p_iter != p_end) {
584 std::format_to(
out,
"{}: flags: ({:7s}, {:8s}, {:6s}) --- data: {:10p} --- key: {}\n", me,
585 (
dp.isValid() ?
"valid" :
"INVALID"),
586 (
dp.isConst() ?
"locked" :
"UNLOCKED"),
587 (
dp.isResetOnly() ?
"reset" :
"DELETE"),
592 std::format_to(
out,
"{}: <<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>> \n", me);
619 StatusCode::SUCCESS :
629 StatusCode::SUCCESS :
638 warning() <<
"addSymLink: no target DataProxy found. Sorry, can't link to a non-existing data object"
640 return StatusCode::FAILURE;
646 if (
sc.isSuccess() &&
dp->object()) {
662 error() <<
"setAlias: problem setting alias "
664 <<
"DataObject does not exist, record before setting alias."
666 return StatusCode::FAILURE;
670 if (
sc.isFailure()) {
671 error() <<
"setAlias: problem setting alias "
673 <<
"DataObject does not exist, record before setting alias."
675 return StatusCode::FAILURE;
678 return StatusCode::SUCCESS;
683 const std::string&
key,
const std::string& aKey)
690 error() <<
"setAlias: problem setting alias "
691 << std::string(aKey) <<
'\n'
692 <<
"DataObject does not exist, record before setting alias."
694 return StatusCode::FAILURE;
698 if (
sc.isFailure()) {
699 error() <<
"setAlias: problem setting alias "
700 << (std::string)aKey <<
'\n'
701 <<
"DataObject does not exist, record before setting alias."
703 return StatusCode::FAILURE;
706 return StatusCode::SUCCESS;
718 warning() <<
"addAlias: no target DataProxy given, Cannot alias to a non-existing object"
720 return StatusCode::FAILURE;
739 }
catch(...) {
return false; }
748 }
catch(...) {
return false; }
764 return proxy(
id,
false);
782 if (checkValid && 0 !=
dp) {
786 return dp->isValid() ?
dp : 0;
805 if (!
dp)
dbg::print(
stderr,
"::SGImplSvc::proxy(name={}, key={}): data proxy is null, m_pPPS is {}\n", this->
name(), key,
m_pPPS == 0 ?
"NULL" :
"NOT NULL");
811 if (!
dp)
dbg::print(
stderr,
"::SGImplSvc::proxy(name={}, key={}): data proxy is still null\n", this->
name(), key);
817 if (checkValid && 0 !=
dp && !(
dp->isValid())) {
857 const std::string&
key,
862 const void* raw_ptr =
obj.get();
863 const std::type_info* tinfo =
nullptr;
866 raw_ptr = bucket->object();
867 tinfo = &bucket->tinfo();
870 if (returnExisting) {
881 std::string clidTypeName;
883 warning() <<
"SGImplSvc::recordObject: addAlias fails for object "
885 <<
" and new key " <<
key
897 std::string clidTypeName;
900 std::string newclidTypeName;
901 m_pCLIDSvc->getTypeNameOfID(newclid, newclidTypeName).ignore();
902 error() <<
"SGImplSvc::recordObject: addSymLink fails for object "
904 <<
" and new clid " << newclid <<
"[" << newclidTypeName <<
"]"
912 std::string clidTypeName;
915 std::string newclidTypeName;
916 m_pCLIDSvc->getTypeNameOfID(newclid, newclidTypeName).ignore();
917 error() <<
"SGImplSvc::recordObject: existing object found with "
919 <<
" but neither clid " << newclid <<
"[" << newclidTypeName <<
"]"
920 <<
" nor key " <<
key <<
" match."
929 const bool resetOnly =
true;
930 const bool noHist =
false;
933 allowMods, resetOnly, noHist, tinfo,
934 &
proxy,
true).isFailure())
967 std::vector<const SG::DataProxy*>
972 std::vector<const SG::DataProxy*> ret (
proxies.begin(),
proxies.end());
983 DataStore::ConstStoreIterator s_iter, s_end;
986 std::vector<CLID>
clids;
989 for (; s_iter != s_end; ++s_iter ) {
990 const CLID id = s_iter->first;
991 clids.push_back (
id);
1003 return ( (0 !=
dp &&
dp->isValidObject()) ?
dp : 0 );
1011 return (0 == theProxy) ? 0 : theProxy->
accessData();
1019 return (0 == theProxy) ? 0 : theProxy->
accessData();
1024 const std::string& keyA,
const std::string& keyB )
1027 const bool checkValid =
true;
1030 if ( 0 ==
a || 0 ==
b ) {
return false; }
1031 DataObject* objA =
a->accessData();
1032 DataObject* objB =
b->accessData();
1034 if ( 0 == objA || 0 == objB ) {
return false; }
1036 const unsigned int refCntA = objA->addRef();
1037 const unsigned int refCntB = objB->addRef();
1041 a->setObject( objA );
1042 b->setObject( objB );
1044 return ( (refCntA-1) == objA->release() &&
1045 (refCntB-1) == objB->release() );
1050 const void*
const raw_ptr,
1051 bool allowMods,
bool resetOnly,
bool noHist)
1060 const void*
const raw_ptr,
1061 bool allowMods,
bool resetOnly,
bool noHist,
1062 const std::type_info* tinfo)
1071 const void*
const raw_ptr,
1072 bool allowMods,
bool resetOnly,
bool noHist,
1073 const std::type_info* tinfo,
1080 if (
proxy ==
nullptr )
1081 return StatusCode::FAILURE;
1086 return StatusCode::SUCCESS;
1090 return StatusCode::SUCCESS;
1099 const std::string&
key,
1100 const void*
const raw_ptr,
1103 const std::type_info* tinfo)
1110 const bool FORCEREMOVE(
true);
1113 if (
sc.isSuccess()) {
1114 const bool ALLOWOVERWRITE(
true);
1115 const bool NORESET(
false);
1116 if (
record_impl(
obj,
key, raw_ptr, allowMods, NORESET, ALLOWOVERWRITE, tinfo) ==
nullptr)
1117 sc = StatusCode::FAILURE;
1133 const void*
const raw_ptr,
1134 bool allowMods,
bool resetOnly,
bool allowOverwrite,
1135 const std::type_info* tinfo)
1138 std::string rawKey(
key);
1146 const std::string& pTAName(
dp->name());
1155 warning() <<
"record_impl: Could not setup alias key "
1157 <<
" for unversioned object " << pTAName
1172 if (!allowOverwrite &&
m_pPPS) {
1178 if (
dp &&
dp->provider()) {
1179 std::string clidTypeName;
1181 warning() <<
"record_impl: you are recording an object with key "
1182 << rawKey <<
", type " << clidTypeName
1183 <<
" (CLID " <<
clid <<
')'
1184 <<
"\n There is already a persistent version of this object. Recording a duplicate may lead to unreproducible results and it is deprecated."
1192 std::string clidTypeName;
1194 warning() <<
"record_impl: failed for key="<< rawKey <<
", type "
1196 <<
" (CLID " <<
clid <<
')'
1197 <<
"\n object @" << raw_ptr
1198 <<
" already in store with key="<<
dp->name()
1199 <<
". Will not record a duplicate! "
1201 if (pDObj !=
dp->object()) {
1203 if (!pDBB) std::abort();
1214 std::string clidTypeName;
1216 warning() <<
"record_impl: Problem setting up the proxy for object @"
1218 <<
"\n recorded with key " << rawKey
1219 <<
" of type " << clidTypeName
1220 <<
" (CLID " <<
clid <<
") in DataObject @" << pDObj
1228 std::string clidTypeName;
1230 warning() <<
"record_impl: can not add to t2p map object @" <<raw_ptr
1231 <<
"\n with key " << rawKey
1232 <<
" of type " << clidTypeName
1233 <<
" (CLID " <<
clid <<
')'
1248 warning() <<
"record_impl: Could not setup alias key " << vk.
key()
1249 <<
" for VersionedKey " << rawKey
1250 <<
". Generic access to this object with clid" <<
clid
1261 bool checkValid)
const
1265 if (checkValid && 0 !=
dp) {
1266 return dp->isValid() ?
dp : 0;
1278 if (0 ==
proxy)
return StatusCode::FAILURE;
1282 if (bucket) pTrans = bucket->
object();
1293 for (SG::DataProxy::CLIDCont_t::const_iterator
i =
clids.begin();
1343 warning() <<
"setConst: NO Proxy for the dobj you want to set const"
1345 return StatusCode::FAILURE;
1349 return StatusCode::SUCCESS;
1367 const bool FORCEREMOVE(
true);
1396 if (
dp ==
nullptr &&
m_pPPS !=
nullptr) {
1400 if (0 ==
dp)
return false;
1402 if (!
dp->bindHandle(
ir) ) {
1403 fatal() <<
"DataHandle at " << hex <<
ir << dec
1404 <<
" already bound to DataProxy with key " <<
ir->key()
1405 <<
". Cannot bind to proxy " <<
dp->name() <<
" as well\n"
1406 <<
" You have probably registered multiple callbacks via regFcn with the same DataHandle using different keys (DataProxies)\n"
1414 SG_MSG_DEBUG(
" Bound handle " << MSG::hex <<
ir <<
" to proxy "
1429 if (
sc.isFailure())
return false;
1446 if (
sc.isFailure())
return false;
1448 if (
sc.isFailure())
return false;
1457 const std::string&
store,
1458 bool allowMods,
bool resetOnly) {
1465 if (
sc.isFailure() || idname.empty() ) {
1473 const bool ALLOWOVERWRITE(
false);
1474 if (
record_impl(
obj, idname, dho, allowMods, resetOnly, ALLOWOVERWRITE,
1475 &
typeid(DataHistory)) ==
nullptr)
1476 return StatusCode::FAILURE;
1477 return StatusCode::SUCCESS;
1540 const std::string&
str,
1548 <<
" maps to multiple string key/CLID pairs: "
1549 << *str2 <<
"/" << clid2 <<
" and "
1585 SG::DataProxy::CLIDCont_t::const_iterator
i(
clids.begin()),
e(
clids.end());
1591 pP->
reset (hard_reset);
1604 if (
dp->isValidObject()) {
1606 SG::DataProxy::CLIDCont_t::const_iterator
i(
clids.begin()),
e(
clids.end());
1613 dp->reset (hard_reset);
1631 payload.index_offset = index_offset;
1645 sgkey_t& sgkey_out,
size_t& index_out)
1654 index_out = index_in +
payload.index_offset;
1660 const std::string&
key)
1663 DataObject*
obj =
nullptr;
1666 if (
dp &&
dp->isValid()) {
1681 for ( ; s_iter != s_end; ++s_iter ) {
1682 if ( s_iter->second.find(
key ) != s_iter->second.end() ) {
1683 return s_iter->first;
1694 std::vector<CLID>
clids;
1698 for ( ; s_iter != s_end; ++s_iter ) {
1699 if ( s_iter->second.find(
key ) != s_iter->second.end() ) {
1700 clids.push_back(s_iter->first);
1712 const std::type_info* tinfo,
1729 const std::vector<CLID>& bases = bib->
get_bases();
1730 for ( std::size_t
i = 0, iMax = bases.size();
i < iMax; ++
i ) {
1731 if ( bases[
i] !=
clid ) {
1738 warning() <<
"record_impl: Doing auto-symlinks for object with CLID "
1740 <<
" and SG key " <<
key
1741 <<
": Proxy already set for base CLID " << bases[
i]
1742 <<
"; not making auto-symlink." <<
endmsg;
1751 warning() <<
"record_impl: Doing auto-symlinks for object with CLID "
1753 <<
" and SG key " <<
key
1754 <<
": Proxy already set for copy-conversion CLID "
1756 <<
"; not making auto-symlink." <<
endmsg;
1763 warning() <<
"record_impl: Could not find suitable SG::BaseInfoBase for CLID ["
1764 <<
clid <<
"] (" <<
key <<
") !\t"
1765 <<
"No auto-symlink established !"
1777 std::vector<IResetable*> handles;
1780 h->reset (hard_reset);
1834 IOpaqueAddress* addr,
1835 DataObject*& refpObject)
1842 return cvt->createObj (addr, refpObject);
1849 std::cout << sg->
dump() <<
"\n";
1854 f << sg->
dump() <<
"\n";
1872 return dh->begin()->getToken()->dbID().toString();
1894 SG_MSG_DEBUG(
"retrieve(range): no object found "
1895 <<
" of type " << typnam
1896 <<
"(CLID " <<
clid <<
')');
1904 SG_MSG_DEBUG(
"retrieve(range): Can't initialize iterator for object range "
1905 <<
" of type " << typnam
1906 <<
"(CLID " <<
clid <<
')');
1907 return StatusCode::FAILURE;
1910 return StatusCode::SUCCESS;
1915 const std::string&
key,
1922 if (
ptr->hasStore())
return true;
1925 SG_MSG_VERBOSE(
"called associateAux_impl for key " +
key);
1927 if (!
ptr->hasStore()) {
1930 if (!
dp->isConst()) {
1933 ptr->setStore (pAux);
1940 ptr->setStore (pAux);
1950 const std::string&
key,
1954 SG_MSG_VERBOSE(
"called associateAux_impl for key " +
key);
1956 if (!
ptr->hasStore()) {
1959 if (!
dp->isConst()) {
1962 ptr->setStore (pAux);
1969 ptr->setStore (pAux);
JetConstituentVector::iterator iterator
DATA * DataProxy_cast(DataProxy *proxy)
cast the proxy into the concrete data object it proxies
bool mergeStringPool(const SGImplSvc &other)
Merge the string pool from another store into this one.
static bool isVersionedKey(const char *)
quickly determine whether a string has the right format to be a VK
bool associateAux_impl(SG::AuxVectorBase *ptr, const std::string &key, CLID auxclid) const
int typeCount(const CLID &id) const
Count number of object of a given type in store.
StatusCode setAlias(CLID clid, const std::string &key, const std::string &aliasKey)
make an alias to a DataObject (provide data type and old key)
bool contains(const CLID id, const std::string &key) const
Look up a keyed object in TDS by CLID.
virtual StatusCode createObj(IConverter *cvt, IOpaqueAddress *addr, DataObject *&refpObject) override
Call converter to create an object, with locking.
StatusCode addSymLink(const CLID &linkid, SG::DataProxy *dp)
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
StatusCode setConst(const void *pointer)
prevent downstream clients from modifying the pointed-at dobj
SGImplSvc(const SGImplSvc &)=delete
StatusCode t2pRegister(const void *const pTrans, DataProxy *const pPers)
methods to query the T2PMap:
SG::DataProxy * locatePersistent(const SG::TransientAddress *tAddr, bool checkValid=false) const
virtual StatusCode clearStore(bool forceRemove=false) override final
clear DataStore contents: called by the event loop mgrs
virtual void commitNewDataObjects() override final
Reset handles added since the last call to commit.
std::string find(const std::string &s)
return a remapped string
A non-templated base class for DataBucket, allows to access the transient object address as a void*.
virtual SG::DataProxy * recordObject(SG::DataObjectSharedPtr< DataObject > obj, const std::string &key, bool allowMods, bool returnExisting) override final
Record an object in the store.
virtual DataProxy * proxy(const TransientAddress *tAddr) const override
return proxy for a given type/key pair if key is empty returns the default proxy (currently last regi...
virtual StatusCode loadProxies(IProxyRegistry &dataStore)=0
add new proxies to store every Event:
unsigned char version() const
Base class for elements of a container that can have aux data.
virtual void * object()=0
void SG_dump(SGImplSvc *sg)
These are intended to be easy to call from the debugger.
virtual void boundHandle(IResetable *handle) override final
Tell the store that a proxy has been bound to a handle.
virtual StatusCode addAlias(const std::string &aliasKey, DataProxy *proxy) override
add alias to store
StatusCode removeProxy(SG::DataProxy *proxy, const void *pTrans, bool forceRemove=false)
remove proxy from store, unless it is reset only.
IStringPool::sgkey_t sgkey_t
virtual sgkey_t stringToKey(const std::string &str, CLID clid) override final
Find the key for a string/CLID pair.
DataObject * accessData()
Access DataObject on-demand using conversion service.
std::map< std::thread::id, std::vector< IResetable * > > m_newBoundHandles
Keep track of proxies bound since the last call to commitNewDataObjects or clearStore.
static IProxyDict * setStore(IProxyDict *store)
Set the current store.
StatusCode proxyRange(const CLID &id, SG::ConstProxyIterator &beg, SG::ConstProxyIterator &end) const
return a range to all proxies of a given CLID
static const std::type_info * CLIDToTypeinfo(CLID clid)
Translate between CLID and type_info.
mutex_t m_stringPoolMutex
ServiceHandle< IIncidentSvc > m_pIncSvc
property
void emptyTrash()
throw away bad objects
StoreMap::const_iterator ConstStoreIterator
void clearStore(bool force, bool hard, MsgStream *pmlog)
If HARD is true, then the bound objects should also clear any data that depends on the identity of th...
void releaseObject(const CLID &id, const std::string &key)
release object held by proxy, if any.
bool isValid() const
called by destructor
virtual std::vector< const SG::DataProxy * > proxies() const override final
return the list of all current proxies in store
virtual StatusCode reinitialize() override final
Service reinitialization.
SG::sgkey_t sgkey_t
Type of the keys.
const std::vector< CLID > & get_bases() const
Return the class IDs of all known bases of T (that have class IDs).
virtual SG::SourceID sourceID(const std::string &key="EventSelector") const override
Return the metadata source ID for the current event slot.
static bool isAuto(const std::string &)
quickly determine whether a string has the right format to be a VK with auto-generated version #
void setStoreID(StoreID::type id)
Manage index tracking and synchronization of auxiliary data.
StatusCode setState(SG::ConstProxyIterator itr, SG::ConstProxyIterator itrEnd, bool isConst)
Reset state of the iterator.
Manage index tracking and synchronization of auxiliary data.
bool m_ActivateHistory
Activate the history service.
ArenaBase * makeCurrent()
Make this Arena the current one for its ArenaHeader.
TransientAddress::TransientClidSet CLIDCont_t
bool m_storeLoaded
FIXME hack needed by loadEventProxies.
void report(std::ostream &os) const
Generate a report of the memory in use by this Arena.
int m_slotNumber
The Hive slot number for this store, or -1 if this isn't a Hive store.
virtual const std::string * keyToString(sgkey_t key) const override final
Find the string corresponding to a given key.
void clear()
Empty the pool.
virtual StatusCode initialize() override final
Service initialization.
StatusCode typeless_overwrite(const CLID &id, DataObject *obj, const std::string &key, const void *const raw_ptr, bool allowMods, bool noHist=false, const std::type_info *tinfo=0)
same as typeless_record, allows to overwrite an object in memory or on disk
bool bindHandleToProxyAndRegister(const CLID &id, const std::string &key, IResetable *ir, SG::DataProxy *&dp)
Also do registration with IOVSvc.
StoreID::type storeID() const
get store ID. request forwarded to DataStore:
virtual void unboundHandle(IResetable *handle) override final
Tell the store that a handle has been unbound from a proxy.
DataObject * asStorable(SG::DataObjectSharedPtr< T > pObject)
a resetable object (e.g. a SG DataHandle)
ServiceHandle< IConversionSvc > m_pDataLoader
bool m_DumpStore
Dump Property flag: triggers dump() at EndEvent.
msgSvc
Provide convenience handles for various services.
std::vector< CLID > clids() const
Return all CLIDs in the store.
bool bindHandleToProxy(const CLID &id, const std::string &key, IResetable *ir, SG::DataProxy *&dp)
name says it all
IStringPool::sgkey_t sgkey_t
::StatusCode StatusCode
StatusCode definition for legacy code.
void reset()
Reset all contained allocators.
SG::Arena m_arena
Allocation arena to associate with this store.
a StoreGateSvc key with a version number. Notice that StoreGate does not order multiple instances of ...
SG::StringPool m_stringpool
Default, invalid implementation of ClassID_traits.
Maintain a mapping of strings to 64-bit ints.
DataObject * accessData(const CLID &id) const
find proxy and access its data. Returns 0 to flag failure
StatusCode addSymLink(const CLID &linkid, DataProxy *proxy)
add symlink to store:
void clearProxyPayload(SG::DataProxy *)
use to reset a proxy (clearing the data object it contains) Unlike DataProxy::reset this method corre...
SG::DataProxy * setupProxy(const CLID &dataID, const std::string &gK, DataObject *pDObj, bool allowMods, bool resetOnly)
try to locate a proxy or create it if needed
boost::function< StatusCode(IOVSVC_CALLBACK_ARGS) > IOVSvcCallBackFcn
the type of an IOVSvc call back: it wraps both the method and the object the method is called on
std::vector< CLID > get_copy_conversions() const
Return known copy conversions.
The Athena Transient Store API.
#define CHECK(...)
Evaluate an expression and check for errors.
bool transientContains(const CLID id, const std::string &key) const
Look up a transient data object in TDS only by CLID.
ServiceHandle< IHistorySvc > m_pHistorySvc
const std::string * keyToString(sgkey_t key) const
Find the string corresponding to a given key.
AthROOTErrorHandlerSvc * svc
StatusCode remove(const void *pObject)
Remove pObject, will remove its proxy if not reset only.
void remap_impl(sgkey_t source, sgkey_t target, off_t index_offset)
Declare a remapping.
void erase()
Erase all contained allocators.
SG::DataProxy * record_impl(DataObject *obj, const std::string &key, const void *const raw_ptr, bool allowMods, bool resetOnly, bool allowOverwrite, const std::type_info *tinfo)
real recording of an object with a key, allow possibility of specifying const-access
virtual bool tryELRemap(sgkey_t sgkey_in, size_t index_in, sgkey_t &sgkey_out, size_t &index_out) override final
Test to see if the target of an ElementLink has moved.
virtual StatusCode preLoadProxies(IProxyRegistry &dataStore)=0
add proxies to the store before Begin Event:
uint32_t CLID
The Class ID type.
CLID clID() const
Retrieve clid.
virtual ~SGImplSvc() override final
Standard Destructor.
void msg_update_handler(Gaudi::Details::PropertyBase &outputLevel)
callback for output level property
virtual StatusCode finalize() override final
Service finalization.
virtual StoreID::type storeID() const override
virtual SG::DataProxy * retrieveProxy(const CLID &id, const std::string &key, IProxyRegistry &dataStore)=0
Use a provider to create a proxy for ID/KEY.
StatusCode recordAddress(const std::string &skey, IOpaqueAddress *pAddress, bool clearAddressFlag=true)
Create a proxy object using an IOpaqueAddress and a transient key.
StatusCode retrieve(CLID clid, SG::detail::IteratorBase &cibegin, SG::detail::IteratorBase &ciend) const
Retrieve all objects of type T: returns an SG::ConstIterator range.
std::string dump() const
dump objects in store.
virtual void registerKey(sgkey_t key, const std::string &str, CLID clidid) override final
Remember an additional mapping from key to string/CLID.
void setStoreID(StoreID::type id)
set store ID. request forwarded to DataStore:
int typeCount(const CLID &id) const
Return the number of instances of type T (input CLID)
StatusCode record_HistObj(const CLID &id, const std::string &key, const std::string &store, bool allowMods, bool resetOnly=true)
std::string to_string(const DetectorType &type)
static const BaseInfoBase * find(CLID clid)
Find the BaseInfoBase instance for clid.
StatusCode removeDataAndProxy(const void *pObject)
Remove pObject and its proxy no matter what.
void recycle(DataObject *pBadDObj)
put a bad (unrecordable) dobj away
bool m_DumpArena
DumpArena Property flag : trigger m_arena->report() at clearStore.
Helpers for checking error return status codes and reporting errors.
void keys(const CLID &id, std::vector< std::string > &vkeys, bool includeAlias, bool onlyValid)
CLID clid(const std::string &key) const
Retrieve the main CLID of the object recorded in StoreGate with the given "key" WARNING: slow!
StatusCode typeless_record(DataObject *obj, const std::string &key, const void *const raw_ptr, bool allowMods, bool resetOnly=true, bool noHist=false)
type-less recording of an object with a key, allow possibility of specifying const-access and history...
const std::string & rawVersionKey() const
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
the interface through which HiveWB control StoreGate instances
Incident sent after a store is cleared.
virtual const name_type & name() const override final
Retrieve data object key == string.
DataProxy * locatePersistent(const void *const pTransient) const
locate the persistent (proxy) for a given T* (void*):
virtual StatusCode queryInterface(const InterfaceID &riid, void **ppvInterface) override final
static const InterfaceID & interfaceID()
Should rather be in ISGImplSvc.h if we had one.
int m_numSlots
The total number of slots. 1 if this isn't a Hive store.
StatusCode symLink(const void *p2BRegistered, CLID linkID)
make a soft link to the object T* already registered
virtual StatusCode addToStore(CLID id, SG::DataProxy *proxy) override final
Raw addition of a proxy to the store.
ServiceHandle< IClassIDSvc > m_pCLIDSvc
StatusCode addAlias(const std::string &aliasKey, SG::DataProxy *dp)
#define REPORT_MESSAGE(LVL)
Report a message.
virtual void handle(const Incident &) override final
triggered by Incident service
Interface for non-const operations on an auxiliary store.
const std::string & key() const
a static registry of CLID->typeName entries. NOT for general use. Use ClassIDSvc instead.
int ir
counter of the current depth
bool isValidObject() const
is the object valid?
virtual StatusCode addToStore(const CLID &id, DataProxy *proxy) override
add proxy to store.
bool hasAlias(const std::string &key) const
Test to see if a given string is in the alias set.
SG::DataProxy * transientProxy(const CLID &id, const std::string &key) const
get proxy with given id and key.
virtual SG::DataProxy * proxy_exact(sgkey_t sgkey) const override
get proxy with given key.
void reset(bool hard=false)
Other methods of DataProxy (not in Interface IRegistry):
ServiceHandle< IIOVSvc > m_pIOVSvc
get the IOVSvc "just in time" (breaks recursion at initialize)
void makeCurrent()
The current store is becoming the active store.
bool transientID(CLID id) const
return the list of transient IDs (primary or symLinked):
std::list< DataObject * > m_trash
The Recycle Bin.
Hold DataProxy instances associated with a store.
const std::vector< DataProxy * > & proxies() const
All proxies managed by this store.
static StoreID::type findStoreID(const std::string &storeName)
std::unordered_map< sgkey_t, T > SGKeyMap
A map using sgkey_t as a key.
The non-template portion of the BaseInfo implementation.
void t2pRemove(const void *const pTrans)
virtual StatusCode stop() override final
Service stop.
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Interface for non-const operations on an auxiliary store.
IProxyProviderSvc * m_pPPS
virtual void relinquish()=0
Give up ownership of the DataBucket contents.
StatusCode pRange(const CLID &id, SG::ConstProxyIterator &f, SG::ConstProxyIterator &e) const
Return an iterator over proxy for a given CLID:
std::lock_guard< mutex_t > lock_t
StatusCode removeProxy(DataProxy *proxy, bool forceRemove, bool hard)
remove proxy from store, unless proxy is reset only.
bool merge(const StringPool &other)
Merge another pool into this one.
void setSlotNumber(int slot, int numSlots)
Set the Hive slot number for this store.
void print(std::FILE *stream, std::format_string< Args... > fmt, Args &&... args)
#define ATLAS_THREAD_SAFE
Smart pointer to manage DataObject reference counts.
std::string createKey(const CLID &dataID)
creates a key internally if none specified by client
virtual SG::DataProxy * proxy_exact(SG::sgkey_t sgkey) const override final
Get proxy given a hashed key+clid.
sgkey_t stringToKey(const std::string &str, sgaux_t aux=0)
Find the key for a string.
Interface for const operations on an auxiliary store.
Interface for const operations on an auxiliary store.
Define macros for attributes used to control the static checker.
void t2pRemove(const void *const pTrans)
forwarded to DataStore
ServiceHandle< IProxyProviderSvc > m_pPPSHandle
StatusCode regFcn(const CallBackID &c1, const CallBackID &c2, const IOVSvcCallBackFcn &fcn, bool trigger=false)
register a callback function(2) with an already registered function(1)
virtual StatusCode start() override final
Service start.
virtual SG::DataProxy * proxy(const void *const pTransient) const override final
get proxy for a given data object address in memory
bool isSymLinked(const CLID &linkID, SG::DataProxy *dp)
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
StatusCode tRange(ConstStoreIterator &f, ConstStoreIterator &e) const
Return an iterator over the StoreMap:
StatusCode t2pRegister(const void *const pTrans, SG::DataProxy *const pPers)
forwarded to DataStore
SG::DataProxy * proxy_exact_unlocked(sgkey_t sgkey, std::recursive_mutex &mutex) const
Like proxy_exact, but intended to be called without holding the store lock.
SGKeyMap< remap_t > remap_map_t
const std::string & name() const
Return this Arena's name.
DataObject * typeless_retrievePrivateCopy(const CLID clid, const std::string &key)
ProxyMap::const_iterator ConstProxyIterator
bool registerKey(sgkey_t key, const std::string &str, sgaux_t aux=0)
Remember an additional mapping from key to string.
void addAutoSymLinks(const std::string &key, CLID clid, SG::DataProxy *dp, const std::type_info *tinfo, bool warn_nobib=true)
Add automatically-made symlinks for DP.
SG::RemapImpl * m_remap_impl
bool transientSwap(const CLID &id, const std::string &keyA, const std::string &keyB)
swap the content of 2 keys payload A indexed by keyA will now be accessed via keyB and vice versa Not...
void keys(const CLID &id, std::vector< std::string > &vkeys, bool includeAlias=false, bool onlyValid=true)
provide list of all StoreGate keys associated with an object.
StatusCode loadEventProxies()
load proxies at begin event