ATLAS Offline Software
SGImplSvc.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #undef DEBUG_SGIMPL
6 
7 #include <algorithm>
8 #include <cassert>
9 #include <cstdio>
10 #include <iostream>
11 #include <functional>
12 #include <format>
13 #include <string>
14 #include <unordered_map>
15 
16 #include <sstream>
17 #include <fstream>
18 #include <iomanip>
19 
24 #include "AthenaKernel/IIOVSvc.h"
27 #include "AthenaKernel/StoreID.h"
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"
39 #include "SGTools/DataProxy.h"
40 #include "SGTools/DataStore.h"
41 #include "SGTools/StringPool.h"
43 #include "SGTools/SGVersionedKey.h"
48 
49 // StoreGateSvc. must come before SGImplSvc.h
50 #include "StoreGate/StoreGateSvc.h"
52 #include "SGTools/DataStore.h"
53 
54 using std::setw;
55 using std::hex;
56 using std::dec;
57 using std::endl;
58 using std::ends;
59 using std::pair;
60 using std::string;
61 using std::vector;
62 
63 using SG::DataProxy;
64 using SG::DataStore;
66 
67 // Helpers for debug formatting
68 // std::print implementation to be replaced when C++ 23 is available
69 namespace dbg {
70 template <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);
72 }
73 
74 template <class T> void* ptr(T* p) { return static_cast<void*>(p); }
75 }
76 
78 // Remapping implementation.
79 
80 
81 namespace SG {
82 
83 
84  struct RemapImpl
85  {
87 
88  struct remap_t {
90  off_t index_offset;
91  };
94  };
95 
96 
97 } // namespace SG
98 
99 
102 SGImplSvc::SGImplSvc(const string& name,ISvcLocator* svc)
103  : Service(name, svc),
104  m_pCLIDSvc("ClassIDSvc", name),
105  m_pDataLoader("EventPersistencySvc", name),
106  m_pPPSHandle("ProxyProviderSvc", name),
107  m_pPPS(nullptr),
108  m_pHistorySvc("HistorySvc", name),
109  m_pStore(new DataStore(*this)),
110  m_pIncSvc("IncidentSvc", name),
111  m_DumpStore(false),
112  m_ActivateHistory(false),
113  m_DumpArena(false),
114  m_pIOVSvc("IOVSvc", name),
115  m_storeLoaded(false),
116  m_remap_impl (new SG::RemapImpl),
117  m_arena (name),
118  m_slotNumber(-1),
119  m_numSlots(1)
120 {
121  //our properties
122  declareProperty("ProxyProviderSvc", m_pPPSHandle);
123  declareProperty("Dump", m_DumpStore);
124  declareProperty("ActivateHistory", m_ActivateHistory);
125  declareProperty("DumpArena", m_DumpArena);
126  //StoreGateSvc properties
127  declareProperty("IncidentSvc", m_pIncSvc);
128  //add handler for Service base class property
129  m_outputLevel.declareUpdateHandler(&SGImplSvc::msg_update_handler, this);
130 
132  header->addArena (&m_arena);
133 }
134 
135 
139  header->delArena (&m_arena);
140 
141  delete m_pStore;
142  delete m_remap_impl;
143 }
144 
148 
149  verbose() << "Initializing " << name() << endmsg;
150 
152 
153  if (!m_pStore)
154  m_pStore = new DataStore (*this);
155  if (!m_remap_impl)
157 
158  //properties accessible from now on
159 
161  // If this is the default event store (StoreGateSvc), then declare
162  // our arena as the default for memory allocations.
163  if (this->storeID() == StoreID::EVENT_STORE) {
166  }
167  // set up the incident service:
168  if (!(m_pIncSvc.retrieve()).isSuccess()) {
169  error() << "Could not locate IncidentSvc "
170  << endmsg;
171  return StatusCode::FAILURE;
172  }
173 
174  // We explicitly do not retrieve m_pIOVSvc and rely on retrieval
175  // on first use to avoid an initialization loop here.
176 
177  CHECK( m_pDataLoader.retrieve() );
178  CHECK( m_pCLIDSvc.retrieve() );
179 
180  if (!m_pPPSHandle.empty()) {
181  CHECK( m_pPPSHandle.retrieve() );
182  m_pPPS = &*m_pPPSHandle;
183  }
184 
185  if ( m_pPPS && (m_pPPS->preLoadProxies(*m_pStore)).isFailure() )
186  {
187  SG_MSG_DEBUG(" Failed to preLoad proxies");
188  return StatusCode::FAILURE;
189  }
190 
191  // Get hold of History Service
192  if (m_ActivateHistory) {
193  CHECK( m_pHistorySvc.retrieve() );
194  }
195 
196  return StatusCode::SUCCESS;
197 }
200 
201  verbose() << "Start " << name() << endmsg;
202  /*
203  // This will need regFcn clients to be updated first.
204  if ( 0 == m_pPPS || (m_pPPS->preLoadProxies(*m_pStore)).isFailure() ) {
205  debug() << " Failed to preLoad proxies"
206  << endmsg;
207  return StatusCode::FAILURE;
208  }
209  */
210 
211  return StatusCode::SUCCESS;
212 }
215 
216  verbose() << "Stop " << name() << endmsg;
217  //HACK ALERT: ID event store objects refer to det store objects
218  //by setting an ad-hoc priority for event store(s) we make sure they are finalized and hence cleared first
219  // see e.g. https://savannah.cern.ch/bugs/index.php?99993
220  if (store()->storeID() == StoreID::EVENT_STORE) {
221  ISvcManager* pISM(dynamic_cast<ISvcManager*>(serviceLocator().get()));
222  if (!pISM)
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;
227  }
228  return StatusCode::SUCCESS;
229 }
230 
232 void SGImplSvc::handle(const Incident &inc) {
233 
234  if (inc.type() == "EndEvent") {
235  if (m_DumpStore) {
236  SG_MSG_DEBUG("Dumping StoreGate Contents");
237  info() << '\n' << dump() << endl
238  << endmsg;
239  }
240  }
241 }
242 
244  lock_t lock (m_mutex);
245  StatusCode sc(StatusCode::SUCCESS);
246  //FIXME this should probably be dealt with by the providers
247  if (0 != m_pPPS && !m_storeLoaded) {
248  m_storeLoaded = true;
250 #ifdef DEBUG_SGIMPL
251  dbg::print(stderr, "SGImplSvc::loadEventProxies() LOADED PROXIES on {}\n", name());
252  }
253  else {
254  dbg::print(stderr, "SGImplSvc::loadEventProxies() PROXIES ALREADY LOADED on {}\n", name());
255 #endif
256  }
257  return sc;
258 }
259 
261 // Create a key for a type (used if the client has not specified a key)
262 string SGImplSvc::createKey(const CLID& id)
263 {
264  return std::to_string(m_pStore->typeCount(id) + 1);
265 }
267 // clear store
269 {
270 #ifdef DEBUG_SGIMPL
271  dbg::print(stderr, "SGImplSvc::clearStore(forceRemove={}) on {}\n", forceRemove, name());
272 #endif
273  {
274  if (m_DumpArena) {
275  std::ostringstream s;
276  m_arena.report(s);
277  info() << "Report for Arena: " << m_arena.name() << '\n'
278  << s.str() << endmsg;
279  }
280  }
281  {
282  lock_t lock (m_mutex);
283  emptyTrash();
284  for (auto& p : m_newBoundHandles)
285  p.second.clear();
286  assert(m_pStore);
287  debug() << "Clearing store with forceRemove="
288  << forceRemove << endmsg;
289  bool hard_reset = (m_numSlots > 1);
290  m_pStore->clearStore(forceRemove, hard_reset, &msgStream(MSG::DEBUG));
291  m_storeLoaded=false; //FIXME hack needed by loadEventProxies
292  }
293  {
294  lock_t remap_lock (m_remapMutex);
295  m_remap_impl->m_remaps.clear();
296  m_arena.reset();
297  }
298 
299  return StatusCode::SUCCESS;
300 }
304  verbose() << "Finalizing " << name() << endmsg ;
305 
306  // Incident service may not work in finalize.
307  // Clear this, so that we won't try to send an incident from clearStore.
308  (m_pIncSvc.release()).ignore();
309 
310  const bool FORCEREMOVE(true);
311  clearStore(FORCEREMOVE).ignore();
312 
314  delete m_pStore;
315  m_pStore = nullptr;
316  delete m_remap_impl;
317  m_remap_impl = 0;
318  m_arena.erase();
319 
320  return Service::finalize();
321 }
325  verbose() << "Reinitializing " << name() << endmsg ;
326  const bool FORCEREMOVE(true);
327  clearStore(FORCEREMOVE).ignore();
328  //not in v20r2p2! return Service::reinitialize();
329  return StatusCode::SUCCESS;
330 }
331 
332 const InterfaceID&
334  static const InterfaceID IID("SGImplSvc", 1, 0);
335  return IID;
336 }
337 
338 // Query the interfaces.
339 // Input: riid, Requested interface ID
340 // ppvInterface, Pointer to requested interface
341 // Return: StatusCode indicating SUCCESS or FAILURE.
342 // N.B. Don't forget to release the interface after use!!!
343 StatusCode SGImplSvc::queryInterface(const InterfaceID& riid, void** ppvInterface)
344 {
345  if ( IProxyDict::interfaceID().versionMatch(riid) ) {
346  *ppvInterface = (IProxyDict*)this;
347  }
348  else if ( IProxyDict::interfaceID().versionMatch(riid) ) {
349  *ppvInterface = (IProxyDict*)this;
350  }
351  else if ( IHiveStoreMgr::interfaceID().versionMatch(riid) ) {
352  *ppvInterface = (IHiveStoreMgr*)this;
353  }
354  else if ( interfaceID().versionMatch(riid) ) {
355  // In principle this should be cast to ISGImplSvc*. However, there
356  // is an anomaly in that existing clients are using the concrete StoreGate
357  // interface instead of an abstract ISGImplSvc interface.
358  *ppvInterface = (SGImplSvc*)this;
359  } else {
360  // Interface is not directly available: try out a base class
361  return Service::queryInterface(riid, ppvInterface);
362  }
363  addRef();
364  return StatusCode::SUCCESS;
365 }
366 
369 // add proxy (with IOpaqueAddress that will later be retrieved from P)
371 StatusCode SGImplSvc::recordAddress(const std::string& skey,
372  IOpaqueAddress* pAddress,
373  bool clearAddressFlag)
374 {
375  lock_t lock (m_mutex);
376  assert(0 != pAddress);
377  CLID dataID = pAddress->clID();
378 
379  if (dataID == 0)
380  {
381  warning() << "recordAddress: Invalid Class ID found in IOpaqueAddress @"
382  << pAddress << ". IOA will not be recorded"
383  << endmsg;
384  return StatusCode::FAILURE;
385  }
386 
387  //do not overwrite a persistent object
388  if (m_pPPS) {
389  DataProxy* dp = m_pStore->proxy (dataID, skey);
390  if (!dp) {
391  dp = m_pPPS->retrieveProxy(dataID, skey, *m_pStore);
392  }
393  if (dp && dp->provider()) {
394  std::string clidTypeName;
395  m_pCLIDSvc->getTypeNameOfID(dataID, clidTypeName).ignore();
396  warning() << "recordAddress: failed for key="<< skey << ", type "
397  << clidTypeName
398  << " (CLID " << dataID << ')'
399  << "\n there is already a persistent version of this object. Will not record a duplicate! "
400  << endmsg;
401  return StatusCode::FAILURE;
402  }
403  }
404 
405  // Check if a key already exists
406  DataProxy* dp = m_pStore->proxy_exact(dataID, skey);
407  if (0 == dp && 0 != m_pPPS) {
408  dp = m_pPPS->retrieveProxy(dataID, skey, *m_pStore);
409  }
410 
411  // Now treat the various cases:
412  if (0 == dp)
413  {
414  // create the proxy object and register it
415  dp = new DataProxy (TransientAddress (dataID, skey,
416  pAddress, clearAddressFlag),
417  m_pDataLoader.get(), true, true);
418  m_pStore->addToStore(dataID, dp).ignore();
419 
420  addAutoSymLinks (skey, dataID, dp, 0, false);
421  }
422  else if ((0 != dp) && (0 == dp->address()))
423  // Note: intentionally not checking dp->isValidAddress()
424  {
425  // Update proxy with IOpaqueAddress
426  dp->setAddress(pAddress);
427  }
428  else
429  {
430  string errType;
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
436  << endmsg;
437  return StatusCode::FAILURE;
438  }
439 
440  return StatusCode::SUCCESS;
441 
442 }
443 
446 // add proxy (with IOpaqueAddress that will later be retrieved from P)
448 StatusCode SGImplSvc::recordAddress(IOpaqueAddress* pAddress, bool clearAddressFlag)
449 {
450  lock_t lock (m_mutex);
451  assert(0 != pAddress);
452 
453  CLID dataID = pAddress->clID();
454 
455  string gK = (pAddress->par())[1]; // transient name by convention
456  if (gK.empty()) gK = (pAddress->par())[0]; // FIXME backward compatibility
457  if (gK.empty()) gK = createKey(dataID);
458 
459  return this->recordAddress(gK, pAddress, clearAddressFlag);
460 }
461 
463  const string& gK,
464  DataObject* pDObj,
465  bool allowMods,
466  bool resetOnly) {
467  // locate the proxy
468  DataProxy* dp = m_pStore->proxy_exact(dataID, gK);
469 
470  if (0 != dp) { //proxy found
471  if (0 != dp->object())
472  {
473  // Case 0: duplicated proxy
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()
479  << endmsg;
480  recycle(pDObj); // commit this object to trash
481  dp = 0;
482  } else {
483  // Case 1: Proxy found... if not valid, update it:
484  dp->setObject(pDObj);
485  if (!allowMods) dp->setConst();
486  }
487  } else {
488  // Case 2: No Proxy found:
489  dp = new DataProxy(pDObj,
490  TransientAddress(dataID, gK),
491  !allowMods, resetOnly);
492  if (!(m_pStore->addToStore(dataID, dp).isSuccess())) {
493  warning() << " setupProxy:: could not addToStore proxy @" << dp
494  << endmsg;
495  recycle(pDObj); // commit this object to trash
496  delete dp;
497  dp = 0;
498  }
499  }
500  return dp;
501 }
502 
505 {
506  lock_t lock (m_mutex);
507  store()->setStoreID(id);
508 }
511 {
512  lock_t lock (m_mutex);
513  return store()->storeID();
514 }
515 
516 
517 void
518 SGImplSvc::keys(const CLID& id, std::vector<std::string>& vkeys,
519  bool includeAlias, bool onlyValid)
520 
521 {
522  lock_t lock (m_mutex);
523  return store()->keys(id, vkeys, includeAlias, onlyValid);
524 }
525 
526 
527 bool SGImplSvc::isSymLinked(const CLID& linkID, DataProxy* dp)
528 {
529  return (0 != dp) ? dp->transientID(linkID) : false;
530 }
531 
532 
533 StatusCode
535  const CallBackID& c2,
536  const IOVSvcCallBackFcn& fcn,
537  bool trigger)
538 {
539  lock_t lock (m_mutex);
540  return ( m_pIOVSvc->regFcn(c1,c2,fcn,trigger) );
541 }
542 
543 
544 StatusCode
545 SGImplSvc::regFcn( const std::string& toolName,
546  const CallBackID& c2,
547  const IOVSvcCallBackFcn& fcn,
548  bool trigger)
549 {
550  lock_t lock (m_mutex);
551  return ( m_pIOVSvc->regFcn(toolName,c2,fcn,trigger) );
552 }
553 
554 
556 // Dump Contents in store:
557 string SGImplSvc::dump() const
558 {
559  lock_t lock (m_mutex);
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");
565 
566  DataStore::ConstStoreIterator s_iter, s_end;
567  store()->tRange(s_iter, s_end).ignore();
568 
569  for (; s_iter != s_end; ++s_iter)
570  {
571 
572  CLID id = s_iter->first;
573  int nProxy = store()->typeCount(id);
574  std::string tname;
575  m_pCLIDSvc->getTypeNameOfID(id, tname).ignore();
576  std::format_to(out, "{}: Found {} {} for ClassID {} ({}): \n", me, nProxy, ((nProxy == 1) ? "proxy" : "proxies"), id, tname);
577 
578  // loop over each type:
579  SG::ConstProxyIterator p_iter = (s_iter->second).begin();
580  SG::ConstProxyIterator p_end = (s_iter->second).end();
581 
582  while (p_iter != p_end) {
583  const DataProxy& dp(*p_iter->second);
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"),
588  dbg::ptr(dp.object()), p_iter->first);
589  ++p_iter;
590  }
591  }
592  std::format_to(out, "{}: <<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>> \n", me);
593  return out_buffer;
594 }
595 
596 DataStore*
598 {
599  return m_pStore;
600 }
601 
602 const DataStore*
604 {
605  return m_pStore;
606 }
607 
608 
610 // Make a soft link to the object with key
612 StatusCode SGImplSvc::symLink(const void* pObject, CLID linkID)
613 {
614  lock_t lock (m_mutex);
615  SG::DataProxy* dp(proxy(pObject));
616 
617  // if symLink already exists, just return success
618  return isSymLinked(linkID,dp) ?
619  StatusCode::SUCCESS :
620  addSymLink(linkID,dp);
621 }
622 
623 StatusCode SGImplSvc::symLink(const CLID id, const std::string& key, const CLID linkID)
624 {
625  lock_t lock (m_mutex);
626  SG::DataProxy* dp(proxy(id, key, false));
627  // if symLink already exists, just return success
628  return isSymLinked(linkID,dp) ?
629  StatusCode::SUCCESS :
630  addSymLink(linkID,dp);
631 }
632 
633 
636 {
637  if (0 == dp) {
638  warning() << "addSymLink: no target DataProxy found. Sorry, can't link to a non-existing data object"
639  << endmsg;
640  return StatusCode::FAILURE;
641  }
642  StatusCode sc = m_pStore->addSymLink(linkid, dp);
643 
644  // If the symlink is a derived->base conversion, then we may have
645  // a different transient pointer for the symlink.
646  if (sc.isSuccess() && dp->object()) {
647  void* baseptr = SG::DataProxy_cast (dp, linkid);
648  if (baseptr)
649  this->t2pRegister (baseptr, dp).ignore();
650  }
651  return sc;
652 }
653 
654 
655 StatusCode SGImplSvc::setAlias(const void* pObject, const std::string& aliasKey)
656 {
657  lock_t lock (m_mutex);
658 
659  SG::DataProxy* dp(0);
660  dp = proxy(pObject);
661  if (0 == dp) {
662  error() << "setAlias: problem setting alias "
663  << aliasKey << '\n'
664  << "DataObject does not exist, record before setting alias."
665  << endmsg;
666  return StatusCode::FAILURE;
667  }
668 
669  StatusCode sc = addAlias(aliasKey, dp);
670  if (sc.isFailure()) {
671  error() << "setAlias: problem setting alias "
672  << aliasKey << '\n'
673  << "DataObject does not exist, record before setting alias."
674  << endmsg;
675  return StatusCode::FAILURE;
676  }
677 
678  return StatusCode::SUCCESS;
679 }
680 
681 
683  const std::string& key, const std::string& aKey)
684 {
685  lock_t lock (m_mutex);
686 
687  SG::DataProxy* dp(0);
688  dp = proxy(clid, key);
689  if (0 == dp) {
690  error() << "setAlias: problem setting alias "
691  << std::string(aKey) << '\n'
692  << "DataObject does not exist, record before setting alias."
693  << endmsg;
694  return StatusCode::FAILURE;
695  }
696 
697  StatusCode sc = addAlias(aKey, dp);
698  if (sc.isFailure()) {
699  error() << "setAlias: problem setting alias "
700  << (std::string)aKey << '\n'
701  << "DataObject does not exist, record before setting alias."
702  << endmsg;
703  return StatusCode::FAILURE;
704  }
705 
706  return StatusCode::SUCCESS;
707 }
708 
709 StatusCode SGImplSvc::setAlias(SG::DataProxy* proxy, const std::string& aliasKey)
710 {
711  return addAlias( aliasKey, proxy );
712 }
713 
715 SGImplSvc::addAlias(const std::string& aliasKey, DataProxy* proxy)
716 {
717  if (0 == proxy) {
718  warning() << "addAlias: no target DataProxy given, Cannot alias to a non-existing object"
719  << endmsg;
720  return StatusCode::FAILURE;
721  }
722 
723  // add key to proxy and to ProxyStore
724  return m_pStore->addAlias(aliasKey, proxy);
725 }
726 
727 int SGImplSvc::typeCount(const CLID& id) const
728 {
729  lock_t lock (m_mutex);
730  return m_pStore->typeCount(id);
731 }
732 
733 
734 bool
735 SGImplSvc::contains(const CLID id, const std::string& key) const
736 {
737  try {
738  return (0 != proxy(id, key, true));
739  } catch(...) { return false; }
740 }
741 
742 
743 bool
744 SGImplSvc::transientContains(const CLID id, const std::string& key) const
745 {
746  try {
747  return (0 != transientProxy(id, key));
748  } catch(...) { return false; }
749 }
750 
751 
752 DataProxy*
753 SGImplSvc::proxy(const void* const pTransient) const
754 {
755  // No lock needed here --- the T2pmap held by DataStore has its own locking
756  // (and we were seeing contention here).
757  //lock_t lock (m_mutex);
758  return m_pStore->locatePersistent(pTransient);
759 }
760 
761 DataProxy*
762 SGImplSvc::proxy(const CLID& id) const
763 {
764  return proxy(id, false);
765 }
766 
767 DataProxy*
768 SGImplSvc::proxy(const CLID& id, bool checkValid) const
769 {
770  DataProxy* dp = nullptr;
771  {
772  lock_t lock (m_mutex);
773  dp = m_pStore->proxy(id);
774  if (0 == dp && 0 != m_pPPS) {
776  dp = m_pPPS->retrieveProxy(id, string("DEFAULT"), *pStore);
777  }
778  }
780  // Be sure to release the lock before this.
781  // isValid() may call back to the store, so we could otherwise deadlock..
782  if (checkValid && 0 != dp) {
783  // FIXME: For keyless retrieve, this checks only the first instance
784  // of the CLID in store. If that happens to be invalid, but the second
785  // is valid - this does not work (when checkValid is requested).
786  return dp->isValid() ? dp : 0;
787  }
788  return dp;
789 }
790 
791 DataProxy*
792 SGImplSvc::proxy(const CLID& id, const string& key) const
793 {
794  return proxy(id, key, false);
795 }
796 
797 DataProxy*
798 SGImplSvc::proxy(const CLID& id, const string& key, bool checkValid) const
799 {
800  DataProxy* dp = nullptr;
801  {
802  lock_t lock (m_mutex);
803  dp = m_pStore->proxy(id, key);
804 #ifdef DEBUG_SGIMPL
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");
806 #endif
807  if (0 == dp && 0 != m_pPPS) {
809  dp = m_pPPS->retrieveProxy(id, key, *pStore);
810 #ifdef DEBUG_SGIMPL
811  if (!dp) dbg::print(stderr, "::SGImplSvc::proxy(name={}, key={}): data proxy is still null\n", this->name(), key);
812 #endif
813  }
814  }
815  // Be sure to release the lock before this.
816  // isValid() may call back to the store, so we could otherwise deadlock..
817  if (checkValid && 0 != dp && !(dp->isValid())) {
818  dp = 0;
819  }
820  return dp;
821 }
822 
823 
830 {
831  lock_t lock (m_mutex);
832  return m_pStore->addToStore (id, proxy);
833 }
834 
835 
857  const std::string& key,
858  bool allowMods,
859  bool returnExisting)
860 {
861  lock_t lock (m_mutex);
862  const void* raw_ptr = obj.get();
863  const std::type_info* tinfo = nullptr;
864 
865  if (DataBucketBase* bucket = dynamic_cast<DataBucketBase*> (obj.get())) {
866  raw_ptr = bucket->object();
867  tinfo = &bucket->tinfo();
868  }
869 
870  if (returnExisting) {
871  SG::DataProxy* proxy = this->proxy (obj->clID(), key);
872  if (proxy && proxy->isValid()) return proxy;
873 
874  // Look for the same object recorded under a different key/clid.
875  proxy = this->proxy (raw_ptr);
876  if (proxy && proxy->isValid()) {
877  if (proxy->transientID (obj->clID())) {
878  // CLID matches. Make an alias.
879  if (addAlias (key, proxy).isFailure()) {
880  CLID clid = proxy->clID();
881  std::string clidTypeName;
882  m_pCLIDSvc->getTypeNameOfID(clid, clidTypeName).ignore();
883  warning() << "SGImplSvc::recordObject: addAlias fails for object "
884  << clid << "[" << clidTypeName << "] " << proxy->name()
885  << " and new key " << key
886  << endmsg;
887 
888  proxy = nullptr;
889  }
890  }
891 
892  else if (key == proxy->name() || proxy->hasAlias(key) > 0)
893  {
894  // key matches. Make a symlink.
895  if (addSymLink (obj->clID(), proxy).isFailure()) {
896  CLID clid = proxy->clID();
897  std::string clidTypeName;
898  m_pCLIDSvc->getTypeNameOfID(clid, clidTypeName).ignore();
899  CLID newclid = obj->clID();
900  std::string newclidTypeName;
901  m_pCLIDSvc->getTypeNameOfID(newclid, newclidTypeName).ignore();
902  error() << "SGImplSvc::recordObject: addSymLink fails for object "
903  << clid << "[" << clidTypeName << "] " << proxy->name()
904  << " and new clid " << newclid << "[" << newclidTypeName << "]"
905  << endmsg;
906  proxy = nullptr;
907  }
908  }
909 
910  else {
911  CLID clid = proxy->clID();
912  std::string clidTypeName;
913  m_pCLIDSvc->getTypeNameOfID(clid, clidTypeName).ignore();
914  CLID newclid = obj->clID();
915  std::string newclidTypeName;
916  m_pCLIDSvc->getTypeNameOfID(newclid, newclidTypeName).ignore();
917  error() << "SGImplSvc::recordObject: existing object found with "
918  << clid << "[" << clidTypeName << "] " << proxy->name()
919  << " but neither clid " << newclid << "[" << newclidTypeName << "]"
920  << " nor key " << key << " match."
921  << endmsg;
922  proxy = nullptr;
923  }
924 
925  return proxy;
926  }
927  }
928 
929  const bool resetOnly = true;
930  const bool noHist = false;
931  SG::DataProxy* proxy = nullptr;
932  if (this->typeless_record (obj.get(), key, raw_ptr,
933  allowMods, resetOnly, noHist, tinfo,
934  &proxy, true).isFailure())
935  {
936  return nullptr;
937  }
938  return proxy;
939 }
940 
941 
946 {
948 }
949 
950 
957 void SGImplSvc::setSlotNumber (int slot, int numSlots)
958 {
959  m_slotNumber = slot;
960  m_numSlots = numSlots;
961 
963  header->setArenaForSlot (slot, &m_arena);
964 }
965 
966 
967 std::vector<const SG::DataProxy*>
969 {
970  lock_t lock (m_mutex);
971  const std::vector<SG::DataProxy*>& proxies = store()->proxies();
972  std::vector<const SG::DataProxy*> ret (proxies.begin(), proxies.end());
973  return ret;
974 }
975 
976 
977 std::vector<CLID>
979 {
980  lock_t lock (m_mutex);
981 
982  using std::distance;
983  DataStore::ConstStoreIterator s_iter, s_end;
984  store()->tRange(s_iter, s_end).ignore();
985 
986  std::vector<CLID> clids;
987  clids.reserve( distance( s_iter, s_end ) );
988 
989  for (; s_iter != s_end; ++s_iter ) {
990  const CLID id = s_iter->first;
991  clids.push_back (id);
992  }
993 
994  return clids;
995 }
996 
997 
998 DataProxy*
999 SGImplSvc::transientProxy(const CLID& id, const string& key) const
1000 {
1001  lock_t lock (m_mutex);
1002  DataProxy* dp(m_pStore->proxy(id, key));
1003  return ( (0 != dp && dp->isValidObject()) ? dp : 0 );
1004 }
1005 
1006 DataObject*
1007 SGImplSvc::accessData(const CLID& id) const
1008 {
1009  lock_t lock (m_mutex);
1010  DataProxy* theProxy(proxy(id, true));
1011  return (0 == theProxy) ? 0 : theProxy->accessData();
1012 }
1013 
1014 DataObject*
1015 SGImplSvc::accessData(const CLID& id, const string& key) const
1016 {
1017  lock_t lock (m_mutex);
1018  DataProxy* theProxy(proxy(id, key, true));
1019  return (0 == theProxy) ? 0 : theProxy->accessData();
1020 }
1021 
1022 bool
1024  const std::string& keyA, const std::string& keyB )
1025 {
1026  lock_t lock (m_mutex);
1027  const bool checkValid = true;
1028  DataProxy* a = proxy( id, keyA, checkValid );
1029  DataProxy* b = proxy( id, keyB, checkValid );
1030  if ( 0 == a || 0 == b ) { return false; }
1031  DataObject* objA = a->accessData();
1032  DataObject* objB = b->accessData();
1033 
1034  if ( 0 == objA || 0 == objB ) { return false; }
1035  // prevent 'accidental' release of DataObjects...
1036  const unsigned int refCntA = objA->addRef();
1037  const unsigned int refCntB = objB->addRef();
1038  // in case swap is being specialized for DataObjects
1039  using std::swap;
1040  swap( objA, objB );
1041  a->setObject( objA );
1042  b->setObject( objB );
1043  // and then restore old ref-count;
1044  return ( (refCntA-1) == objA->release() &&
1045  (refCntB-1) == objB->release() );
1046 }
1047 
1048 StatusCode
1049 SGImplSvc::typeless_record( DataObject* obj, const std::string& key,
1050  const void* const raw_ptr,
1051  bool allowMods, bool resetOnly, bool noHist)
1052 {
1053  return typeless_record (obj, key, raw_ptr, allowMods, resetOnly, noHist, 0,
1054  nullptr, true);
1055 }
1056 
1057 
1058 StatusCode
1059 SGImplSvc::typeless_record( DataObject* obj, const std::string& key,
1060  const void* const raw_ptr,
1061  bool allowMods, bool resetOnly, bool noHist,
1062  const std::type_info* tinfo)
1063 {
1064  return typeless_record (obj, key, raw_ptr, allowMods, resetOnly, noHist,tinfo,
1065  nullptr, true);
1066 }
1067 
1068 
1069 StatusCode
1070 SGImplSvc::typeless_record( DataObject* obj, const std::string& key,
1071  const void* const raw_ptr,
1072  bool allowMods, bool resetOnly, bool noHist,
1073  const std::type_info* tinfo,
1074  SG::DataProxy** proxy_ret,
1075  bool noOverwrite)
1076 {
1077  lock_t lock (m_mutex);
1078  SG::DataProxy* proxy =
1079  record_impl( obj, key, raw_ptr, allowMods, resetOnly, !noOverwrite, tinfo);
1080  if ( proxy == nullptr )
1081  return StatusCode::FAILURE;
1082  if (proxy_ret)
1083  *proxy_ret = proxy;
1084 
1085  if ( !m_ActivateHistory || noHist ) {
1086  return StatusCode::SUCCESS;
1087  }
1088 
1089  if ( store()->storeID() != StoreID::EVENT_STORE ) {
1090  return StatusCode::SUCCESS;
1091  } else {
1092  return record_HistObj( obj->clID(), key, name(), allowMods, resetOnly );
1093  }
1094 }
1095 
1096 StatusCode
1098  DataObject* obj,
1099  const std::string& key,
1100  const void* const raw_ptr,
1101  bool allowMods,
1102  bool noHist,
1103  const std::type_info* tinfo)
1104 {
1105  lock_t lock (m_mutex);
1106  StatusCode sc(StatusCode::SUCCESS);
1107  SG::DataProxy* toRemove(proxy(clid, key, false));
1108  if (0 != toRemove) {
1109  toRemove->addRef();
1110  const bool FORCEREMOVE(true);
1111  sc =removeProxy(toRemove, (void*)0, FORCEREMOVE);
1112  }
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;
1118  else if ( m_ActivateHistory && noHist && store()->storeID() == StoreID::EVENT_STORE ) {
1119  sc = record_HistObj( obj->clID(), key, name(), allowMods, NORESET );
1120  }
1121  }
1122  //for detector store objects managed by IIOVSvc, replace the old proxy with the new one (#104311)
1123  if (toRemove && sc.isSuccess() && store()->storeID() == StoreID::DETECTOR_STORE) {
1124  sc = m_pIOVSvc->replaceProxy(toRemove, proxy(clid, key));
1125  }
1126  if (toRemove)
1127  toRemove->release();
1128  return sc;
1129 }
1130 
1132 SGImplSvc::record_impl( DataObject* pDObj, const std::string& key,
1133  const void* const raw_ptr,
1134  bool allowMods, bool resetOnly, bool allowOverwrite,
1135  const std::type_info* tinfo)
1136 {
1137  CLID clid = pDObj->clID();
1138  std::string rawKey(key);
1139  bool isVKey(SG::VersionedKey::isVersionedKey(key));
1140  if (isVKey) {
1141  //FIXME VersionedKeys will need to be handled more efficiently
1142  SG::VersionedKey vk(rawKey);
1143  DataProxy *dp(proxy(clid, vk.key()));
1144  if (dp) {
1145  //proxies primary key
1146  const std::string& pTAName(dp->name());
1147  //original key as versioned
1148  SG::VersionedKey primaryVK(pTAName);
1149 
1150  //if the existing matching object has no version
1151  //create a versioned alias for the original unversioned key
1152  //so it will remain accessible
1153  if (!SG::VersionedKey::isVersionedKey(pTAName)) {
1154  if (!(this->addAlias(primaryVK.rawVersionKey(), dp)).isSuccess()) {
1155  warning() << "record_impl: Could not setup alias key "
1156  << primaryVK.rawVersionKey()
1157  << " for unversioned object " << pTAName
1158  << endmsg;
1159  return nullptr;
1160  }
1161  }
1162  if (vk.isAuto()) {
1163  //make a new versioned key incrementing the existing version
1164  SG::VersionedKey newVK(primaryVK.key(), primaryVK.version()+1);
1165  //FIXME this will fail in a confusing way if version+1 is in use
1166  //FIXME need a better error message below, probably looking at all
1167  //FIXME aliases
1168  rawKey = newVK.rawVersionKey();
1169  }
1170  }
1171  }
1172  if (!allowOverwrite && m_pPPS) {
1173  //do not overwrite a persistent object
1174  DataProxy* dp = m_pStore->proxy (clid, rawKey);
1175  if (!dp) {
1176  dp = m_pPPS->retrieveProxy(clid, rawKey, *m_pStore);
1177  }
1178  if (dp && dp->provider()) {
1179  std::string clidTypeName;
1180  m_pCLIDSvc->getTypeNameOfID(clid, clidTypeName).ignore();
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."
1185  << endmsg;
1186  }
1187  }
1188  //now check whether raw_ptr has already been recorded
1189  //We need to do this before we create the bucket, the proxy etc
1190  SG::DataProxy* dp(proxy(raw_ptr));
1191  if (0 != dp) {
1192  std::string clidTypeName;
1193  m_pCLIDSvc->getTypeNameOfID(clid, clidTypeName).ignore();
1194  warning() << "record_impl: failed for key="<< rawKey << ", type "
1195  << clidTypeName
1196  << " (CLID " << clid << ')'
1197  << "\n object @" << raw_ptr
1198  << " already in store with key="<< dp->name()
1199  << ". Will not record a duplicate! "
1200  << endmsg;
1201  if (pDObj != dp->object()) {
1202  DataBucketBase* pDBB(dynamic_cast<DataBucketBase*>(pDObj));
1203  if (!pDBB) std::abort();
1204  pDBB->relinquish(); //don't own the data obj already recorded!
1205  }
1206  this->recycle(pDObj);
1207  return nullptr;
1208  }
1209 
1210 
1211  // setup the proxy
1212  dp = setupProxy( clid, rawKey, pDObj, allowMods, resetOnly );
1213  if ( 0 == dp ) {
1214  std::string clidTypeName;
1215  m_pCLIDSvc->getTypeNameOfID(clid, clidTypeName).ignore();
1216  warning() << "record_impl: Problem setting up the proxy for object @"
1217  << raw_ptr
1218  << "\n recorded with key " << rawKey
1219  << " of type " << clidTypeName
1220  << " (CLID " << clid << ") in DataObject @" << pDObj
1221  << endmsg;
1222 
1223  return nullptr;
1224  }
1225 
1226  // record in t2p:
1227  if ( !(this->t2pRegister( raw_ptr, dp )).isSuccess() ) {
1228  std::string clidTypeName;
1229  m_pCLIDSvc->getTypeNameOfID(clid, clidTypeName).ignore();
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 << ')'
1234  << endmsg;
1235  return nullptr;
1236  }
1237 
1238  addAutoSymLinks (rawKey, clid, dp, tinfo);
1239 
1240  //handle versionedKeys: we register an alias with the "true" key
1241  //unless an object as already been recorded with that key.
1242  //Notice that addAlias overwrites any existing alias, so a generic
1243  //retrieve will always return the last version added
1244  //FIXME not the one with the highest version
1245  if (isVKey) {
1246  SG::VersionedKey vk(rawKey);
1247  if (!(this->addAlias(vk.key(), dp)).isSuccess()) {
1248  warning() << "record_impl: Could not setup alias key " << vk.key()
1249  << " for VersionedKey " << rawKey
1250  << ". Generic access to this object with clid" << clid
1251  << " will not work"
1252  << endmsg;
1253  }
1254  }
1255 
1256  return dp;
1257 }
1258 
1259 DataProxy*
1261  bool checkValid) const
1262 {
1263  DataProxy* dp = m_pStore->proxy(tAddr);
1264 
1265  if (checkValid && 0 != dp) {
1266  return dp->isValid() ? dp : 0;
1267  } else {
1268  return dp;
1269  }
1270 }
1271 
1272 StatusCode
1274  bool forceRemove)
1275 {
1276  lock_t lock (m_mutex);
1277  // check if valid proxy
1278  if (0 == proxy) return StatusCode::FAILURE;
1279 
1280  if (0 == pTrans) {
1281  DataBucketBase* bucket = dynamic_cast<DataBucketBase*>(proxy->object());
1282  if (bucket) pTrans = bucket->object();
1283  }
1284 
1285  // remove all entries from t2p map
1286  // --- only if the proxy actually has an object!
1287  // otherwise, we can trigger I/O.
1288  // besides being useless here, we can get deadlocks if we
1289  // call into the I/O code while holding the SG lock.
1290  if (proxy->isValidObject()) {
1291  this->t2pRemove(pTrans);
1293  for (SG::DataProxy::CLIDCont_t::const_iterator i = clids.begin();
1294  i != clids.end();
1295  ++i)
1296  {
1297  void* ptr = SG::DataProxy_cast (proxy, *i);
1298  this->t2pRemove(ptr);
1299  }
1300  }
1301 
1302  // remove from store
1303  return m_pStore->removeProxy(proxy, forceRemove, true);
1304 }
1305 
1306 StatusCode
1307 SGImplSvc::t2pRegister(const void* const pTrans, DataProxy* const pPers)
1308 {
1309  return m_pStore->t2pRegister(pTrans, pPers);
1310 }
1311 
1312 
1313 void
1314 SGImplSvc::t2pRemove(const void* const pTrans)
1315 {
1316  m_pStore->t2pRemove(pTrans);
1317 }
1318 
1319 void
1320 SGImplSvc::msg_update_handler(Gaudi::Details::PropertyBase& /*outputLevel*/)
1321 {
1322  setUpMessaging();
1323  updateMsgStreamOutputLevel( outputLevel() );
1324  msgSvc()->setOutputLevel(name(), outputLevel());
1325 }
1326 
1327 StatusCode
1330  SG::ConstProxyIterator& end) const {
1331  lock_t lock (m_mutex);
1332  return m_pStore->pRange(id,begin,end);
1333 }
1334 
1335 StatusCode SGImplSvc::setConst(const void* pObject)
1336 {
1337  lock_t lock (m_mutex);
1338  // Check if DataProxy does not exist
1339  DataProxy * dp = proxy(pObject);
1340 
1341  if (0 == dp)
1342  {
1343  warning() << "setConst: NO Proxy for the dobj you want to set const"
1344  << endmsg;
1345  return StatusCode::FAILURE;
1346  }
1347 
1348  dp->setConst();
1349  return StatusCode::SUCCESS;
1350 }
1351 
1352 
1353 // remove an object from Store, will remove its proxy if not reset only
1354 StatusCode
1355 SGImplSvc::remove(const void* pObject)
1356 {
1357  lock_t lock (m_mutex);
1358  return removeProxy(proxy(pObject), pObject);
1359 }
1360 
1361 
1362 // remove an object and its proxy from Store
1363 StatusCode
1364 SGImplSvc::removeDataAndProxy(const void* pObject)
1365 {
1366  lock_t lock (m_mutex);
1367  const bool FORCEREMOVE(true);
1368  return removeProxy(proxy(pObject), pObject, FORCEREMOVE);
1369 }
1370 
1371 //put a bad (unrecordable) dobj away
1372 void SGImplSvc::recycle(DataObject* pBadDObj) {
1373  assert(pBadDObj);
1374  pBadDObj->addRef();
1375  m_trash.push_back(pBadDObj);
1376 }
1377 
1378 //throw away bad objects
1380  lock_t lock (m_mutex);
1381  while (!m_trash.empty()) {
1382  m_trash.front()->release(); //delete the bad data object
1383  m_trash.pop_front(); //remove pointer from list
1384  }
1385 }
1386 
1387 
1388 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1389 
1390 bool SGImplSvc::bindHandleToProxy(const CLID& id, const string& key,
1391  IResetable* ir, DataProxy *&dp)
1392 {
1393  lock_t lock (m_mutex);
1394 
1395  dp = m_pStore->proxy (id, key);
1396  if (dp == nullptr && m_pPPS != nullptr) {
1397  dp = m_pPPS->retrieveProxy(id, key, *m_pStore);
1398  }
1399 
1400  if (0 == dp) return false;
1401 
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"
1407  << endmsg;
1408  return false;
1409  }
1410 
1411  //already done in DataHandleBase::setState dp->addRef();
1412 
1413 #ifndef NDEBUG
1414  SG_MSG_DEBUG(" Bound handle " << MSG::hex << ir << " to proxy "
1415  << dp << MSG::dec);
1416 #endif
1417  return true;
1418 }
1419 
1420 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1421 
1422 bool SGImplSvc::bindHandleToProxyAndRegister (const CLID& id, const std::string& key,
1424 {
1425  lock_t lock (m_mutex);
1426  bool ret = bindHandleToProxy (id, key, ir, dp);
1427  if (ret) {
1428  StatusCode sc = m_pIOVSvc->regProxy(dp,key);
1429  if (sc.isFailure()) return false;
1430  }
1431  return true;
1432 }
1433 
1434 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1435 
1436 bool SGImplSvc::bindHandleToProxyAndRegister (const CLID& id, const std::string& key,
1438  const CallBackID& c,
1439  const IOVSvcCallBackFcn& fcn,
1440  bool trigger)
1441 {
1442  lock_t lock (m_mutex);
1443  bool ret = bindHandleToProxy (id, key, ir, dp);
1444  if (ret) {
1445  StatusCode sc = m_pIOVSvc->regProxy(dp,key);
1446  if (sc.isFailure()) return false;
1447  sc = m_pIOVSvc->regFcn(dp,c,fcn,trigger);
1448  if (sc.isFailure()) return false;
1449  }
1450  return true;
1451 }
1452 
1453 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1454 
1455 StatusCode
1456 SGImplSvc::record_HistObj(const CLID& id, const std::string& key,
1457  const std::string& store,
1458  bool allowMods, bool resetOnly) {
1459 
1460  DataHistory *dho;
1461  dho = m_pHistorySvc->createDataHistoryObj( id, key, store );
1462 
1463  std::string idname;
1464  StatusCode sc = m_pCLIDSvc->getTypeNameOfID(id, idname);
1465  if (sc.isFailure() || idname.empty() ) {
1466  idname = std::to_string(id);
1467  }
1468  idname += '/';
1469  idname += key;
1470 
1471  DataObject* obj = SG::asStorable(dho);
1472 
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;
1478 }
1479 
1480 
1490 SGImplSvc::stringToKey (const std::string& str, CLID clid)
1491 {
1492  lock_t lock (m_stringPoolMutex);
1493  return m_stringpool.stringToKey (str, clid);
1494 }
1495 
1496 
1504 const std::string* SGImplSvc::keyToString (sgkey_t key) const
1505 {
1506  lock_t lock (m_stringPoolMutex);
1507  return m_stringpool.keyToString (key);
1508 }
1509 
1510 
1519 const std::string*
1521 {
1522  lock_t lock (m_stringPoolMutex);
1523  return m_stringpool.keyToString (key, clid);
1524 }
1525 
1526 
1540  const std::string& str,
1541  CLID clid)
1542 {
1543  lock_t lock (m_stringPoolMutex);
1544  if (!m_stringpool.registerKey (key, str, clid)) {
1545  CLID clid2;
1546  const std::string* str2 = m_stringpool.keyToString (key, clid2);
1547  REPORT_MESSAGE (MSG::WARNING) << "The numeric key " << key
1548  << " maps to multiple string key/CLID pairs: "
1549  << *str2 << "/" << clid2 << " and "
1550  << str << "/" << clid;
1551  }
1552 }
1553 
1554 
1563 {
1564  // We should hold m_stringPoolMutex before touching the pool.
1565  // But if we acquire the locks for both this and the other store,
1566  // we risk a deadlock. So first copy the other pool, so that we
1567  // don't need to hold both locks at the same time.
1569  {
1570  lock_t lock (other.m_stringPoolMutex);
1571  tmp = other.m_stringpool;
1572  }
1573  lock_t lock (m_stringPoolMutex);
1574  return m_stringpool.merge (tmp);
1575 }
1576 
1577 
1578 void
1579 SGImplSvc::releaseObject(const CLID& id, const std::string& key) {
1580  lock_t lock (m_mutex);
1581  DataProxy *pP(0);
1582  if (0 != (pP = proxy(id, key))) {
1583  // remove all entries from t2p map
1585  SG::DataProxy::CLIDCont_t::const_iterator i(clids.begin()), e(clids.end());
1586  while (i != e) t2pRemove(SG::DataProxy_cast (pP, *i++));
1587  DataBucketBase *pDBB(dynamic_cast<DataBucketBase*>(pP->object()));
1588  //tell the bucket to let go of the data object
1589  if (0 != pDBB) pDBB->relinquish(); //somebody else better took ownership
1590  bool hard_reset = (m_numSlots > 1);
1591  pP->reset (hard_reset);
1592  }
1593 }
1594 
1595 void
1597  lock_t lock (m_mutex);
1598 
1599  // Remove transient pointer entries for this proxy.
1600  // But do that only if the proxy has a valid object.
1601  // Otherwise, we could trigger I/O --- which we don't want since it's useless
1602  // (we'd just destroy the object immediately). In some cases it can also
1603  // lead to a deadlock (see ATR-24482).
1604  if (dp->isValidObject()) {
1605  SG::DataProxy::CLIDCont_t clids = dp->transientID();
1606  SG::DataProxy::CLIDCont_t::const_iterator i(clids.begin()), e(clids.end());
1607  while (i != e) {
1609  }
1610  }
1611 
1612  bool hard_reset = (m_numSlots > 1);
1613  dp->reset (hard_reset);
1614 }
1615 
1616 
1625  sgkey_t target,
1626  off_t index_offset)
1627 {
1628  lock_t lock (m_remapMutex);
1630  payload.target = target;
1631  payload.index_offset = index_offset;
1633 }
1634 
1635 
1644 bool SGImplSvc::tryELRemap (sgkey_t sgkey_in, size_t index_in,
1645  sgkey_t& sgkey_out, size_t& index_out)
1646 {
1647  lock_t lock (m_remapMutex);
1649  m_remap_impl->m_remaps.find (sgkey_in);
1650  if (i == m_remap_impl->m_remaps.end())
1651  return false;
1652  const SG::RemapImpl::remap_t& payload = i->second;
1653  sgkey_out = payload.target;
1654  index_out = index_in + payload.index_offset;
1655  return true;
1656 }
1657 
1658 
1660  const std::string& key)
1661 {
1662  lock_t lock (m_mutex);
1663  DataObject* obj = nullptr;
1664  SG::DataProxy* dp = proxy (clid, key);
1665  //we do not want anyone to mess up with our copy hence we release it immediately.
1666  if (dp && dp->isValid()) {
1667  obj = dp->object();
1668  obj->addRef();
1670  }
1671  return obj;
1672 }
1673 
1674 
1675 CLID SGImplSvc::clid( const std::string& key ) const
1676 {
1677  lock_t lock (m_mutex);
1678  SG::DataStore::ConstStoreIterator s_iter, s_end;
1679  store()->tRange(s_iter, s_end).ignore();
1680 
1681  for ( ; s_iter != s_end; ++s_iter ) {
1682  if ( s_iter->second.find( key ) != s_iter->second.end() ) {
1683  return s_iter->first;
1684  }
1685  }
1686 
1687  return CLID_NULL;
1688 }
1689 
1690 
1691 std::vector<CLID> SGImplSvc::clids( const std::string& key ) const
1692 {
1693  lock_t lock (m_mutex);
1694  std::vector<CLID> clids;
1695  SG::DataStore::ConstStoreIterator s_iter, s_end;
1696  store()->tRange(s_iter, s_end).ignore();
1697 
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);
1701  }
1702  }
1703 
1704  return clids;
1705 }
1706 
1707 
1709 void SGImplSvc::addAutoSymLinks (const std::string& key,
1710  CLID clid,
1711  DataProxy* dp,
1712  const std::type_info* tinfo,
1713  bool warn_nobib /*= true*/)
1714 {
1715  // Automatically make all legal base class symlinks
1716  if (!tinfo) {
1718  }
1719  const SG::BaseInfoBase* bib = nullptr;
1720  if (tinfo) {
1721  bib = SG::BaseInfoBase::find (*tinfo);
1722  }
1723  if (!bib) {
1724  // Could succeed where the previous fails if clid for DataVector<T>
1725  // but tinfo is for ConstDataVector<DataVector<T> >.
1726  bib = SG::BaseInfoBase::find (clid);
1727  }
1728  if ( bib ) {
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 ) {
1732  if ( addSymLink( bases[i], dp ).isSuccess() ) {
1733  // register with t2p
1734  if (dp->object())
1735  this->t2pRegister( SG::DataProxy_cast( dp, bases[i] ), dp ).ignore();
1736  }
1737  else {
1738  warning() << "record_impl: Doing auto-symlinks for object with CLID "
1739  << clid
1740  << " and SG key " << key
1741  << ": Proxy already set for base CLID " << bases[i]
1742  << "; not making auto-symlink." << endmsg;
1743  }
1744  }
1745  }
1746 
1747  // Handle copy conversions.
1748  {
1749  for (CLID copy_clid : bib->get_copy_conversions()) {
1750  if (m_pStore->addSymLink (copy_clid, dp).isFailure()) {
1751  warning() << "record_impl: Doing auto-symlinks for object with CLID "
1752  << clid
1753  << " and SG key " << key
1754  << ": Proxy already set for copy-conversion CLID "
1755  << copy_clid
1756  << "; not making auto-symlink." << endmsg;
1757  }
1758  }
1759  }
1760  }
1761  else {
1762  if (warn_nobib) {
1763  warning() << "record_impl: Could not find suitable SG::BaseInfoBase for CLID ["
1764  << clid << "] (" << key << ") !\t"
1765  << "No auto-symlink established !"
1766  << endmsg;
1767  }
1768  }
1769 }
1770 
1771 void
1773  lock_t lock (m_mutex);
1774 
1775  // Reset handles added since the last call to commit.
1776  bool hard_reset = (m_numSlots > 1);
1777  std::vector<IResetable*> handles;
1778  m_newBoundHandles[std::this_thread::get_id()].swap (handles);
1779  for (IResetable* h : handles)
1780  h->reset (hard_reset);
1781 }
1782 
1783 
1789 void
1791 {
1792  m_newBoundHandles[std::this_thread::get_id()].push_back (handle);
1793 }
1794 
1795 
1801 void
1803 {
1804  std::vector<IResetable*>& v = m_newBoundHandles[std::this_thread::get_id()];
1806  std::find (v.begin(), v.end(), handle);
1807  if (it != v.end())
1808  v.erase (it);
1809 }
1810 
1811 
1815 {
1816  lock_t lock (m_mutex);
1817  m_arena.makeCurrent();
1819 }
1820 
1821 
1832 StatusCode
1833 SGImplSvc::createObj (IConverter* cvt,
1834  IOpaqueAddress* addr,
1835  DataObject*& refpObject)
1836 {
1837  // This lock was here originally, but is probably not really needed ---
1838  // both DataProxy and the I/O components have their own locks.
1839  // Further, this was observed to cause deadlocks for the detector store,
1840  // and would in general be expected to be a contention issue.
1841  //lock_t lock (m_mutex);
1842  return cvt->createObj (addr, refpObject);
1843 }
1844 
1845 
1846 // This is intended to be called from the debugger.
1847 void SG_dump (SGImplSvc* sg)
1848 {
1849  std::cout << sg->dump() << "\n";
1850 }
1851 void SG_dump (SGImplSvc* sg, const char* fname)
1852 {
1853  std::ofstream f (fname);
1854  f << sg->dump() << "\n";
1855  f.close();
1856 }
1857 
1858 
1865 SG::SourceID SGImplSvc::sourceID (const std::string& key /*= "EventSelector"*/) const
1866 {
1867  lock_t lock (m_mutex);
1869  if (dp) {
1870  const DataHeader* dh = SG::DataProxy_cast<DataHeader> (dp);
1871  if (dh) {
1872  return dh->begin()->getToken()->dbID().toString();
1873  }
1874  }
1875  return "";
1876 }
1877 
1878 
1880 // Retrieve a list of collections from Transient Store with no Key.
1881 // const version
1884  SG::detail::IteratorBase& cibegin,
1885  SG::detail::IteratorBase& ciend) const
1886 {
1887  lock_t lock (m_mutex);
1890 
1891  if (!(proxyRange(clid,first,end)).isSuccess()) {
1892  std::string typnam;
1893  m_pCLIDSvc->getTypeNameOfID(clid, typnam).ignore();
1894  SG_MSG_DEBUG("retrieve(range): no object found "
1895  << " of type " << typnam
1896  << "(CLID " << clid << ')');
1897  }
1898 
1899  (ciend.setState(end, end, true)).ignore();
1900 
1901  if (!(cibegin.setState(first, end, true)).isSuccess()) {
1902  std::string typnam;
1903  m_pCLIDSvc->getTypeNameOfID(clid, typnam).ignore();
1904  SG_MSG_DEBUG("retrieve(range): Can't initialize iterator for object range "
1905  << " of type " << typnam
1906  << "(CLID " << clid << ')');
1907  return StatusCode::FAILURE;
1908  }
1909 
1910  return StatusCode::SUCCESS;
1911 }
1912 
1913 
1915  const std::string& key,
1916  CLID auxclid) const
1917 {
1918  // If we already have the aux store (as should usually be the case), return
1919  // without taking out the SG lock. Otherwise, we can deadlock
1920  // if another thread is also trying to dereference a link to the aux store.
1921  // (Should _not_ be holding the SG lock when dereferencing the link!)
1922  if (ptr->hasStore()) return true;
1923 
1924  lock_t lock (m_mutex);
1925  SG_MSG_VERBOSE("called associateAux_impl for key " + key);
1926  // no Aux store set yet
1927  if (!ptr->hasStore()) {
1928  SG::DataProxy* dp = proxy (auxclid, key + "Aux.", true);
1929  if (dp) {
1930  if (!dp->isConst()) {
1931  SG::IAuxStore* pAux = SG::DataProxy_cast<SG::IAuxStore> (dp);
1932  if (pAux) {
1933  ptr->setStore (pAux);
1934  return true;
1935  }
1936  }
1937 
1938  const SG::IConstAuxStore* pAux = SG::DataProxy_cast<SG::IConstAuxStore> (dp);
1939  if (pAux) {
1940  ptr->setStore (pAux);
1941  return true;
1942  }
1943  }
1944  }
1945  return false;
1946 }
1947 
1948 
1950  const std::string& key,
1951  CLID auxclid) const
1952 {
1953  lock_t lock (m_mutex);
1954  SG_MSG_VERBOSE("called associateAux_impl for key " + key);
1955  // no Aux store set yet
1956  if (!ptr->hasStore()) {
1957  SG::DataProxy* dp = proxy (auxclid, key + "Aux.", true);
1958  if (dp) {
1959  if (!dp->isConst()) {
1960  SG::IAuxStore* pAux = SG::DataProxy_cast<SG::IAuxStore> (dp);
1961  if (pAux) {
1962  ptr->setStore (pAux);
1963  return true;
1964  }
1965  }
1966 
1967  const SG::IConstAuxStore* pAux = SG::DataProxy_cast<SG::IConstAuxStore> (dp);
1968  if (pAux) {
1969  ptr->setStore (pAux);
1970  return true;
1971  }
1972  }
1973  }
1974  return false;
1975 }
grepfile.info
info
Definition: grepfile.py:38
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
SG::DataProxy_cast
DATA * DataProxy_cast(DataProxy *proxy)
cast the proxy into the concrete data object it proxies
Definition: DataProxy_cast.h:53
SGImplSvc::mergeStringPool
bool mergeStringPool(const SGImplSvc &other)
Merge the string pool from another store into this one.
Definition: SGImplSvc.cxx:1562
SG::VersionedKey::isVersionedKey
static bool isVersionedKey(const char *)
quickly determine whether a string has the right format to be a VK
Definition: SGVersionedKey.cxx:18
SGImplSvc::associateAux_impl
bool associateAux_impl(SG::AuxVectorBase *ptr, const std::string &key, CLID auxclid) const
Definition: SGImplSvc.cxx:1914
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
SG::DataStore::typeCount
int typeCount(const CLID &id) const
Count number of object of a given type in store.
Definition: Control/SGTools/src/DataStore.cxx:407
SGTest::store
TestStore store
Definition: TestStore.cxx:23
common.sgkey
def sgkey(tool)
Definition: common.py:1028
CurrentEventStore.h
Hold a pointer to the current event store.
CallBackID
Definition: CallBackID.h:24
SGImplSvc::setAlias
StatusCode setAlias(CLID clid, const std::string &key, const std::string &aliasKey)
make an alias to a DataObject (provide data type and old key)
Definition: SGImplSvc.cxx:682
TileDCSDataPlotter.dp
dp
Definition: TileDCSDataPlotter.py:840
SGImplSvc::contains
bool contains(const CLID id, const std::string &key) const
Look up a keyed object in TDS by CLID.
Definition: SGImplSvc.cxx:735
SGImplSvc::createObj
virtual StatusCode createObj(IConverter *cvt, IOpaqueAddress *addr, DataObject *&refpObject) override
Call converter to create an object, with locking.
Definition: SGImplSvc.cxx:1833
SGImplSvc::addSymLink
StatusCode addSymLink(const CLID &linkid, SG::DataProxy *dp)
Definition: SGImplSvc.cxx:635
python.tests.PyTestsLib.finalize
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
Definition: PyTestsLib.py:50
SGImplSvc::setConst
StatusCode setConst(const void *pointer)
prevent downstream clients from modifying the pointed-at dobj
Definition: SGImplSvc.cxx:1335
SGImplSvc::SGImplSvc
SGImplSvc(const SGImplSvc &)=delete
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
SG::DataStore::t2pRegister
StatusCode t2pRegister(const void *const pTrans, DataProxy *const pPers)
methods to query the T2PMap:
Definition: Control/SGTools/src/DataStore.cxx:615
SGImplSvc::locatePersistent
SG::DataProxy * locatePersistent(const SG::TransientAddress *tAddr, bool checkValid=false) const
Definition: SGImplSvc.cxx:1260
header
Definition: hcg.cxx:526
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:402
SG::RemapImpl::remap_t::target
sgkey_t target
Definition: SGImplSvc.cxx:89
SGImplSvc::clearStore
virtual StatusCode clearStore(bool forceRemove=false) override final
clear DataStore contents: called by the event loop mgrs
Definition: SGImplSvc.cxx:268
SG
Forward declaration.
Definition: CaloCellPacker_400_500.h:32
SGImplSvc::commitNewDataObjects
virtual void commitNewDataObjects() override final
Reset handles added since the last call to commit.
Definition: SGImplSvc.cxx:1772
vtune_athena.format
format
Definition: vtune_athena.py:14
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
python.CaloAddPedShiftConfig.args
args
Definition: CaloAddPedShiftConfig.py:47
DataBucketBase
A non-templated base class for DataBucket, allows to access the transient object address as a void*.
Definition: DataBucketBase.h:24
SGImplSvc::recordObject
virtual SG::DataProxy * recordObject(SG::DataObjectSharedPtr< DataObject > obj, const std::string &key, bool allowMods, bool returnExisting) override final
Record an object in the store.
Definition: SGImplSvc.cxx:856
SG::DataStore::proxy
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...
Definition: Control/SGTools/src/DataStore.cxx:416
SG::StringPool
Definition: StringPool.h:35
IProxyProviderSvc::loadProxies
virtual StatusCode loadProxies(IProxyRegistry &dataStore)=0
add new proxies to store every Event:
DataBucketBase.h
SG::VersionedKey::version
unsigned char version() const
Definition: SGVersionedKey.cxx:67
SG::AuxElement
Base class for elements of a container that can have aux data.
Definition: AuxElement.h:483
DataBucketBase::object
virtual void * object()=0
initialize
void initialize()
Definition: run_EoverP.cxx:894
SG_dump
void SG_dump(SGImplSvc *sg)
These are intended to be easy to call from the debugger.
Definition: SGImplSvc.cxx:1847
DataStore.h
SGImplSvc::boundHandle
virtual void boundHandle(IResetable *handle) override final
Tell the store that a proxy has been bound to a handle.
Definition: SGImplSvc.cxx:1790
SG::DataStore::addAlias
virtual StatusCode addAlias(const std::string &aliasKey, DataProxy *proxy) override
add alias to store
Definition: Control/SGTools/src/DataStore.cxx:379
extractSporadic.c1
c1
Definition: extractSporadic.py:134
CSV_InDetExporter.new
new
Definition: CSV_InDetExporter.py:145
SGVersionedKey.h
SGImplSvc::removeProxy
StatusCode removeProxy(SG::DataProxy *proxy, const void *pTrans, bool forceRemove=false)
remove proxy from store, unless it is reset only.
Definition: SGImplSvc.cxx:1273
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
SG::RemapImpl::sgkey_t
IStringPool::sgkey_t sgkey_t
Definition: SGImplSvc.cxx:86
skel.it
it
Definition: skel.GENtoEVGEN.py:407
SGImplSvc::stringToKey
virtual sgkey_t stringToKey(const std::string &str, CLID clid) override final
Find the key for a string/CLID pair.
Definition: SGImplSvc.cxx:1490
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
SG::TransientAddress
Definition: TransientAddress.h:32
SG::DataProxy::accessData
DataObject * accessData()
Access DataObject on-demand using conversion service.
SGImplSvc::m_newBoundHandles
std::map< std::thread::id, std::vector< IResetable * > > m_newBoundHandles
Keep track of proxies bound since the last call to commitNewDataObjects or clearStore.
Definition: SGImplSvc.h:723
SG::CurrentEventStore::setStore
static IProxyDict * setStore(IProxyDict *store)
Set the current store.
Definition: CurrentEventStore.cxx:36
SGImplSvc::proxyRange
StatusCode proxyRange(const CLID &id, SG::ConstProxyIterator &beg, SG::ConstProxyIterator &end) const
return a range to all proxies of a given CLID
Definition: SGImplSvc.cxx:1328
CLIDRegistry::CLIDToTypeinfo
static const std::type_info * CLIDToTypeinfo(CLID clid)
Translate between CLID and type_info.
Definition: CLIDRegistry.cxx:136
SGImplSvc::m_stringPoolMutex
mutex_t m_stringPoolMutex
Definition: SGImplSvc.h:729
SGImplSvc::m_pIncSvc
ServiceHandle< IIncidentSvc > m_pIncSvc
property
Definition: SGImplSvc.h:693
get_generator_info.stderr
stderr
Definition: get_generator_info.py:40
SGImplSvc::emptyTrash
void emptyTrash()
throw away bad objects
Definition: SGImplSvc.cxx:1379
SG::DataStore::ConstStoreIterator
StoreMap::const_iterator ConstStoreIterator
Definition: Control/SGTools/SGTools/DataStore.h:81
SG::DataStore::clearStore
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...
Definition: Control/SGTools/src/DataStore.cxx:68
SGImplSvc::releaseObject
void releaseObject(const CLID &id, const std::string &key)
release object held by proxy, if any.
Definition: SGImplSvc.cxx:1579
SG::DataProxy::isValid
bool isValid() const
called by destructor
PyPoolBrowser.dh
dh
Definition: PyPoolBrowser.py:102
SGImplSvc::proxies
virtual std::vector< const SG::DataProxy * > proxies() const override final
return the list of all current proxies in store
Definition: SGImplSvc.cxx:968
dbg::ptr
void * ptr(T *p)
Definition: SGImplSvc.cxx:74
SGImplSvc::reinitialize
virtual StatusCode reinitialize() override final
Service reinitialization.
Definition: SGImplSvc.cxx:324
Args
Definition: test_lwtnn_fastgraph.cxx:12
IStringPool::sgkey_t
SG::sgkey_t sgkey_t
Type of the keys.
Definition: IStringPool.h:34
SG::RemapImpl
Definition: SGImplSvc.cxx:85
SG::BaseInfoBase::get_bases
const std::vector< CLID > & get_bases() const
Return the class IDs of all known bases of T (that have class IDs).
Definition: BaseInfo.cxx:304
SGImplSvc::sourceID
virtual SG::SourceID sourceID(const std::string &key="EventSelector") const override
Return the metadata source ID for the current event slot.
Definition: SGImplSvc.cxx:1865
SG::VersionedKey::isAuto
static bool isAuto(const std::string &)
quickly determine whether a string has the right format to be a VK with auto-generated version #
Definition: SGVersionedKey.cxx:28
IProxyDict
A proxy dictionary.
Definition: AthenaKernel/AthenaKernel/IProxyDict.h:47
SG::DataStore::setStoreID
void setStoreID(StoreID::type id)
Definition: Control/SGTools/SGTools/DataStore.h:92
AuxVectorBase.h
Manage index tracking and synchronization of auxiliary data.
AthenaPoolTestWrite.stream
string stream
Definition: AthenaPoolTestWrite.py:12
SG::detail::IteratorBase::setState
StatusCode setState(SG::ConstProxyIterator itr, SG::ConstProxyIterator itrEnd, bool isConst)
Reset state of the iterator.
Definition: SGIterator.cxx:94
SG::AuxVectorBase
Manage index tracking and synchronization of auxiliary data.
Definition: AuxVectorBase.h:98
SGImplSvc::m_ActivateHistory
bool m_ActivateHistory
Activate the history service.
Definition: SGImplSvc.h:695
SG::Arena::makeCurrent
ArenaBase * makeCurrent()
Make this Arena the current one for its ArenaHeader.
Definition: Arena.cxx:59
SG::DataProxy::CLIDCont_t
TransientAddress::TransientClidSet CLIDCont_t
Definition: DataProxy.h:54
SGImplSvc::m_storeLoaded
bool m_storeLoaded
FIXME hack needed by loadEventProxies.
Definition: SGImplSvc.h:704
SG::ArenaBase::report
void report(std::ostream &os) const
Generate a report of the memory in use by this Arena.
Definition: ArenaBase.cxx:76
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
SGImplSvc::m_slotNumber
int m_slotNumber
The Hive slot number for this store, or -1 if this isn't a Hive store.
Definition: SGImplSvc.h:714
SGImplSvc::keyToString
virtual const std::string * keyToString(sgkey_t key) const override final
Find the string corresponding to a given key.
Definition: SGImplSvc.cxx:1504
SG::StringPool::clear
void clear()
Empty the pool.
Definition: StringPool.cxx:350
SGImplSvc::initialize
virtual StatusCode initialize() override final
Service initialization.
Definition: SGImplSvc.cxx:147
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
SGImplSvc::typeless_overwrite
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
Definition: SGImplSvc.cxx:1097
SG::RemapImpl::m_remaps
remap_map_t m_remaps
Definition: SGImplSvc.cxx:93
SGImplSvc::bindHandleToProxyAndRegister
bool bindHandleToProxyAndRegister(const CLID &id, const std::string &key, IResetable *ir, SG::DataProxy *&dp)
Also do registration with IOVSvc.
Definition: SGImplSvc.cxx:1422
SGImplSvc::storeID
StoreID::type storeID() const
get store ID. request forwarded to DataStore:
Definition: SGImplSvc.cxx:510
SGImplSvc::unboundHandle
virtual void unboundHandle(IResetable *handle) override final
Tell the store that a handle has been unbound from a proxy.
Definition: SGImplSvc.cxx:1802
SG::asStorable
DataObject * asStorable(SG::DataObjectSharedPtr< T > pObject)
Definition: DataObjectSharedPtr.h:65
DiTauMassTools::ignore
void ignore(T &&)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:58
SGImplSvc::m_pStore
SG::DataStore * m_pStore
Definition: SGImplSvc.h:690
IResetable
a resetable object (e.g. a SG DataHandle)
Definition: IResetable.h:15
ArenaHeader.h
Proxy for a group of Arenas. See Arena.h for an overview of the arena-based memory allocators.
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
python.UpdateManyBadChannelIOVs.toRemove
tuple toRemove
Definition: UpdateManyBadChannelIOVs.py:87
SGImplSvc::m_pDataLoader
ServiceHandle< IConversionSvc > m_pDataLoader
Definition: SGImplSvc.h:681
SGImplSvc::m_DumpStore
bool m_DumpStore
Dump Property flag: triggers dump() at EndEvent.
Definition: SGImplSvc.h:694
StdJOSetup.msgSvc
msgSvc
Provide convenience handles for various services.
Definition: StdJOSetup.py:36
SGImplSvc::clids
std::vector< CLID > clids() const
Return all CLIDs in the store.
Definition: SGImplSvc.cxx:978
DataHeader
This class provides the layout for summary information stored for data written to POOL.
Definition: DataHeader.h:126
lumiFormat.i
int i
Definition: lumiFormat.py:85
SG::ArenaHeader
Proxy for a group of Arenas.
Definition: ArenaHeader.h:54
SGImplSvc::bindHandleToProxy
bool bindHandleToProxy(const CLID &id, const std::string &key, IResetable *ir, SG::DataProxy *&dp)
name says it all
Definition: SGImplSvc.cxx:1390
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
SGImplSvc::sgkey_t
IStringPool::sgkey_t sgkey_t
Definition: SGImplSvc.h:353
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::ArenaBase::reset
void reset()
Reset all contained allocators.
Definition: ArenaBase.cxx:44
SGImplSvc::m_arena
SG::Arena m_arena
Allocation arena to associate with this store.
Definition: SGImplSvc.h:711
SGImplSvc.h
SG::VersionedKey
a StoreGateSvc key with a version number. Notice that StoreGate does not order multiple instances of ...
Definition: SGVersionedKey.h:31
SGImplSvc::m_stringpool
SG::StringPool m_stringpool
Definition: SGImplSvc.h:706
ClassID_traits
Default, invalid implementation of ClassID_traits.
Definition: Control/AthenaKernel/AthenaKernel/ClassID_traits.h:37
StringPool.h
Maintain a mapping of strings to 64-bit ints.
SGImplSvc::accessData
DataObject * accessData(const CLID &id) const
find proxy and access its data. Returns 0 to flag failure
Definition: SGImplSvc.cxx:1007
SG::DataStore::addSymLink
StatusCode addSymLink(const CLID &linkid, DataProxy *proxy)
add symlink to store:
Definition: Control/SGTools/src/DataStore.cxx:332
SGImplSvc::clearProxyPayload
void clearProxyPayload(SG::DataProxy *)
use to reset a proxy (clearing the data object it contains) Unlike DataProxy::reset this method corre...
Definition: SGImplSvc.cxx:1596
SGImplSvc::setupProxy
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
Definition: SGImplSvc.cxx:462
IOVSvcCallBackFcn
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
Definition: IOVSvcDefs.h:58
SG::BaseInfoBase::get_copy_conversions
std::vector< CLID > get_copy_conversions() const
Return known copy conversions.
Definition: BaseInfo.cxx:455
SGImplSvc
The Athena Transient Store API.
Definition: SGImplSvc.h:111
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
hist_file_dump.f
f
Definition: hist_file_dump.py:141
SGImplSvc::transientContains
bool transientContains(const CLID id, const std::string &key) const
Look up a transient data object in TDS only by CLID.
Definition: SGImplSvc.cxx:744
SGImplSvc::m_pHistorySvc
ServiceHandle< IHistorySvc > m_pHistorySvc
Definition: SGImplSvc.h:688
SG::StringPool::keyToString
const std::string * keyToString(sgkey_t key) const
Find the string corresponding to a given key.
Definition: StringPool.cxx:286
Handler::svc
AthROOTErrorHandlerSvc * svc
Definition: AthROOTErrorHandlerSvc.cxx:10
SGImplSvc::remove
StatusCode remove(const void *pObject)
Remove pObject, will remove its proxy if not reset only.
Definition: SGImplSvc.cxx:1355
SGImplSvc::remap_impl
void remap_impl(sgkey_t source, sgkey_t target, off_t index_offset)
Declare a remapping.
Definition: SGImplSvc.cxx:1624
SG::ArenaBase::erase
void erase()
Erase all contained allocators.
Definition: ArenaBase.cxx:60
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
SGImplSvc::record_impl
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
Definition: SGImplSvc.cxx:1132
SGImplSvc::tryELRemap
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.
Definition: SGImplSvc.cxx:1644
DataHeader.h
This file contains the class definition for the DataHeader and DataHeaderElement classes.
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
IProxyProviderSvc::preLoadProxies
virtual StatusCode preLoadProxies(IProxyRegistry &dataStore)=0
add proxies to the store before Begin Event:
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
SG::DataProxy::clID
CLID clID() const
Retrieve clid.
SGImplSvc::~SGImplSvc
virtual ~SGImplSvc() override final
Standard Destructor.
Definition: SGImplSvc.cxx:137
StoreID::DETECTOR_STORE
@ DETECTOR_STORE
Definition: StoreID.h:27
SGImplSvc::msg_update_handler
void msg_update_handler(Gaudi::Details::PropertyBase &outputLevel)
callback for output level property
Definition: SGImplSvc.cxx:1320
StoreID.h
SGImplSvc::finalize
virtual StatusCode finalize() override final
Service finalization.
Definition: SGImplSvc.cxx:303
SG::DataStore::storeID
virtual StoreID::type storeID() const override
Definition: Control/SGTools/SGTools/DataStore.h:93
IProxyProviderSvc::retrieveProxy
virtual SG::DataProxy * retrieveProxy(const CLID &id, const std::string &key, IProxyRegistry &dataStore)=0
Use a provider to create a proxy for ID/KEY.
SGImplSvc::recordAddress
StatusCode recordAddress(const std::string &skey, IOpaqueAddress *pAddress, bool clearAddressFlag=true)
Create a proxy object using an IOpaqueAddress and a transient key.
Definition: SGImplSvc.cxx:371
SGImplSvc::retrieve
StatusCode retrieve(CLID clid, SG::detail::IteratorBase &cibegin, SG::detail::IteratorBase &ciend) const
Retrieve all objects of type T: returns an SG::ConstIterator range.
Definition: SGImplSvc.cxx:1883
SGImplSvc::dump
std::string dump() const
dump objects in store.
Definition: SGImplSvc.cxx:557
SGImplSvc::registerKey
virtual void registerKey(sgkey_t key, const std::string &str, CLID clidid) override final
Remember an additional mapping from key to string/CLID.
Definition: SGImplSvc.cxx:1539
SGImplSvc::setStoreID
void setStoreID(StoreID::type id)
set store ID. request forwarded to DataStore:
Definition: SGImplSvc.cxx:504
dbg
Definition: SGImplSvc.cxx:69
SGImplSvc::typeCount
int typeCount(const CLID &id) const
Return the number of instances of type T (input CLID)
Definition: SGImplSvc.cxx:727
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
SGImplSvc::record_HistObj
StatusCode record_HistObj(const CLID &id, const std::string &key, const std::string &store, bool allowMods, bool resetOnly=true)
Definition: SGImplSvc.cxx:1456
debug
const bool debug
Definition: MakeUncertaintyPlots.cxx:53
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
SG::BaseInfoBase::find
static const BaseInfoBase * find(CLID clid)
Find the BaseInfoBase instance for clid.
Definition: BaseInfo.cxx:569
SGImplSvc::removeDataAndProxy
StatusCode removeDataAndProxy(const void *pObject)
Remove pObject and its proxy no matter what.
Definition: SGImplSvc.cxx:1364
SGImplSvc::recycle
void recycle(DataObject *pBadDObj)
put a bad (unrecordable) dobj away
Definition: SGImplSvc.cxx:1372
SGImplSvc::m_DumpArena
bool m_DumpArena
DumpArena Property flag : trigger m_arena->report() at clearStore.
Definition: SGImplSvc.h:696
errorcheck.h
Helpers for checking error return status codes and reporting errors.
SG::DataStore::keys
void keys(const CLID &id, std::vector< std::string > &vkeys, bool includeAlias, bool onlyValid)
Definition: Control/SGTools/src/DataStore.cxx:121
SGImplSvc::clid
CLID clid(const std::string &key) const
Retrieve the main CLID of the object recorded in StoreGate with the given "key" WARNING: slow!
Definition: SGImplSvc.cxx:1675
SGImplSvc::typeless_record
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...
Definition: SGImplSvc.cxx:1049
SG::VersionedKey::rawVersionKey
const std::string & rawVersionKey() const
Definition: SGVersionedKey.h:76
SG::RemapImpl::remap_t::index_offset
off_t index_offset
Definition: SGImplSvc.cxx:90
SG::sgkey_t
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
Definition: CxxUtils/CxxUtils/sgkey_t.h:32
IHiveStoreMgr
the interface through which HiveWB control StoreGate instances
Definition: IHiveStoreMgr.h:24
StoreClearedIncident.h
Incident sent after a store is cleared.
SG::DataProxy::name
virtual const name_type & name() const override final
Retrieve data object key == string.
SG::DataStore::locatePersistent
DataProxy * locatePersistent(const void *const pTransient) const
locate the persistent (proxy) for a given T* (void*):
Definition: Control/SGTools/src/DataStore.cxx:608
SGImplSvc::queryInterface
virtual StatusCode queryInterface(const InterfaceID &riid, void **ppvInterface) override final
Definition: SGImplSvc.cxx:343
SGImplSvc::interfaceID
static const InterfaceID & interfaceID()
Should rather be in ISGImplSvc.h if we had one.
Definition: SGImplSvc.cxx:333
SGImplSvc::m_numSlots
int m_numSlots
The total number of slots. 1 if this isn't a Hive store.
Definition: SGImplSvc.h:717
SGImplSvc::symLink
StatusCode symLink(const void *p2BRegistered, CLID linkID)
make a soft link to the object T* already registered
Definition: SGImplSvc.cxx:612
PixelModuleFeMask_create_db.payload
string payload
Definition: PixelModuleFeMask_create_db.py:69
SGImplSvc::addToStore
virtual StatusCode addToStore(CLID id, SG::DataProxy *proxy) override final
Raw addition of a proxy to the store.
Definition: SGImplSvc.cxx:829
SGImplSvc::m_pCLIDSvc
ServiceHandle< IClassIDSvc > m_pCLIDSvc
Definition: SGImplSvc.h:680
SGImplSvc::addAlias
StatusCode addAlias(const std::string &aliasKey, SG::DataProxy *dp)
Definition: SGImplSvc.cxx:715
REPORT_MESSAGE
#define REPORT_MESSAGE(LVL)
Report a message.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:365
IIOVSvc.h
SGImplSvc::handle
virtual void handle(const Incident &) override final
triggered by Incident service
Definition: SGImplSvc.cxx:232
python.TrigPSCPythonDbSetup.outputLevel
outputLevel
Definition: TrigPSCPythonDbSetup.py:30
SG::IAuxStore
Interface for non-const operations on an auxiliary store.
Definition: IAuxStore.h:48
SG::VersionedKey::key
const std::string & key() const
Definition: SGVersionedKey.cxx:71
CLIDRegistry.h
a static registry of CLID->typeName entries. NOT for general use. Use ClassIDSvc instead.
python.AthDsoLogger.fname
string fname
Definition: AthDsoLogger.py:67
ir
int ir
counter of the current depth
Definition: fastadd.cxx:49
python.PyAthena.v
v
Definition: PyAthena.py:154
SG::DataProxy::isValidObject
bool isValidObject() const
is the object valid?
SG::ArenaHeader::defaultHeader
static ArenaHeader * defaultHeader()
Return the global default Header instance.
Definition: ArenaHeader.cxx:164
python.DataFormatRates.c2
c2
Definition: DataFormatRates.py:123
SG::DataStore::addToStore
virtual StatusCode addToStore(const CLID &id, DataProxy *proxy) override
add proxy to store.
Definition: Control/SGTools/src/DataStore.cxx:142
SG::DataProxy::hasAlias
bool hasAlias(const std::string &key) const
Test to see if a given string is in the alias set.
SGImplSvc::transientProxy
SG::DataProxy * transientProxy(const CLID &id, const std::string &key) const
get proxy with given id and key.
Definition: SGImplSvc.cxx:999
SG::DataStore::proxy_exact
virtual SG::DataProxy * proxy_exact(sgkey_t sgkey) const override
get proxy with given key.
Definition: Control/SGTools/src/DataStore.cxx:526
fmt
a
TList * a
Definition: liststreamerinfos.cxx:10
SG::DataProxy::reset
void reset(bool hard=false)
Other methods of DataProxy (not in Interface IRegistry):
Definition: DataProxy.cxx:240
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
SGImplSvc::m_pIOVSvc
ServiceHandle< IIOVSvc > m_pIOVSvc
get the IOVSvc "just in time" (breaks recursion at initialize)
Definition: SGImplSvc.h:702
h
SGImplSvc::makeCurrent
void makeCurrent()
The current store is becoming the active store.
Definition: SGImplSvc.cxx:1814
SG::DataProxy::transientID
bool transientID(CLID id) const
return the list of transient IDs (primary or symLinked):
SGImplSvc::m_trash
std::list< DataObject * > m_trash
The Recycle Bin.
Definition: SGImplSvc.h:691
StoreID::type
type
Definition: StoreID.h:24
SG::DataStore
Hold DataProxy instances associated with a store.
Definition: Control/SGTools/SGTools/DataStore.h:74
SG::DataStore::proxies
const std::vector< DataProxy * > & proxies() const
All proxies managed by this store.
Definition: Control/SGTools/src/DataStore.cxx:629
copySelective.target
string target
Definition: copySelective.py:37
TransientAddress.h
StoreID::findStoreID
static StoreID::type findStoreID(const std::string &storeName)
Definition: StoreID.cxx:21
SG::SourceID
std::string SourceID
Definition: AthenaKernel/AthenaKernel/SourceID.h:25
python.TriggerHandler.verbose
verbose
Definition: TriggerHandler.py:297
DeMoScan.first
bool first
Definition: DeMoScan.py:536
DEBUG
#define DEBUG
Definition: page_access.h:11
SG::SGKeyMap
std::unordered_map< sgkey_t, T > SGKeyMap
A map using sgkey_t as a key.
Definition: CxxUtils/CxxUtils/sgkey_t.h:93
SG::BaseInfoBase
The non-template portion of the BaseInfo implementation.
Definition: Control/AthenaKernel/AthenaKernel/BaseInfo.h:451
SG::DataStore::t2pRemove
void t2pRemove(const void *const pTrans)
Definition: Control/SGTools/SGTools/DataStore.h:256
SG::detail::IteratorBase
Definition: SGIterator.h:37
SGImplSvc::store
SG::DataStore * store()
Definition: SGImplSvc.cxx:597
SGImplSvc::stop
virtual StatusCode stop() override final
Service stop.
Definition: SGImplSvc.cxx:214
get
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition: hcg.cxx:127
IAuxStore.h
Interface for non-const operations on an auxiliary store.
SGImplSvc::m_pPPS
IProxyProviderSvc * m_pPPS
Definition: SGImplSvc.h:686
DataBucketBase::relinquish
virtual void relinquish()=0
Give up ownership of the DataBucket contents.
SG::DataStore::pRange
StatusCode pRange(const CLID &id, SG::ConstProxyIterator &f, SG::ConstProxyIterator &e) const
Return an iterator over proxy for a given CLID:
Definition: Control/SGTools/src/DataStore.cxx:576
SGImplSvc::lock_t
std::lock_guard< mutex_t > lock_t
Definition: SGImplSvc.h:726
IProxyProviderSvc.h
SG::DataStore::removeProxy
StatusCode removeProxy(DataProxy *proxy, bool forceRemove, bool hard)
remove proxy from store, unless proxy is reset only.
Definition: Control/SGTools/src/DataStore.cxx:199
SG::StringPool::merge
bool merge(const StringPool &other)
Merge another pool into this one.
Definition: StringPool.cxx:363
copySelective.source
string source
Definition: copySelective.py:32
str
Definition: BTagTrackIpAccessor.cxx:11
SGImplSvc::setSlotNumber
void setSlotNumber(int slot, int numSlots)
Set the Hive slot number for this store.
Definition: SGImplSvc.cxx:957
dbg::print
void print(std::FILE *stream, std::format_string< Args... > fmt, Args &&... args)
Definition: SGImplSvc.cxx:70
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
StoreID::EVENT_STORE
@ EVENT_STORE
Definition: StoreID.h:26
SG::DataObjectSharedPtr
Smart pointer to manage DataObject reference counts.
Definition: DataObjectSharedPtr.h:45
SGImplSvc::createKey
std::string createKey(const CLID &dataID)
creates a key internally if none specified by client
Definition: SGImplSvc.cxx:262
SGImplSvc::proxy_exact
virtual SG::DataProxy * proxy_exact(SG::sgkey_t sgkey) const override final
Get proxy given a hashed key+clid.
Definition: SGImplSvc.cxx:945
SG::StringPool::stringToKey
sgkey_t stringToKey(const std::string &str, sgaux_t aux=0)
Find the key for a string.
Definition: StringPool.cxx:248
IConstAuxStore.h
Interface for const operations on an auxiliary store.
SG::RemapImpl::remap_t
Definition: SGImplSvc.cxx:88
get_generator_info.error
error
Definition: get_generator_info.py:40
SG::IConstAuxStore
Interface for const operations on an auxiliary store.
Definition: IConstAuxStore.h:64
SGImplSvc::m_mutex
mutex_t m_mutex
Definition: SGImplSvc.h:727
checker_macros.h
Define macros for attributes used to control the static checker.
SGImplSvc::t2pRemove
void t2pRemove(const void *const pTrans)
forwarded to DataStore
Definition: SGImplSvc.cxx:1314
python.PyAthena.obj
obj
Definition: PyAthena.py:132
SGImplSvc::m_pPPSHandle
ServiceHandle< IProxyProviderSvc > m_pPPSHandle
Definition: SGImplSvc.h:683
SG::DataProxy
Definition: DataProxy.h:45
SGImplSvc::regFcn
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)
Definition: SGImplSvc.cxx:534
SGImplSvc::start
virtual StatusCode start() override final
Service start.
Definition: SGImplSvc.cxx:199
SGImplSvc::proxy
virtual SG::DataProxy * proxy(const void *const pTransient) const override final
get proxy for a given data object address in memory
Definition: SGImplSvc.cxx:753
SGImplSvc::isSymLinked
bool isSymLinked(const CLID &linkID, SG::DataProxy *dp)
Definition: SGImplSvc.cxx:527
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
SG::DataStore::tRange
StatusCode tRange(ConstStoreIterator &f, ConstStoreIterator &e) const
Return an iterator over the StoreMap:
Definition: Control/SGTools/src/DataStore.cxx:598
SGImplSvc::t2pRegister
StatusCode t2pRegister(const void *const pTrans, SG::DataProxy *const pPers)
forwarded to DataStore
Definition: SGImplSvc.cxx:1307
SG::DataStore::proxy_exact_unlocked
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.
Definition: Control/SGTools/src/DataStore.cxx:545
SG::RemapImpl::remap_map_t
SGKeyMap< remap_t > remap_map_t
Definition: SGImplSvc.cxx:92
StoreGateSvc.h
python.compressB64.c
def c
Definition: compressB64.py:93
SG::ArenaBase::name
const std::string & name() const
Return this Arena's name.
Definition: ArenaBase.cxx:114
SGImplSvc::typeless_retrievePrivateCopy
DataObject * typeless_retrievePrivateCopy(const CLID clid, const std::string &key)
Definition: SGImplSvc.cxx:1659
SG::ConstProxyIterator
ProxyMap::const_iterator ConstProxyIterator
Definition: ProxyMap.h:28
SG::StringPool::registerKey
bool registerKey(sgkey_t key, const std::string &str, sgaux_t aux=0)
Remember an additional mapping from key to string.
Definition: StringPool.cxx:319
SGImplSvc::addAutoSymLinks
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.
Definition: SGImplSvc.cxx:1709
SGImplSvc::m_remap_impl
SG::RemapImpl * m_remap_impl
Definition: SGImplSvc.h:708
SGImplSvc::transientSwap
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...
Definition: SGImplSvc.cxx:1023
SGImplSvc::keys
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.
Definition: SGImplSvc.cxx:518
SGImplSvc::m_remapMutex
mutex_t m_remapMutex
Definition: SGImplSvc.h:728
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
SGImplSvc::loadEventProxies
StatusCode loadEventProxies()
load proxies at begin event
Definition: SGImplSvc.cxx:243
DataProxy.h