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"
70template <
class...
Args>
void print(std::FILE* stream, std::format_string<Args...>
fmt,
Args&&... args) {
71 std::fputs(std::format(
fmt, std::forward<Args>(args)...), stream);
74template <
class T>
void*
ptr(T* p) {
return static_cast<void*
>(p); }
103 : base_class(name, svc),
127 declareProperty(
"IncidentSvc",
m_pIncSvc);
151 CHECK( Service::initialize() );
165 SG::CurrentEventStore::setStore (
this);
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");
237 info() <<
'\n' <<
dump() << endl
245 StatusCode
sc(StatusCode::SUCCESS);
251 dbg::print(stderr,
"SGImplSvc::loadEventProxies() LOADED PROXIES on {}\n", name());
254 dbg::print(stderr,
"SGImplSvc::loadEventProxies() PROXIES ALREADY LOADED on {}\n", name());
264 return std::to_string(
m_pStore->typeCount(
id) + 1);
271 dbg::print(stderr,
"SGImplSvc::clearStore(forceRemove={}) on {}\n", forceRemove, name());
275 std::ostringstream s;
277 info() <<
"Report for Arena: " <<
m_arena.name() <<
'\n'
287 debug() <<
"Clearing store with forceRemove="
290 m_pStore->clearStore(forceRemove, hard_reset, &msgStream(MSG::DEBUG));
299 return StatusCode::SUCCESS;
310 const bool FORCEREMOVE(
true);
320 return Service::finalize();
326 const bool FORCEREMOVE(
true);
329 return StatusCode::SUCCESS;
338 bool clearAddressFlag,
339 const std::vector<CLID>& bases)
342 assert(0 != pAddress);
343 CLID dataID = pAddress->clID();
347 warning() <<
"recordAddress: Invalid Class ID found in IOpaqueAddress @"
348 << pAddress.
get() <<
". IOA will not be recorded"
350 return StatusCode::FAILURE;
359 if (dp && dp->provider()) {
360 std::string clidTypeName;
361 m_pCLIDSvc->getTypeNameOfID(dataID, clidTypeName).ignore();
362 warning() <<
"recordAddress: failed for key="<< skey <<
", type "
364 <<
" (CLID " << dataID <<
')'
365 <<
"\n there is already a persistent version of this object. Will not record a duplicate! "
367 return StatusCode::FAILURE;
373 if (0 == dp && 0 !=
m_pPPS) {
385 m_pStore->addToStore(dataID, dp).ignore();
390 for (
CLID b : bases) {
392 warning() << std::format (
"Can't add extra base {} for object {}/{}",
393 b, dataID, skey) <<
endmsg;
397 else if ((0 != dp) && (0 == dp->address()))
401 dp->setAddress(std::move(pAddress));
406 m_pCLIDSvc->getTypeNameOfID(dataID, errType).ignore();
407 warning() <<
"recordAddress: preexisting proxy @" << dp
408 <<
" with non-NULL IOA found for key "
409 << skey <<
" type " << errType <<
" (" << dataID <<
"). \n"
410 <<
"Cannot record IOpaqueAddress @" << pAddress.
get()
412 return StatusCode::FAILURE;
415 return StatusCode::SUCCESS;
424 bool clearAddressFlag,
425 const std::vector<CLID>& bases)
428 assert(0 != pAddress);
430 CLID dataID = pAddress->clID();
432 string gK = (pAddress->par())[1];
433 if (gK.empty()) gK = (pAddress->par())[0];
436 return this->
recordAddress(gK, std::move(pAddress), clearAddressFlag, bases);
448 if (0 != dp->object())
451 warning() <<
" setupProxy:: error setting up proxy for key "
452 << gK <<
" and clid " << dataID
453 <<
"\n Pre-existing valid DataProxy @"<< dp
454 <<
" found in Store for key " << dp->object()->name()
455 <<
" with clid " << dp->object()->clID()
461 dp->setObject(pDObj);
462 if (!allowMods) dp->setConst();
468 !allowMods, resetOnly);
469 if (!(
m_pStore->addToStore(dataID, dp).isSuccess())) {
470 warning() <<
" setupProxy:: could not addToStore proxy @" << dp
496 bool includeAlias,
bool onlyValid)
500 return store()->
keys(
id, vkeys, includeAlias, onlyValid);
506 return (0 != dp) ? dp->transientID(linkID) :
false;
514 auto out_buffer = std::string{};
515 auto out = std::back_inserter(out_buffer);
516 const std::string me = name();
517 std::format_to(out,
"{}: <<<<<<<<<<<<<<<<< Data Store Dump >>>>>>>>>>>>>>> \n", me);
518 std::format_to(out,
"{}: SGImplSvc()::dump() which is {} \n", me,
m_storeLoaded ?
"LOADED" :
"NOT LOADED");
523 for (; s_iter != s_end; ++s_iter)
526 CLID id = s_iter->first;
529 m_pCLIDSvc->getTypeNameOfID(
id, tname).ignore();
530 std::format_to(out,
"{}: Found {} {} for ClassID {} ({}): \n", me, nProxy, ((nProxy == 1) ?
"proxy" :
"proxies"),
id, tname);
536 while (p_iter != p_end) {
538 std::format_to(out,
"{}: flags: ({:7s}, {:8s}, {:6s}) --- data: {:10p} --- key: {}\n", me,
539 (dp.isValid() ?
"valid" :
"INVALID"),
540 (dp.isConst() ?
"locked" :
"UNLOCKED"),
541 (dp.isResetOnly() ?
"reset" :
"DELETE"),
542 dbg::ptr(dp.object()), p_iter->first);
546 std::format_to(out,
"{}: <<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>> \n", me);
573 StatusCode::SUCCESS :
583 StatusCode::SUCCESS :
592 warning() <<
"addSymLink: no target DataProxy found. Sorry, can't link to a non-existing data object"
594 return StatusCode::FAILURE;
596 StatusCode
sc =
m_pStore->addSymLink(linkid, dp);
600 if (
sc.isSuccess() && dp->object()) {
616 error() <<
"setAlias: problem setting alias "
618 <<
"DataObject does not exist, record before setting alias."
620 return StatusCode::FAILURE;
624 if (
sc.isFailure()) {
625 error() <<
"setAlias: problem setting alias "
627 <<
"DataObject does not exist, record before setting alias."
629 return StatusCode::FAILURE;
632 return StatusCode::SUCCESS;
637 const std::string& key,
const std::string& aKey)
644 error() <<
"setAlias: problem setting alias "
645 << std::string(aKey) <<
'\n'
646 <<
"DataObject does not exist, record before setting alias."
648 return StatusCode::FAILURE;
652 if (
sc.isFailure()) {
653 error() <<
"setAlias: problem setting alias "
654 << (std::string)aKey <<
'\n'
655 <<
"DataObject does not exist, record before setting alias."
657 return StatusCode::FAILURE;
660 return StatusCode::SUCCESS;
672 warning() <<
"addAlias: no target DataProxy given, Cannot alias to a non-existing object"
674 return StatusCode::FAILURE;
692 return (0 !=
proxy(
id, key,
true));
693 }
catch(...) {
return false; }
702 }
catch(...) {
return false; }
712 return m_pStore->locatePersistent(pTransient);
718 return proxy(
id,
false);
728 if (0 == dp && 0 !=
m_pPPS) {
730 dp =
m_pPPS->retrieveProxy(
id,
string(
"DEFAULT"), *pStore);
736 if (checkValid && 0 != dp) {
740 return dp->isValid() ? dp : 0;
748 return proxy(
id, key,
false);
759 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");
761 if (0 == dp && 0 !=
m_pPPS) {
763 dp =
m_pPPS->retrieveProxy(
id, key, *pStore);
765 if (!dp)
dbg::print(stderr,
"::SGImplSvc::proxy(name={}, key={}): data proxy is still null\n", this->name(), key);
771 if (checkValid && 0 != dp && !(dp->isValid())) {
811 const std::string& key,
816 const void* raw_ptr = obj.get();
817 const std::type_info* tinfo =
nullptr;
820 raw_ptr = bucket->object();
821 tinfo = &bucket->tinfo();
824 if (returnExisting) {
831 if (
proxy->transientID (obj->clID())) {
835 std::string clidTypeName;
837 warning() <<
"SGImplSvc::recordObject: addAlias fails for object "
838 <<
clid <<
"[" << clidTypeName <<
"] " <<
proxy->name()
839 <<
" and new key " << key
846 else if (key ==
proxy->name() ||
proxy->hasAlias(key) > 0)
851 std::string clidTypeName;
853 CLID newclid = obj->clID();
854 std::string newclidTypeName;
855 m_pCLIDSvc->getTypeNameOfID(newclid, newclidTypeName).ignore();
856 error() <<
"SGImplSvc::recordObject: addSymLink fails for object "
857 <<
clid <<
"[" << clidTypeName <<
"] " <<
proxy->name()
858 <<
" and new clid " << newclid <<
"[" << newclidTypeName <<
"]"
866 std::string clidTypeName;
868 CLID newclid = obj->clID();
869 std::string newclidTypeName;
870 m_pCLIDSvc->getTypeNameOfID(newclid, newclidTypeName).ignore();
871 error() <<
"SGImplSvc::recordObject: existing object found with "
872 <<
clid <<
"[" << clidTypeName <<
"] " <<
proxy->name()
873 <<
" but neither clid " << newclid <<
"[" << newclidTypeName <<
"]"
874 <<
" nor key " << key <<
" match."
883 const bool resetOnly =
true;
884 const bool noHist =
false;
887 allowMods, resetOnly, noHist, tinfo,
888 &
proxy,
true).isFailure())
921std::vector<const SG::DataProxy*>
926 std::vector<const SG::DataProxy*> ret (
proxies.begin(),
proxies.end());
940 std::vector<CLID>
clids;
941 clids.reserve( distance( s_iter, s_end ) );
943 for (; s_iter != s_end; ++s_iter ) {
944 const CLID id = s_iter->first;
945 clids.push_back (
id);
957 return ( (0 != dp && dp->isValidObject()) ? dp : 0 );
965 return (0 == theProxy) ? 0 : theProxy->
accessData();
973 return (0 == theProxy) ? 0 : theProxy->
accessData();
978 const std::string& keyA,
const std::string& keyB )
981 const bool checkValid =
true;
984 if ( 0 ==
a || 0 == b ) {
return false; }
985 DataObject* objA =
a->accessData();
986 DataObject* objB = b->accessData();
988 if ( 0 == objA || 0 == objB ) {
return false; }
990 const unsigned int refCntA = objA->addRef();
991 const unsigned int refCntB = objB->addRef();
995 a->setObject( objA );
996 b->setObject( objB );
998 return ( (refCntA-1) == objA->release() &&
999 (refCntB-1) == objB->release() );
1004 const void*
const raw_ptr,
1005 bool allowMods,
bool resetOnly,
bool noHist)
1007 return typeless_record (obj, key, raw_ptr, allowMods, resetOnly, noHist, 0,
1014 const void*
const raw_ptr,
1015 bool allowMods,
bool resetOnly,
bool noHist,
1016 const std::type_info* tinfo)
1018 return typeless_record (obj, key, raw_ptr, allowMods, resetOnly, noHist,tinfo,
1025 const void*
const raw_ptr,
1026 bool allowMods,
bool resetOnly,
bool noHist,
1027 const std::type_info* tinfo,
1033 record_impl( obj, key, raw_ptr, allowMods, resetOnly, !noOverwrite, tinfo);
1034 if (
proxy ==
nullptr )
1035 return StatusCode::FAILURE;
1040 return StatusCode::SUCCESS;
1044 return StatusCode::SUCCESS;
1046 return record_HistObj( obj->clID(), key, name(), allowMods, resetOnly );
1053 const std::string& key,
1054 const void*
const raw_ptr,
1057 const std::type_info* tinfo)
1060 StatusCode
sc(StatusCode::SUCCESS);
1062 if (0 != toRemove) {
1064 const bool FORCEREMOVE(
true);
1067 if (
sc.isSuccess()) {
1068 const bool ALLOWOVERWRITE(
true);
1069 const bool NORESET(
false);
1070 if (
record_impl( obj, key, raw_ptr, allowMods, NORESET, ALLOWOVERWRITE, tinfo) ==
nullptr)
1071 sc = StatusCode::FAILURE;
1081 toRemove->release();
1087 const void*
const raw_ptr,
1088 bool allowMods,
bool resetOnly,
bool allowOverwrite,
1089 const std::type_info* tinfo)
1092 std::string rawKey(key);
1100 const std::string& pTAName(dp->name());
1109 warning() <<
"record_impl: Could not setup alias key "
1111 <<
" for unversioned object " << pTAName
1126 if (!allowOverwrite &&
m_pPPS) {
1132 if (dp && dp->provider()) {
1133 std::string clidTypeName;
1135 warning() <<
"record_impl: you are recording an object with key "
1136 << rawKey <<
", type " << clidTypeName
1137 <<
" (CLID " <<
clid <<
')'
1138 <<
"\n There is already a persistent version of this object. Recording a duplicate may lead to unreproducible results and it is deprecated."
1146 std::string clidTypeName;
1148 warning() <<
"record_impl: failed for key="<< rawKey <<
", type "
1150 <<
" (CLID " <<
clid <<
')'
1151 <<
"\n object @" << raw_ptr
1152 <<
" already in store with key="<< dp->name()
1153 <<
". Will not record a duplicate! "
1155 if (pDObj != dp->object()) {
1157 if (!pDBB) std::abort();
1168 std::string clidTypeName;
1170 warning() <<
"record_impl: Problem setting up the proxy for object @"
1172 <<
"\n recorded with key " << rawKey
1173 <<
" of type " << clidTypeName
1174 <<
" (CLID " <<
clid <<
") in DataObject @" << pDObj
1181 if ( !(this->
t2pRegister( raw_ptr, dp )).isSuccess() ) {
1182 std::string clidTypeName;
1184 warning() <<
"record_impl: can not add to t2p map object @" <<raw_ptr
1185 <<
"\n with key " << rawKey
1186 <<
" of type " << clidTypeName
1187 <<
" (CLID " <<
clid <<
')'
1201 if (!(this->
addAlias(vk.
key(), dp)).isSuccess()) {
1202 warning() <<
"record_impl: Could not setup alias key " << vk.
key()
1203 <<
" for VersionedKey " << rawKey
1204 <<
". Generic access to this object with clid" <<
clid
1215 bool checkValid)
const
1219 if (checkValid && 0 != dp) {
1220 return dp->isValid() ? dp : 0;
1232 if (0 ==
proxy)
return StatusCode::FAILURE;
1236 if (bucket) pTrans = bucket->
object();
1244 if (
proxy->isValidObject()) {
1247 for (SG::DataProxy::CLIDCont_t::const_iterator i =
clids.begin();
1263 return m_pStore->t2pRegister(pTrans, pPers);
1277 updateMsgStreamOutputLevel( outputLevel() );
1278 msgSvc()->setOutputLevel(name(), outputLevel());
1286 return m_pStore->pRange(
id,begin,end);
1297 warning() <<
"setConst: NO Proxy for the dobj you want to set const"
1299 return StatusCode::FAILURE;
1303 return StatusCode::SUCCESS;
1321 const bool FORCEREMOVE(
true);
1346 const std::string&
store,
1347 bool allowMods,
bool resetOnly) {
1353 StatusCode
sc =
m_pCLIDSvc->getTypeNameOfID(
id, idname);
1354 if (
sc.isFailure() || idname.empty() ) {
1355 idname = std::to_string(
id);
1362 const bool ALLOWOVERWRITE(
false);
1363 if (
record_impl(obj, idname, dho, allowMods, resetOnly, ALLOWOVERWRITE,
1364 &
typeid(DataHistory)) ==
nullptr)
1365 return StatusCode::FAILURE;
1366 return StatusCode::SUCCESS;
1429 const std::string&
str,
1435 const std::string* str2 =
m_stringpool.keyToString (key, clid2);
1437 <<
" maps to multiple string key/CLID pairs: "
1438 << *str2 <<
"/" << clid2 <<
" and "
1460 tmp = other.m_stringpool;
1471 if (0 != (pP =
proxy(
id, key))) {
1474 SG::DataProxy::CLIDCont_t::const_iterator i(
clids.begin()), e(
clids.end());
1480 pP->
reset (hard_reset);
1493 if (dp->isValidObject()) {
1495 SG::DataProxy::CLIDCont_t::const_iterator i(
clids.begin()), e(
clids.end());
1502 dp->reset (hard_reset);
1519 payload.target = target;
1520 payload.index_offset = index_offset;
1534 sgkey_t& sgkey_out,
size_t& index_out)
1537 SG::RemapImpl::remap_map_t::iterator i =
1542 sgkey_out = payload.target;
1543 index_out = index_in + payload.index_offset;
1549 const std::string& key)
1552 DataObject* obj =
nullptr;
1555 if (dp && dp->isValid()) {
1570 for ( ; s_iter != s_end; ++s_iter ) {
1571 if ( s_iter->second.find( key ) != s_iter->second.end() ) {
1572 return s_iter->first;
1583 std::vector<CLID>
clids;
1587 for ( ; s_iter != s_end; ++s_iter ) {
1588 if ( s_iter->second.find( key ) != s_iter->second.end() ) {
1589 clids.push_back(s_iter->first);
1601 const std::type_info* tinfo,
1618 const std::vector<CLID>& bases = bib->
get_bases();
1619 for ( std::size_t i = 0, iMax = bases.size(); i < iMax; ++i ) {
1620 if ( bases[i] !=
clid ) {
1621 if (
addSymLink( bases[i], dp ).isSuccess() ) {
1627 warning() <<
"record_impl: Doing auto-symlinks for object with CLID "
1629 <<
" and SG key " << key
1630 <<
": Proxy already set for base CLID " << bases[i]
1631 <<
"; not making auto-symlink." <<
endmsg;
1639 if (
m_pStore->addSymLink (copy_clid, dp).isFailure()) {
1640 warning() <<
"record_impl: Doing auto-symlinks for object with CLID "
1642 <<
" and SG key " << key
1643 <<
": Proxy already set for copy-conversion CLID "
1645 <<
"; not making auto-symlink." <<
endmsg;
1652 warning() <<
"record_impl: Could not find suitable SG::BaseInfoBase for CLID ["
1653 <<
clid <<
"] (" << key <<
") !\t"
1654 <<
"No auto-symlink established !"
1666 std::vector<IResetable*> handles;
1669 h->reset (hard_reset);
1694 std::vector<IResetable*>::iterator it =
1695 std::find (v.begin(), v.end(),
handle);
1707 SG::CurrentEventStore::setStore (
this);
1723 IOpaqueAddress* addr,
1724 DataObject*& refpObject)
1731 return cvt->createObj (addr, refpObject);
1738 std::cout << sg->
dump() <<
"\n";
1742 std::ofstream f (fname);
1743 f << sg->
dump() <<
"\n";
1761 return dh->
begin()->getToken()->dbID().toString();
1783 SG_MSG_DEBUG(
"retrieve(range): no object found "
1784 <<
" of type " << typnam
1785 <<
"(CLID " <<
clid <<
')');
1788 (ciend.
setState(end, end,
true)).ignore();
1790 if (!(cibegin.
setState(first, end,
true)).isSuccess()) {
1793 SG_MSG_DEBUG(
"retrieve(range): Can't initialize iterator for object range "
1794 <<
" of type " << typnam
1795 <<
"(CLID " <<
clid <<
')');
1796 return StatusCode::FAILURE;
1799 return StatusCode::SUCCESS;
1804 const std::string& key,
1811 if (ptr->hasStore())
return true;
1814 SG_MSG_VERBOSE(
"called associateAux_impl for key " + key);
1816 if (!ptr->hasStore()) {
1819 if (!dp->isConst()) {
1822 ptr->setStore (pAux);
1829 ptr->setStore (pAux);
1839 const std::string& key,
1843 SG_MSG_VERBOSE(
"called associateAux_impl for key " + key);
1845 if (!ptr->hasStore()) {
1848 if (!dp->isConst()) {
1851 ptr->setStore (pAux);
1858 ptr->setStore (pAux);
Manage index tracking and synchronization of auxiliary data.
a static registry of CLID->typeName entries.
Helpers for checking error return status codes and reporting errors.
#define REPORT_MESSAGE(LVL)
Report a message.
#define CHECK(...)
Evaluate an expression and check for errors.
void swap(DataVector< T > &a, DataVector< T > &b)
See DataVector<T, BASE>::swap().
uint32_t CLID
The Class ID type.
Interface for non-const operations on an auxiliary store.
Interface for const operations on an auxiliary store.
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
void SG_dump(SGImplSvc *sg)
These are intended to be easy to call from the debugger.
defines a StoreGateSvc key with a version number
Incident sent after a store is cleared.
Maintain a mapping of strings to 64-bit ints.
Define macros for attributes used to control the static checker.
#define ATLAS_THREAD_SAFE
Header file for AthHistogramAlgorithm.
static const std::type_info * CLIDToTypeinfo(CLID clid)
Translate between CLID and type_info.
Simple smart pointer for Gaudi-style refcounted objects.
T * get()
Get the pointer.
A non-templated base class for DataBucket, allows to access the transient object address as a void*.
virtual void * object()=0
virtual void relinquish()=0
Give up ownership of the DataBucket contents.
SG::sgkey_t sgkey_t
Type of the keys.
The Athena Transient Store API.
virtual SG::DataProxy * proxy(const void *const pTransient) const override final
get proxy for a given data object address in memory
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.
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.
void setStoreID(StoreID::type id)
set store ID. request forwarded to DataStore:
StatusCode t2pRegister(const void *const pTrans, SG::DataProxy *const pPers)
forwarded to DataStore
virtual ~SGImplSvc() override final
Standard Destructor.
StatusCode symLink(const void *p2BRegistered, CLID linkID)
make a soft link to the object T* already registered
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...
virtual void boundHandle(IResetable *handle) override final
Tell the store that a proxy has been bound to a handle.
DataObject * typeless_retrievePrivateCopy(const CLID clid, const std::string &key)
virtual sgkey_t stringToKey(const std::string &str, CLID clid) override final
Find the key for a string/CLID pair.
StatusCode remove(const void *pObject)
Remove pObject, will remove its proxy if not reset only.
virtual void handle(const Incident &) override final
triggered by Incident service
SG::DataProxy * locatePersistent(const SG::TransientAddress *tAddr, bool checkValid=false) const
virtual std::vector< const SG::DataProxy * > proxies() const override final
return the list of all current proxies 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)
virtual SG::DataProxy * recordObject(SG::DataObjectSharedPtr< DataObject > obj, const std::string &key, bool allowMods, bool returnExisting) override final
Record an object in the store.
StatusCode loadEventProxies()
load proxies at begin event
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.
SG::RemapImpl * m_remap_impl
int m_slotNumber
The Hive slot number for this store, or -1 if this isn't a Hive store.
ServiceHandle< IProxyProviderSvc > m_pPPSHandle
virtual StatusCode finalize() override final
Service finalization.
std::map< std::thread::id, std::vector< IResetable * > > m_newBoundHandles
Keep track of proxies bound since the last call to commitNewDataObjects or clearStore.
virtual SG::SourceID sourceID(const std::string &key="EventSelector") const override
Return the metadata source ID for the current event slot.
StatusCode setConst(const void *pointer)
prevent downstream clients from modifying the pointed-at dobj
virtual StatusCode createObj(IConverter *cvt, IOpaqueAddress *addr, DataObject *&refpObject) override
Call converter to create an object, with locking.
std::vector< CLID > clids(const std::string &key) const
Retrieve all the CLID s (including symlinks) of the object recorded in StoreGate with the given "key"...
bool m_DumpStore
Dump Property flag: triggers dump() at EndEvent.
bool m_ActivateHistory
Activate the history service.
CLID clid(const std::string &key) const
Retrieve the main CLID of the object recorded in StoreGate with the given "key" WARNING: slow!
void msg_update_handler(Gaudi::Details::PropertyBase &outputLevel)
callback for output level property
SG::StringPool m_stringpool
virtual StatusCode start() override final
Service start.
std::string createKey(const CLID &dataID)
creates a key internally if none specified by client
bool m_DumpArena
DumpArena Property flag : trigger m_arena->report() at clearStore.
StatusCode removeProxy(SG::DataProxy *proxy, const void *pTrans, bool forceRemove=false)
remove proxy from store, unless it is reset only.
StoreID::type storeID() const
get store ID. request forwarded to DataStore:
StatusCode proxyRange(const CLID &id, SG::ConstProxyIterator &beg, SG::ConstProxyIterator &end) const
return a range to all proxies of a given CLID
void remap_impl(sgkey_t source, sgkey_t target, off_t index_offset)
Declare a remapping.
virtual void registerKey(sgkey_t key, const std::string &str, CLID clidid) override final
Remember an additional mapping from key to string/CLID.
StatusCode addSymLink(const CLID &linkid, SG::DataProxy *dp)
SG::Arena m_arena
Allocation arena to associate with this store.
virtual StatusCode clearStore(bool forceRemove=false) override final
clear DataStore contents: called by the event loop mgrs
bool isSymLinked(const CLID &linkID, SG::DataProxy *dp)
std::lock_guard< mutex_t > lock_t
IProxyProviderSvc * m_pPPS
StatusCode recordAddress(const std::string &skey, CxxUtils::RefCountedPtr< IOpaqueAddress > pAddress, bool clearAddressFlag=true, const std::vector< CLID > &bases={})
Create a proxy object using an IOpaqueAddress and a transient key.
virtual void commitNewDataObjects() override final
Reset handles added since the last call to commit.
int typeCount(const CLID &id) const
Return the number of instances of type T (input CLID).
virtual StatusCode stop() override final
Service stop.
void t2pRemove(const void *const pTrans)
forwarded to DataStore
virtual StatusCode addToStore(CLID id, SG::DataProxy *proxy) override final
Raw addition of a proxy to the store.
StatusCode record_HistObj(const CLID &id, const std::string &key, const std::string &store, bool allowMods, bool resetOnly=true)
virtual const std::string * keyToString(sgkey_t key) const override final
Find the string corresponding to a given key.
void clearProxyPayload(SG::DataProxy *)
use to reset a proxy (clearing the data object it contains) Unlike DataProxy::reset this method corre...
StatusCode removeDataAndProxy(const void *pObject)
Remove pObject and its proxy no matter what.
mutex_t m_stringPoolMutex
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
std::vector< CLID > clids() const
Return all CLIDs in the store.
std::list< DataObject * > m_trash
The Recycle Bin.
ServiceHandle< IHistorySvc > m_pHistorySvc
void releaseObject(const CLID &id, const std::string &key)
release object held by proxy, if any.
IStringPool::sgkey_t sgkey_t
ServiceHandle< IIOVSvc > m_pIOVSvc
get the IOVSvc "just in time" (breaks recursion at initialize)
void makeCurrent()
The current store is becoming the active store.
SGImplSvc(const SGImplSvc &)=delete
int m_numSlots
The total number of slots. 1 if this isn't a Hive store.
bool mergeStringPool(const SGImplSvc &other)
Merge the string pool from another store into this one.
DataObject * accessData(const CLID &id) const
find proxy and access its data. Returns 0 to flag failure
void recycle(DataObject *pBadDObj)
put a bad (unrecordable) dobj away
virtual StatusCode reinitialize() override final
Service reinitialization.
bool m_storeLoaded
FIXME hack needed by loadEventProxies.
virtual SG::DataProxy * proxy_exact(SG::sgkey_t sgkey) const override final
Get proxy given a hashed key+clid.
ServiceHandle< IClassIDSvc > m_pCLIDSvc
bool transientContains(const CLID id, const std::string &key) const
Look up a transient data object in TDS only by CLID.
ServiceHandle< IIncidentSvc > m_pIncSvc
property
std::string dump() const
dump objects in store.
StatusCode addAlias(const std::string &aliasKey, SG::DataProxy *dp)
bool contains(const CLID id, const std::string &key) const
Look up a keyed object in TDS by CLID.
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 setSlotNumber(int slot, int numSlots)
Set the Hive slot number for this store.
StatusCode retrieve(CLID clid, SG::detail::IteratorBase &cibegin, SG::detail::IteratorBase &ciend) const
Retrieve all objects of type T: returns an SG::ConstIterator range.
virtual void unboundHandle(IResetable *handle) override final
Tell the store that a handle has been unbound from a proxy.
SG::DataProxy * transientProxy(const CLID &id, const std::string &key) const
get proxy with given id and key.
bool associateAux_impl(SG::AuxVectorBase *ptr, const std::string &key, CLID auxclid) const
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
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
void emptyTrash()
throw away bad objects
ServiceHandle< IConversionSvc > m_pDataLoader
Manage index tracking and synchronization of auxiliary data.
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).
std::vector< CLID > get_copy_conversions() const
Return known copy conversions.
bool transientID(CLID id) const
return the list of transient IDs (primary or symLinked):
void reset(bool hard=false)
Other methods of DataProxy (not in Interface IRegistry):
DataObject * accessData()
Access DataObject on-demand using conversion service.
TransientAddress::TransientClidSet CLIDCont_t
Hold DataProxy instances associated with a store.
int typeCount(const CLID &id) const
Count number of object of a given type in store.
virtual StoreID::type storeID() const override
void keys(const CLID &id, std::vector< std::string > &vkeys, bool includeAlias, bool onlyValid)
StoreMap::const_iterator ConstStoreIterator
void setStoreID(StoreID::type id)
const std::vector< DataProxy * > & proxies() const
All proxies managed by this store.
StatusCode tRange(ConstStoreIterator &f, ConstStoreIterator &e) const
Return an iterator over the StoreMap:
Interface for non-const operations on an auxiliary store.
a StoreGateSvc key with a version number.
unsigned char version() const
static bool isVersionedKey(const char *)
quickly determine whether a string has the right format to be a VK
const std::string & rawVersionKey() const
static bool isAuto(const std::string &)
quickly determine whether a string has the right format to be a VK with auto-generated version #
const std::string & key() const
Implementation class, not to be used directly Iterates over valid proxies it the range.
StatusCode setState(SG::ConstProxyIterator itr, SG::ConstProxyIterator itrEnd, bool isConst)
Reset state of the iterator.
static StoreID::type findStoreID(const std::string &storeName)
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
DATA * DataProxy_cast(DataProxy *proxy)
cast the proxy into the concrete data object it proxies
AuxElement(SG::AuxVectorData *container, size_t index)
Base class for elements of a container that can have aux data.
CxxUtils::RefCountedPtr< T > DataObjectSharedPtr
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
ProxyMap::const_iterator ConstProxyIterator
DataObject * asStorable(SG::DataObjectSharedPtr< T > pObject)
std::unordered_map< sgkey_t, T > SGKeyMap
A map using sgkey_t as a key.
void print(std::FILE *stream, std::format_string< Args... > fmt, Args &&... args)
void swap(ElementLinkVector< DOBJ > &lhs, ElementLinkVector< DOBJ > &rhs)
static constexpr CLID ID()
SGKeyMap< remap_t > remap_map_t
IStringPool::sgkey_t sgkey_t