15#include <unordered_map>
30#include "GaudiKernel/IClassIDSvc.h"
31#include "GaudiKernel/IHistorySvc.h"
32#include "GaudiKernel/ISvcLocator.h"
33#include "GaudiKernel/IConversionSvc.h"
34#include "GaudiKernel/Incident.h"
35#include "GaudiKernel/IOpaqueAddress.h"
36#include "GaudiKernel/MsgStream.h"
37#include "GaudiKernel/StatusCode.h"
38#include "GaudiKernel/DataHistory.h"
72template <
class...
Args>
void print(std::FILE* stream, std::format_string<Args...>
fmt,
Args&&... args) {
73 std::fputs(std::format(
fmt, std::forward<Args>(args)...), stream);
76template <
class T>
void*
ptr(T* p) {
return static_cast<void*
>(p); }
105 : base_class(name, svc),
129 declareProperty(
"IncidentSvc",
m_pIncSvc);
153 CHECK( Service::initialize() );
167 SG::CurrentEventStore::setStore (
this);
171 if (!(
m_pIncSvc.retrieve()).isSuccess()) {
173 return StatusCode::FAILURE;
190 return StatusCode::FAILURE;
198 return StatusCode::SUCCESS;
212 return StatusCode::SUCCESS;
222 ISvcManager* pISM(
dynamic_cast<ISvcManager*
>(serviceLocator().
get()));
224 return StatusCode::FAILURE;
225 pISM->setPriority(name(), pISM->getPriority(name())+1).ignore();
226 SG_MSG_VERBOSE (
"stop: setting service priority to {} so that event stores get finalized and cleared before other stores",
227 pISM->getPriority(name()));
229 return StatusCode::SUCCESS;
235 if (inc.type() ==
"EndEvent") {
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;
286 SG_MSG_DEBUG (
"Clearing store with forceRemove={}", forceRemove);
288 m_pStore->clearStore(forceRemove, hard_reset, &msgStream(MSG::DEBUG));
297 return StatusCode::SUCCESS;
308 const bool FORCEREMOVE(
true);
318 return Service::finalize();
324 const bool FORCEREMOVE(
true);
327 return StatusCode::SUCCESS;
336 bool clearAddressFlag,
337 const std::vector<CLID>& bases)
340 assert(0 != pAddress);
341 CLID dataID = pAddress->clID();
345 SG_MSG_WARNING (
"recordAddress: Invalid Class ID found in IOpaqueAddress @{}. IOA will not be recorded",
346 static_cast<void*
>(pAddress.
get()));
347 return StatusCode::FAILURE;
356 if (dp && dp->provider()) {
357 std::string clidTypeName;
358 m_pCLIDSvc->getTypeNameOfID(dataID, clidTypeName).ignore();
359 SG_MSG_WARNING (
"recordAddress: failed for key={}, type (CLID {})\n"
360 " there is already a persistent version of this object. Will not record a duplicate! ",
361 skey, clidTypeName, dataID);
362 return StatusCode::FAILURE;
368 if (0 == dp && 0 !=
m_pPPS) {
380 m_pStore->addToStore(dataID, dp).ignore();
385 for (
CLID b : bases) {
387 warning() << std::format (
"Can't add extra base {} for object {}/{}",
388 b, dataID, skey) <<
endmsg;
392 else if ((0 != dp) && (0 == dp->address()))
396 dp->setAddress(std::move(pAddress));
401 m_pCLIDSvc->getTypeNameOfID(dataID, errType).ignore();
402 SG_MSG_WARNING (
"recordAddress: preexisting proxy @{} with non-NULL IOA found for key type {} ({}). \n"
403 "Cannot record IOpaqueAddress @{}",
404 static_cast<void*
>(dp), skey, errType, dataID,
405 static_cast<void*
>(pAddress.
get()));
406 return StatusCode::FAILURE;
409 return StatusCode::SUCCESS;
418 bool clearAddressFlag,
419 const std::vector<CLID>& bases)
422 assert(0 != pAddress);
424 CLID dataID = pAddress->clID();
426 string gK = (pAddress->par())[1];
427 if (gK.empty()) gK = (pAddress->par())[0];
430 return this->
recordAddress(gK, std::move(pAddress), clearAddressFlag, bases);
442 if (0 != dp->object())
445 SG_MSG_WARNING (
" setupProxy:: error setting up proxy for key {} and clid {}\n"
446 " Pre-existing valid DataProxy @{} found in Store for key {} with clid {}",
448 static_cast<void*
>(dp),
449 dp->object()->name(),
450 dp->object()->clID());
455 dp->setObject(pDObj);
456 if (!allowMods) dp->setConst();
462 !allowMods, resetOnly);
463 if (!(
m_pStore->addToStore(dataID, dp).isSuccess())) {
465 static_cast<void*
>(dp));
490 bool includeAlias,
bool onlyValid)
494 return store()->
keys(
id, vkeys, includeAlias, onlyValid);
500 return (0 != dp) ? dp->transientID(linkID) :
false;
508 auto out_buffer = std::string{};
509 auto out = std::back_inserter(out_buffer);
510 const std::string me = name();
511 std::format_to(out,
"{}: <<<<<<<<<<<<<<<<< Data Store Dump >>>>>>>>>>>>>>> \n", me);
512 std::format_to(out,
"{}: SGImplSvc()::dump() which is {} \n", me,
m_storeLoaded ?
"LOADED" :
"NOT LOADED");
517 for (; s_iter != s_end; ++s_iter)
520 CLID id = s_iter->first;
523 m_pCLIDSvc->getTypeNameOfID(
id, tname).ignore();
524 std::format_to(out,
"{}: Found {} {} for ClassID {} ({}): \n", me, nProxy, ((nProxy == 1) ?
"proxy" :
"proxies"),
id, tname);
530 while (p_iter != p_end) {
532 std::format_to(out,
"{}: flags: ({:7s}, {:8s}, {:6s}) --- data: {:10p} --- key: {}\n", me,
533 (dp.isValid() ?
"valid" :
"INVALID"),
534 (dp.isConst() ?
"locked" :
"UNLOCKED"),
535 (dp.isResetOnly() ?
"reset" :
"DELETE"),
536 dbg::ptr(dp.object()), p_iter->first);
540 std::format_to(out,
"{}: <<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>> \n", me);
567 StatusCode::SUCCESS :
577 StatusCode::SUCCESS :
586 SG_MSG_WARNING (
"addSymLink: no target DataProxy found. Sorry, can't link to a non-existing data object");
587 return StatusCode::FAILURE;
589 StatusCode
sc =
m_pStore->addSymLink(linkid, dp);
593 if (
sc.isSuccess() && dp->object()) {
610 "DataObject does not exist, record before setting alias.",
612 return StatusCode::FAILURE;
616 if (
sc.isFailure()) {
618 "DataObject does not exist, record before setting alias.",
620 return StatusCode::FAILURE;
623 return StatusCode::SUCCESS;
628 const std::string& key,
const std::string& aKey)
635 error() <<
"setAlias: problem setting alias "
636 << std::string(aKey) <<
'\n'
637 <<
"DataObject does not exist, record before setting alias."
639 return StatusCode::FAILURE;
643 if (
sc.isFailure()) {
644 error() <<
"setAlias: problem setting alias "
645 << (std::string)aKey <<
'\n'
646 <<
"DataObject does not exist, record before setting alias."
648 return StatusCode::FAILURE;
651 return StatusCode::SUCCESS;
663 SG_MSG_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 SG_MSG_WARNING (
"SGImplSvc::recordObject: addAlias fails for object {} [{}] {} and new key {}",
833 else if (key ==
proxy->name() ||
proxy->hasAlias(key) > 0)
838 std::string clidTypeName;
840 CLID newclid = obj->clID();
841 std::string newclidTypeName;
842 m_pCLIDSvc->getTypeNameOfID(newclid, newclidTypeName).ignore();
844 " addSymLink fails for object {} [{}] {} and new clid {} [{}]",
846 newclid, newclidTypeName);
853 std::string clidTypeName;
855 CLID newclid = obj->clID();
856 std::string newclidTypeName;
857 m_pCLIDSvc->getTypeNameOfID(newclid, newclidTypeName).ignore();
859 " existing object found with {} [{}] {} but neither"
860 " clid {} [{}] nor key {} match.",
862 newclid, newclidTypeName, key);
870 const bool resetOnly =
true;
871 const bool noHist =
false;
874 allowMods, resetOnly, noHist, tinfo,
875 &
proxy,
true).isFailure())
908std::vector<const SG::DataProxy*>
913 std::vector<const SG::DataProxy*> ret (
proxies.begin(),
proxies.end());
927 std::vector<CLID>
clids;
928 clids.reserve( distance( s_iter, s_end ) );
930 for (; s_iter != s_end; ++s_iter ) {
931 const CLID id = s_iter->first;
932 clids.push_back (
id);
944 return ( (0 != dp && dp->isValidObject()) ? dp : 0 );
952 return (0 == theProxy) ? 0 : theProxy->
accessData();
960 return (0 == theProxy) ? 0 : theProxy->
accessData();
965 const std::string& keyA,
const std::string& keyB )
968 const bool checkValid =
true;
971 if ( 0 ==
a || 0 == b ) {
return false; }
972 DataObject* objA =
a->accessData();
973 DataObject* objB = b->accessData();
975 if ( 0 == objA || 0 == objB ) {
return false; }
977 const unsigned int refCntA = objA->addRef();
978 const unsigned int refCntB = objB->addRef();
982 a->setObject( objA );
983 b->setObject( objB );
985 return ( (refCntA-1) == objA->release() &&
986 (refCntB-1) == objB->release() );
991 const void*
const raw_ptr,
992 bool allowMods,
bool resetOnly,
bool noHist)
994 return typeless_record (obj, key, raw_ptr, allowMods, resetOnly, noHist, 0,
1001 const void*
const raw_ptr,
1002 bool allowMods,
bool resetOnly,
bool noHist,
1003 const std::type_info* tinfo)
1005 return typeless_record (obj, key, raw_ptr, allowMods, resetOnly, noHist,tinfo,
1012 const void*
const raw_ptr,
1013 bool allowMods,
bool resetOnly,
bool noHist,
1014 const std::type_info* tinfo,
1020 record_impl( obj, key, raw_ptr, allowMods, resetOnly, !noOverwrite, tinfo);
1021 if (
proxy ==
nullptr )
1022 return StatusCode::FAILURE;
1027 return StatusCode::SUCCESS;
1031 return StatusCode::SUCCESS;
1033 return record_HistObj( obj->clID(), key, name(), allowMods, resetOnly );
1040 const std::string& key,
1041 const void*
const raw_ptr,
1044 const std::type_info* tinfo)
1047 StatusCode
sc(StatusCode::SUCCESS);
1049 if (0 != toRemove) {
1051 const bool FORCEREMOVE(
true);
1054 if (
sc.isSuccess()) {
1055 const bool ALLOWOVERWRITE(
true);
1056 const bool NORESET(
false);
1057 if (
record_impl( obj, key, raw_ptr, allowMods, NORESET, ALLOWOVERWRITE, tinfo) ==
nullptr)
1058 sc = StatusCode::FAILURE;
1068 toRemove->release();
1074 const void*
const raw_ptr,
1075 bool allowMods,
bool resetOnly,
bool allowOverwrite,
1076 const std::type_info* tinfo)
1079 std::string rawKey(key);
1087 const std::string& pTAName(dp->name());
1096 SG_MSG_WARNING (
"record_impl: Could not setup alias key {} for unversioned object {}",
1111 if (!allowOverwrite &&
m_pPPS) {
1117 if (dp && dp->provider()) {
1118 std::string clidTypeName;
1120 SG_MSG_WARNING (
"record_impl: you are recording an object with key {}, type {} (CLID {})\n"
1121 " There is already a persistent version of this object."
1122 " Recording a duplicate may lead to unreproducible results and it is deprecated.",
1123 rawKey, clidTypeName,
clid);
1130 std::string clidTypeName;
1132 SG_MSG_WARNING (
"record_impl: failed for key={}, type {} (CLID {})\n"
1133 " object @{} already in store with key={}. Will not record a duplicate!",
1134 rawKey, clidTypeName,
clid, raw_ptr, dp->name());
1135 if (pDObj != dp->object()) {
1137 if (!pDBB) std::abort();
1148 std::string clidTypeName;
1150 SG_MSG_WARNING (
"record_impl: Problem setting up the proxy for object @{}\n"
1151 " recorded with key {} of type {} (CLID {}) in DataObject @{}",
1152 raw_ptr, rawKey, clidTypeName,
clid,
1153 static_cast<void*
>(pDObj));
1159 if ( !(this->
t2pRegister( raw_ptr, dp )).isSuccess() ) {
1160 std::string clidTypeName;
1162 SG_MSG_WARNING (
"record_impl: can not add to t2p map object @{}\n"
1163 " with key {} of type {} (CLID {})",
1164 raw_ptr, rawKey, clidTypeName,
clid);
1177 if (!(this->
addAlias(vk.
key(), dp)).isSuccess()) {
1179 " VersionedKey {}. Generic access to this object with clid {} will not work",
1189 bool checkValid)
const
1193 if (checkValid && 0 != dp) {
1194 return dp->isValid() ? dp : 0;
1206 if (0 ==
proxy)
return StatusCode::FAILURE;
1210 if (bucket) pTrans = bucket->
object();
1218 if (
proxy->isValidObject()) {
1221 for (SG::DataProxy::CLIDCont_t::const_iterator i =
clids.begin();
1237 return m_pStore->t2pRegister(pTrans, pPers);
1251 updateMsgStreamOutputLevel( outputLevel() );
1252 msgSvc()->setOutputLevel(name(), outputLevel());
1260 return m_pStore->pRange(
id,begin,end);
1271 SG_MSG_WARNING (
"setConst: NO Proxy for the dobj you want to set const");
1272 return StatusCode::FAILURE;
1276 return StatusCode::SUCCESS;
1294 const bool FORCEREMOVE(
true);
1319 const std::string&
store,
1320 bool allowMods,
bool resetOnly) {
1326 StatusCode
sc =
m_pCLIDSvc->getTypeNameOfID(
id, idname);
1327 if (
sc.isFailure() || idname.empty() ) {
1328 idname = std::to_string(
id);
1335 const bool ALLOWOVERWRITE(
false);
1336 if (
record_impl(obj, idname, dho, allowMods, resetOnly, ALLOWOVERWRITE,
1337 &
typeid(DataHistory)) ==
nullptr)
1338 return StatusCode::FAILURE;
1339 return StatusCode::SUCCESS;
1402 const std::string&
str,
1408 const std::string* str2 =
m_stringpool.keyToString (key, clid2);
1409 SG_MSG_WARNING (
"The numeric key {} maps to multiple string key/CLID pairs: {}/{} and {}/{}",
1410 key, *str2, clid2,
str,
clid);
1431 tmp = other.m_stringpool;
1442 if (0 != (pP =
proxy(
id, key))) {
1445 SG::DataProxy::CLIDCont_t::const_iterator i(
clids.begin()), e(
clids.end());
1451 pP->
reset (hard_reset);
1464 if (dp->isValidObject()) {
1466 SG::DataProxy::CLIDCont_t::const_iterator i(
clids.begin()), e(
clids.end());
1473 dp->reset (hard_reset);
1490 payload.target = target;
1491 payload.index_offset = index_offset;
1505 sgkey_t& sgkey_out,
size_t& index_out)
1508 SG::RemapImpl::remap_map_t::iterator i =
1513 sgkey_out = payload.target;
1514 index_out = index_in + payload.index_offset;
1520 const std::string& key)
1523 DataObject* obj =
nullptr;
1526 if (dp && dp->isValid()) {
1541 for ( ; s_iter != s_end; ++s_iter ) {
1542 if ( s_iter->second.find( key ) != s_iter->second.end() ) {
1543 return s_iter->first;
1554 std::vector<CLID>
clids;
1558 for ( ; s_iter != s_end; ++s_iter ) {
1559 if ( s_iter->second.find( key ) != s_iter->second.end() ) {
1560 clids.push_back(s_iter->first);
1572 const std::type_info* tinfo,
1589 const std::vector<CLID>& bases = bib->
get_bases();
1590 for ( std::size_t i = 0, iMax = bases.size(); i < iMax; ++i ) {
1591 if ( bases[i] !=
clid ) {
1592 if (
addSymLink( bases[i], dp ).isSuccess() ) {
1599 " with CLID {} and SG key {}:"
1600 " Proxy already set for base CLID {}; not making auto-symlink.",
1601 clid, key, bases[i]);
1609 if (
m_pStore->addSymLink (copy_clid, dp).isFailure()) {
1611 " with CLID {} and SG key {}:"
1612 " Proxy already set for copy-conversion CLID {}; not making auto-symlink.",
1613 clid, key, copy_clid);
1620 SG_MSG_WARNING (
"record_impl: Could not find suitable SG::BaseInfoBase for CLID [{}] ({}) !\t"
1621 "No auto-symlink established !",
1633 std::vector<IResetable*> handles;
1636 h->reset (hard_reset);
1661 std::vector<IResetable*>::iterator it =
1662 std::find (v.begin(), v.end(),
handle);
1674 SG::CurrentEventStore::setStore (
this);
1690 IOpaqueAddress* addr,
1691 DataObject*& refpObject)
1698 return cvt->createObj (addr, refpObject);
1705 std::println (
"{}", sg->
dump());
1709 std::ofstream f (fname);
1710 std::println (f,
"{}", sg->
dump());
1728 return dh->
begin()->getToken()->dbID().toString();
1750 SG_MSG_DEBUG(
"retrieve(range): no object found of type {} (CLID {})",
1754 (ciend.
setState(end, end,
true)).ignore();
1756 if (!(cibegin.
setState(first, end,
true)).isSuccess()) {
1759 SG_MSG_DEBUG(
"retrieve(range): Can't initialize iterator for object range "
1760 " of type {} (CLID {})",
1762 return StatusCode::FAILURE;
1765 return StatusCode::SUCCESS;
1770 const std::string& key,
1777 if (ptr->hasStore())
return true;
1782 if (!ptr->hasStore()) {
1785 if (!dp->isConst()) {
1788 ptr->setStore (pAux);
1795 ptr->setStore (pAux);
1805 const std::string& key,
1811 if (!ptr->hasStore()) {
1814 if (!dp->isConst()) {
1817 ptr->setStore (pAux);
1824 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 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.
#define SG_MSG_WARNING(x,...)
#define SG_MSG_DEBUG(x,...)
#define SG_MSG_VERBOSE(x,...)
#define SG_MSG_INFO(x,...)
#define SG_MSG_ERROR(x,...)
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.
virtual StoreID::type storeID() const override
get store ID. request forwarded to DataStore:
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.
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?)
void setProxyDictInEventContext(IProxyDict *sg)
Update the IProxyDict in the current EventContext.
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)
Some out-of-line helpers for ExtendedEventContext.
static constexpr CLID ID()
SGKeyMap< remap_t > remap_map_t
IStringPool::sgkey_t sgkey_t