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() );
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)
341 assert(0 != pAddress);
342 CLID dataID = pAddress->clID();
346 warning() <<
"recordAddress: Invalid Class ID found in IOpaqueAddress @"
347 << pAddress.
get() <<
". IOA will not be recorded"
349 return StatusCode::FAILURE;
358 if (dp && dp->provider()) {
359 std::string clidTypeName;
360 m_pCLIDSvc->getTypeNameOfID(dataID, clidTypeName).ignore();
361 warning() <<
"recordAddress: failed for key="<< skey <<
", type "
363 <<
" (CLID " << dataID <<
')'
364 <<
"\n there is already a persistent version of this object. Will not record a duplicate! "
366 return StatusCode::FAILURE;
372 if (0 == dp && 0 !=
m_pPPS) {
384 m_pStore->addToStore(dataID, dp).ignore();
388 else if ((0 != dp) && (0 == dp->address()))
392 dp->setAddress(std::move(pAddress));
397 m_pCLIDSvc->getTypeNameOfID(dataID, errType).ignore();
398 warning() <<
"recordAddress: preexisting proxy @" << dp
399 <<
" with non-NULL IOA found for key "
400 << skey <<
" type " << errType <<
" (" << dataID <<
"). \n"
401 <<
"Cannot record IOpaqueAddress @" << pAddress.
get()
403 return StatusCode::FAILURE;
406 return StatusCode::SUCCESS;
415 bool clearAddressFlag)
418 assert(0 != pAddress);
420 CLID dataID = pAddress->clID();
422 string gK = (pAddress->par())[1];
423 if (gK.empty()) gK = (pAddress->par())[0];
426 return this->
recordAddress(gK, std::move(pAddress), clearAddressFlag);
438 if (0 != dp->object())
441 warning() <<
" setupProxy:: error setting up proxy for key "
442 << gK <<
" and clid " << dataID
443 <<
"\n Pre-existing valid DataProxy @"<< dp
444 <<
" found in Store for key " << dp->object()->name()
445 <<
" with clid " << dp->object()->clID()
451 dp->setObject(pDObj);
452 if (!allowMods) dp->setConst();
458 !allowMods, resetOnly);
459 if (!(
m_pStore->addToStore(dataID, dp).isSuccess())) {
460 warning() <<
" setupProxy:: could not addToStore proxy @" << dp
486 bool includeAlias,
bool onlyValid)
490 return store()->
keys(
id, vkeys, includeAlias, onlyValid);
496 return (0 != dp) ? dp->transientID(linkID) :
false;
504 auto out_buffer = std::string{};
505 auto out = std::back_inserter(out_buffer);
506 const std::string me = name();
507 std::format_to(out,
"{}: <<<<<<<<<<<<<<<<< Data Store Dump >>>>>>>>>>>>>>> \n", me);
508 std::format_to(out,
"{}: SGImplSvc()::dump() which is {} \n", me,
m_storeLoaded ?
"LOADED" :
"NOT LOADED");
513 for (; s_iter != s_end; ++s_iter)
516 CLID id = s_iter->first;
519 m_pCLIDSvc->getTypeNameOfID(
id, tname).ignore();
520 std::format_to(out,
"{}: Found {} {} for ClassID {} ({}): \n", me, nProxy, ((nProxy == 1) ?
"proxy" :
"proxies"),
id, tname);
526 while (p_iter != p_end) {
528 std::format_to(out,
"{}: flags: ({:7s}, {:8s}, {:6s}) --- data: {:10p} --- key: {}\n", me,
529 (dp.isValid() ?
"valid" :
"INVALID"),
530 (dp.isConst() ?
"locked" :
"UNLOCKED"),
531 (dp.isResetOnly() ?
"reset" :
"DELETE"),
532 dbg::ptr(dp.object()), p_iter->first);
536 std::format_to(out,
"{}: <<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>> \n", me);
563 StatusCode::SUCCESS :
573 StatusCode::SUCCESS :
582 warning() <<
"addSymLink: no target DataProxy found. Sorry, can't link to a non-existing data object"
584 return StatusCode::FAILURE;
586 StatusCode
sc =
m_pStore->addSymLink(linkid, dp);
590 if (
sc.isSuccess() && dp->object()) {
606 error() <<
"setAlias: problem setting alias "
608 <<
"DataObject does not exist, record before setting alias."
610 return StatusCode::FAILURE;
614 if (
sc.isFailure()) {
615 error() <<
"setAlias: problem setting alias "
617 <<
"DataObject does not exist, record before setting alias."
619 return StatusCode::FAILURE;
622 return StatusCode::SUCCESS;
627 const std::string& key,
const std::string& aKey)
634 error() <<
"setAlias: problem setting alias "
635 << std::string(aKey) <<
'\n'
636 <<
"DataObject does not exist, record before setting alias."
638 return StatusCode::FAILURE;
642 if (
sc.isFailure()) {
643 error() <<
"setAlias: problem setting alias "
644 << (std::string)aKey <<
'\n'
645 <<
"DataObject does not exist, record before setting alias."
647 return StatusCode::FAILURE;
650 return StatusCode::SUCCESS;
662 warning() <<
"addAlias: no target DataProxy given, Cannot alias to a non-existing object"
664 return StatusCode::FAILURE;
682 return (0 !=
proxy(
id, key,
true));
683 }
catch(...) {
return false; }
692 }
catch(...) {
return false; }
702 return m_pStore->locatePersistent(pTransient);
708 return proxy(
id,
false);
718 if (0 == dp && 0 !=
m_pPPS) {
720 dp =
m_pPPS->retrieveProxy(
id,
string(
"DEFAULT"), *pStore);
726 if (checkValid && 0 != dp) {
730 return dp->isValid() ? dp : 0;
738 return proxy(
id, key,
false);
749 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");
751 if (0 == dp && 0 !=
m_pPPS) {
753 dp =
m_pPPS->retrieveProxy(
id, key, *pStore);
755 if (!dp)
dbg::print(stderr,
"::SGImplSvc::proxy(name={}, key={}): data proxy is still null\n", this->name(), key);
761 if (checkValid && 0 != dp && !(dp->isValid())) {
801 const std::string& key,
806 const void* raw_ptr = obj.get();
807 const std::type_info* tinfo =
nullptr;
810 raw_ptr = bucket->object();
811 tinfo = &bucket->tinfo();
814 if (returnExisting) {
821 if (
proxy->transientID (obj->clID())) {
825 std::string clidTypeName;
827 warning() <<
"SGImplSvc::recordObject: addAlias fails for object "
828 <<
clid <<
"[" << clidTypeName <<
"] " <<
proxy->name()
829 <<
" and new key " << key
836 else if (key ==
proxy->name() ||
proxy->hasAlias(key) > 0)
841 std::string clidTypeName;
843 CLID newclid = obj->clID();
844 std::string newclidTypeName;
845 m_pCLIDSvc->getTypeNameOfID(newclid, newclidTypeName).ignore();
846 error() <<
"SGImplSvc::recordObject: addSymLink fails for object "
847 <<
clid <<
"[" << clidTypeName <<
"] " <<
proxy->name()
848 <<
" and new clid " << newclid <<
"[" << newclidTypeName <<
"]"
856 std::string clidTypeName;
858 CLID newclid = obj->clID();
859 std::string newclidTypeName;
860 m_pCLIDSvc->getTypeNameOfID(newclid, newclidTypeName).ignore();
861 error() <<
"SGImplSvc::recordObject: existing object found with "
862 <<
clid <<
"[" << clidTypeName <<
"] " <<
proxy->name()
863 <<
" but neither clid " << newclid <<
"[" << newclidTypeName <<
"]"
864 <<
" nor key " << key <<
" match."
873 const bool resetOnly =
true;
874 const bool noHist =
false;
877 allowMods, resetOnly, noHist, tinfo,
878 &
proxy,
true).isFailure())
911std::vector<const SG::DataProxy*>
916 std::vector<const SG::DataProxy*> ret (
proxies.begin(),
proxies.end());
930 std::vector<CLID>
clids;
931 clids.reserve( distance( s_iter, s_end ) );
933 for (; s_iter != s_end; ++s_iter ) {
934 const CLID id = s_iter->first;
935 clids.push_back (
id);
947 return ( (0 != dp && dp->isValidObject()) ? dp : 0 );
955 return (0 == theProxy) ? 0 : theProxy->
accessData();
963 return (0 == theProxy) ? 0 : theProxy->
accessData();
968 const std::string& keyA,
const std::string& keyB )
971 const bool checkValid =
true;
974 if ( 0 ==
a || 0 == b ) {
return false; }
975 DataObject* objA =
a->accessData();
976 DataObject* objB = b->accessData();
978 if ( 0 == objA || 0 == objB ) {
return false; }
980 const unsigned int refCntA = objA->addRef();
981 const unsigned int refCntB = objB->addRef();
985 a->setObject( objA );
986 b->setObject( objB );
988 return ( (refCntA-1) == objA->release() &&
989 (refCntB-1) == objB->release() );
994 const void*
const raw_ptr,
995 bool allowMods,
bool resetOnly,
bool noHist)
997 return typeless_record (obj, key, raw_ptr, allowMods, resetOnly, noHist, 0,
1004 const void*
const raw_ptr,
1005 bool allowMods,
bool resetOnly,
bool noHist,
1006 const std::type_info* tinfo)
1008 return typeless_record (obj, key, raw_ptr, allowMods, resetOnly, noHist,tinfo,
1015 const void*
const raw_ptr,
1016 bool allowMods,
bool resetOnly,
bool noHist,
1017 const std::type_info* tinfo,
1023 record_impl( obj, key, raw_ptr, allowMods, resetOnly, !noOverwrite, tinfo);
1024 if (
proxy ==
nullptr )
1025 return StatusCode::FAILURE;
1030 return StatusCode::SUCCESS;
1034 return StatusCode::SUCCESS;
1036 return record_HistObj( obj->clID(), key, name(), allowMods, resetOnly );
1043 const std::string& key,
1044 const void*
const raw_ptr,
1047 const std::type_info* tinfo)
1050 StatusCode
sc(StatusCode::SUCCESS);
1052 if (0 != toRemove) {
1054 const bool FORCEREMOVE(
true);
1057 if (
sc.isSuccess()) {
1058 const bool ALLOWOVERWRITE(
true);
1059 const bool NORESET(
false);
1060 if (
record_impl( obj, key, raw_ptr, allowMods, NORESET, ALLOWOVERWRITE, tinfo) ==
nullptr)
1061 sc = StatusCode::FAILURE;
1071 toRemove->release();
1077 const void*
const raw_ptr,
1078 bool allowMods,
bool resetOnly,
bool allowOverwrite,
1079 const std::type_info* tinfo)
1082 std::string rawKey(key);
1090 const std::string& pTAName(dp->name());
1099 warning() <<
"record_impl: Could not setup alias key "
1101 <<
" for unversioned object " << pTAName
1116 if (!allowOverwrite &&
m_pPPS) {
1122 if (dp && dp->provider()) {
1123 std::string clidTypeName;
1125 warning() <<
"record_impl: you are recording an object with key "
1126 << rawKey <<
", type " << clidTypeName
1127 <<
" (CLID " <<
clid <<
')'
1128 <<
"\n There is already a persistent version of this object. Recording a duplicate may lead to unreproducible results and it is deprecated."
1136 std::string clidTypeName;
1138 warning() <<
"record_impl: failed for key="<< rawKey <<
", type "
1140 <<
" (CLID " <<
clid <<
')'
1141 <<
"\n object @" << raw_ptr
1142 <<
" already in store with key="<< dp->name()
1143 <<
". Will not record a duplicate! "
1145 if (pDObj != dp->object()) {
1147 if (!pDBB) std::abort();
1158 std::string clidTypeName;
1160 warning() <<
"record_impl: Problem setting up the proxy for object @"
1162 <<
"\n recorded with key " << rawKey
1163 <<
" of type " << clidTypeName
1164 <<
" (CLID " <<
clid <<
") in DataObject @" << pDObj
1171 if ( !(this->
t2pRegister( raw_ptr, dp )).isSuccess() ) {
1172 std::string clidTypeName;
1174 warning() <<
"record_impl: can not add to t2p map object @" <<raw_ptr
1175 <<
"\n with key " << rawKey
1176 <<
" of type " << clidTypeName
1177 <<
" (CLID " <<
clid <<
')'
1191 if (!(this->
addAlias(vk.
key(), dp)).isSuccess()) {
1192 warning() <<
"record_impl: Could not setup alias key " << vk.
key()
1193 <<
" for VersionedKey " << rawKey
1194 <<
". Generic access to this object with clid" <<
clid
1205 bool checkValid)
const
1209 if (checkValid && 0 != dp) {
1210 return dp->isValid() ? dp : 0;
1222 if (0 ==
proxy)
return StatusCode::FAILURE;
1226 if (bucket) pTrans = bucket->
object();
1234 if (
proxy->isValidObject()) {
1237 for (SG::DataProxy::CLIDCont_t::const_iterator i =
clids.begin();
1253 return m_pStore->t2pRegister(pTrans, pPers);
1267 updateMsgStreamOutputLevel( outputLevel() );
1268 msgSvc()->setOutputLevel(name(), outputLevel());
1276 return m_pStore->pRange(
id,begin,end);
1287 warning() <<
"setConst: NO Proxy for the dobj you want to set const"
1289 return StatusCode::FAILURE;
1293 return StatusCode::SUCCESS;
1311 const bool FORCEREMOVE(
true);
1336 const std::string&
store,
1337 bool allowMods,
bool resetOnly) {
1343 StatusCode
sc =
m_pCLIDSvc->getTypeNameOfID(
id, idname);
1344 if (
sc.isFailure() || idname.empty() ) {
1345 idname = std::to_string(
id);
1352 const bool ALLOWOVERWRITE(
false);
1353 if (
record_impl(obj, idname, dho, allowMods, resetOnly, ALLOWOVERWRITE,
1354 &
typeid(DataHistory)) ==
nullptr)
1355 return StatusCode::FAILURE;
1356 return StatusCode::SUCCESS;
1419 const std::string&
str,
1425 const std::string* str2 =
m_stringpool.keyToString (key, clid2);
1427 <<
" maps to multiple string key/CLID pairs: "
1428 << *str2 <<
"/" << clid2 <<
" and "
1449 lock_t lock (other.m_stringPoolMutex);
1450 tmp = other.m_stringpool;
1461 if (0 != (pP =
proxy(
id, key))) {
1464 SG::DataProxy::CLIDCont_t::const_iterator i(
clids.begin()), e(
clids.end());
1470 pP->
reset (hard_reset);
1483 if (dp->isValidObject()) {
1485 SG::DataProxy::CLIDCont_t::const_iterator i(
clids.begin()), e(
clids.end());
1492 dp->reset (hard_reset);
1509 payload.target = target;
1510 payload.index_offset = index_offset;
1524 sgkey_t& sgkey_out,
size_t& index_out)
1527 SG::RemapImpl::remap_map_t::iterator i =
1532 sgkey_out = payload.target;
1533 index_out = index_in + payload.index_offset;
1539 const std::string& key)
1542 DataObject* obj =
nullptr;
1545 if (dp && dp->isValid()) {
1560 for ( ; s_iter != s_end; ++s_iter ) {
1561 if ( s_iter->second.find( key ) != s_iter->second.end() ) {
1562 return s_iter->first;
1573 std::vector<CLID>
clids;
1577 for ( ; s_iter != s_end; ++s_iter ) {
1578 if ( s_iter->second.find( key ) != s_iter->second.end() ) {
1579 clids.push_back(s_iter->first);
1591 const std::type_info* tinfo,
1608 const std::vector<CLID>& bases = bib->
get_bases();
1609 for ( std::size_t i = 0, iMax = bases.size(); i < iMax; ++i ) {
1610 if ( bases[i] !=
clid ) {
1611 if (
addSymLink( bases[i], dp ).isSuccess() ) {
1617 warning() <<
"record_impl: Doing auto-symlinks for object with CLID "
1619 <<
" and SG key " << key
1620 <<
": Proxy already set for base CLID " << bases[i]
1621 <<
"; not making auto-symlink." <<
endmsg;
1629 if (
m_pStore->addSymLink (copy_clid, dp).isFailure()) {
1630 warning() <<
"record_impl: Doing auto-symlinks for object with CLID "
1632 <<
" and SG key " << key
1633 <<
": Proxy already set for copy-conversion CLID "
1635 <<
"; not making auto-symlink." <<
endmsg;
1642 warning() <<
"record_impl: Could not find suitable SG::BaseInfoBase for CLID ["
1643 <<
clid <<
"] (" << key <<
") !\t"
1644 <<
"No auto-symlink established !"
1656 std::vector<IResetable*> handles;
1659 h->reset (hard_reset);
1684 std::vector<IResetable*>::iterator it =
1685 std::find (v.begin(), v.end(),
handle);
1713 IOpaqueAddress* addr,
1714 DataObject*& refpObject)
1721 return cvt->createObj (addr, refpObject);
1728 std::cout << sg->
dump() <<
"\n";
1732 std::ofstream f (fname);
1733 f << sg->
dump() <<
"\n";
1751 return dh->
begin()->getToken()->dbID().toString();
1773 SG_MSG_DEBUG(
"retrieve(range): no object found "
1774 <<
" of type " << typnam
1775 <<
"(CLID " <<
clid <<
')');
1778 (ciend.
setState(end, end,
true)).ignore();
1780 if (!(cibegin.
setState(first, end,
true)).isSuccess()) {
1783 SG_MSG_DEBUG(
"retrieve(range): Can't initialize iterator for object range "
1784 <<
" of type " << typnam
1785 <<
"(CLID " <<
clid <<
')');
1786 return StatusCode::FAILURE;
1789 return StatusCode::SUCCESS;
1794 const std::string& key,
1801 if (ptr->hasStore())
return true;
1804 SG_MSG_VERBOSE(
"called associateAux_impl for key " + key);
1806 if (!ptr->hasStore()) {
1809 if (!dp->isConst()) {
1812 ptr->setStore (pAux);
1819 ptr->setStore (pAux);
1829 const std::string& key,
1833 SG_MSG_VERBOSE(
"called associateAux_impl for key " + key);
1835 if (!ptr->hasStore()) {
1838 if (!dp->isConst()) {
1841 ptr->setStore (pAux);
1848 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.
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.
StoreMap::const_iterator ConstStoreIterator
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
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 recordAddress(const std::string &skey, CxxUtils::RefCountedPtr< IOpaqueAddress > pAddress, bool clearAddressFlag=true)
Create a proxy object using an IOpaqueAddress and a transient key.
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
Base class for elements of a container that can have aux data.
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.
static IProxyDict * setStore(IProxyDict *store)
Set the current store.
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.
StatusCode tRange(ConstStoreIterator &f, ConstStoreIterator &e) const
Return an iterator over the StoreMap:
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.
Interface for non-const operations on an auxiliary store.
Interface for 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
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