Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
StoreGate/src/VarHandleBase.cxx
Go to the documentation of this file.
1 
3 /*
4  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5 */
6 
7 // VarHandleBase.cxx
8 // Implementation file for class VarHandleBase
9 // Author: Paolo Calafiura
10 // Author: S.Binet<binet@cern.ch>
12 
13 #undef DEBUG_VHB /* define to get verbose debug printouts */
14 
16 
17 #include "StoreGate/StoreGateSvc.h"
19 #include "StoreGate/exceptions.h"
20 
23 
24 // fwk includes
25 #include "GaudiKernel/MsgStream.h"
30 #include "GaudiKernel/ThreadLocalContext.h"
31 
32 #include <algorithm>
33 #include <cstdio>
34 #include <format>
35 
36 #ifdef DEBUG_VHB
37 #include <boost/core/demangle.hpp>
38 
39 // Helpers for debug formatting
40 // std::print implementation to be replaced when C++ 23 is available
41 namespace dbg {
42 template <class... Args> void print(std::FILE* stream, std::format_string<Args...> fmt, Args&&... args)
43 {
44  std::fputs(std::format(fmt, std::forward<Args>(args)...), stream);
45 }
46 
47 template <class T> void* ptr(T* p) { return static_cast<void*>(p); }
48 
49 std::string proxy(SG::DataProxy* proxy)
50 {
51  return !proxy ? std::string("PROXY(null)") : std::format("PROXY({}, isValid={}, isConst={})", dbg::ptr(proxy), proxy->isValid(), proxy->isConst());
52 }
53 
54 std::string store(IProxyDict* store)
55 {
56  return !store ? std::string("null_store") : store->name();
57 }
58 }
59 #endif
60 
61 namespace errorcheck {
62 
63 
70  std::string context_name (const SG::VarHandleBase* context)
71  {
72  return std::format("VarHandle({}+{}[{}])", context->storeHandle().name(), context->key(), context->clid());
73  }
74 
75 } // namespace errorcheck
76 
77 
78 namespace SG {
79 
80 
88  : public DataBucketBase
89  {
90  public:
91  SymlinkDataObject (CLID clid, void* obj) : m_clid (clid), m_obj (obj) {}
92  virtual const CLID& clID() const override { return m_clid; }
93  virtual void* object() override { return m_obj; }
94  virtual const std::type_info& tinfo() const override { return typeid(void); }
96  virtual void* cast (CLID, SG::IRegisterTransient*, bool) override { std::abort(); }
97  virtual void* cast (const std::type_info&, SG::IRegisterTransient*, bool) override { std::abort(); }
98  virtual void relinquish() override { std::abort(); }
99  virtual void lock() override { }
100 
101 
102  private:
104  void* m_obj;
105  };
106 
107 
114  IResetable(),
115  m_ptr(0),
116  m_proxy(0),
117  m_store(nullptr),
118  m_storeWasSet(false),
119  m_ownedKey (std::make_unique<VarHandleKey> (clid, "", mode)),
120  m_key (m_ownedKey.get())
121  {
122  m_ownedKey->setOwningHandle (this);
123 #ifdef DEBUG_VHB
124  dbg::print(stderr, "VarHandleBase() {}\n", dbg::ptr(this));
125 #endif
126  }
127 
128 
138  const std::string& sgkey,
140  const std::string& storename,
141  const EventContext* ctx) :
142  IResetable(),
143  m_ptr(NULL),
144  m_proxy(NULL),
145  m_store(nullptr),
146  m_storeWasSet(false),
147  m_ownedKey (std::make_unique<VarHandleKey> (clid, sgkey, mode, storename)),
148  m_key (m_ownedKey.get())
149  {
150  m_ownedKey->setOwningHandle (this);
151 
152  if (ctx && !setStoreFromHandle(ctx)) {
153  throw SG::ExcHandleInitError (clid, sgkey, storename);
154  }
155  }
156 
157 
167  const EventContext* ctx)
168  : IResetable(),
169  m_ptr(nullptr),
170  m_proxy(nullptr),
171  m_store(nullptr),
172  m_storeWasSet(false),
173  m_key (&key)
174  {
175  if (key.storeHandle().get() == nullptr) {
176  throw SG::ExcUninitKey (key.clid(), key.key(),
177  key.storeHandle().name());
178  }
179 
180  if (!setStoreFromHandle(ctx)) {
181  throw SG::ExcHandleInitError (key.clid(), key.key(),
182  key.storeHandle().name());
183  }
184  }
185 
186 
196  : IResetable(),
197  m_ptr (nullptr),
198  m_proxy (nullptr),
199  m_store (proxy->store()),
200  m_storeWasSet (true),
201  m_ownedKey (std::make_unique<VarHandleKey> (proxy->clID(),
202  proxy->name(),
203  mode,
204  m_store ? m_store->name() : "")),
205  m_key (m_ownedKey.get())
206  {
207  m_ownedKey->setOwningHandle (this);
208  setProxy (proxy);
209  }
210 
211 
216  IResetable(),
217  m_ptr(rhs.m_ptr),
218  m_proxy(nullptr),
219  m_store(rhs.m_store),
220  m_storeWasSet(rhs.m_storeWasSet)
221  {
222  if (rhs.m_ownedKey) {
223  m_ownedKey = std::make_unique<VarHandleKey> (*rhs.m_ownedKey);
224  m_ownedKey->setOwningHandle (this);
225  m_key = m_ownedKey.get();
226  }
227  else {
228  m_key = rhs.m_key;
229  }
230 #ifdef DEBUG_VHB
231  dbg::print(stderr, "::VHB::copy constr from {} to {} with proxy={} => {}, key={}, store={}\n", dbg::ptr(&rhs), dbg::ptr(this), dbg::proxy(this->m_proxy), dbg::proxy(rhs.m_proxy), this->key(), dbg::store(this->m_store));
232 #endif
233 
234  setProxy (rhs.m_proxy);
235  }
236 
237 
242  IResetable(),
243  m_ptr(rhs.m_ptr),
244  m_proxy(nullptr),
245  m_store(rhs.m_store),
246  m_storeWasSet(rhs.m_storeWasSet),
247  m_ownedKey (std::move (rhs.m_ownedKey)),
248  m_key (rhs.m_key)
249  {
250  if (m_ownedKey) {
251  m_ownedKey->setOwningHandle (this);
252  }
253  rhs.m_ptr=0;
254 
255  if (rhs.m_proxy) {
256  if (m_ownedKey) {
257  rhs.m_proxy->unbindHandle (&rhs);
258  rhs.m_proxy->bindHandle(this);
259  }
260  m_proxy = rhs.m_proxy;
261  rhs.m_proxy=0; //no release: this has the ref now
262  }
263 #ifdef DEBUG_VHB
264  dbg::print(stderr, "::VHB::move constr from {} to {} with proxy={}, key={}, store={}\n", dbg::ptr(&rhs), dbg::ptr(this), dbg::proxy(this->m_proxy), this->key(), dbg::store(this->m_store));
265 #endif
266  }
267 
268 
272  VarHandleBase&
274  {
275  if (this != &rhs) {
276  if (rhs.m_ownedKey) {
277  m_ownedKey = std::make_unique<VarHandleKey> (*rhs.m_ownedKey);
278  m_ownedKey->setOwningHandle (this);
279  m_key = m_ownedKey.get();
280  }
281  else {
282  m_key = rhs.m_key;
283  m_ownedKey.reset();
284  }
285 
286  m_ptr = rhs.m_ptr;
287  m_store = rhs.m_store;
289  setProxy (rhs.m_proxy);
290  }
291 #ifdef DEBUG_VHB
292  dbg::print(stderr, "::VHB::assignment from {} to {} with proxy={}, key={}, store={}\n", dbg::ptr(&rhs), dbg::ptr(this), dbg::proxy(this->m_proxy), this->key(), dbg::store(this->m_store));
293 #endif
294  return *this;
295  }
296 
297 
301  VarHandleBase&
303  {
304  if (this != &rhs) {
305  m_ownedKey = std::move (rhs.m_ownedKey);
306  if (m_ownedKey) {
307  m_ownedKey->setOwningHandle (this);
308  }
309  m_key = rhs.m_key;
310 
311  m_ptr = rhs.m_ptr;
312  m_store = rhs.m_store;
313  m_storeWasSet = rhs.m_storeWasSet;
314 
315  rhs.m_ptr=0;
316 
317  resetProxy();
318  if (rhs.m_proxy) {
319  if (m_ownedKey) {
320  rhs.m_proxy->unbindHandle (&rhs);
321  rhs.m_proxy->bindHandle (this);
322  }
323  m_proxy = rhs.m_proxy;
324  rhs.m_proxy=0; //no release: this has the ref now
325  }
326  }
327 #ifdef DEBUG_VHB
328  dbg::print(stderr, "::VHB:: move assign from {} to {} with proxy={}, key={}, store={}\n", dbg::ptr(&rhs), dbg::ptr(this), dbg::proxy(this->m_proxy), this->key(), dbg::store(this->m_store));
329 #endif
330  return *this;
331  }
332 
333 
338  {
339 #ifdef DEBUG_VHB
340  dbg::print(stderr, "::VHB:: DESTROY {} with ptr={}, proxy={}, key={}, store={}\n", dbg::ptr(this), dbg::ptr(this->m_ptr), dbg::proxy(this->m_proxy), this->key(), dbg::store(this->m_store));
341 #endif
342 
343  if (m_ownedKey) {
344  resetProxy();
345  }
346  m_ptr = 0;
347  }
348 
349 
350 
351  //*************************************************************************
352  // Accessors
353  //
354 
355 
362  const std::string& VarHandleBase::key() const
363  {
364  return m_key->key();
365  }
366 
367 
373  const std::string& VarHandleBase::name() const
374  {
375  return this->key();
376  }
377 
378 
382  std::string VarHandleBase::store() const
383  {
384  if (m_store)
385  return m_store->name();
386  return this->storeHandle().name();
387  }
388 
389 
390  //*************************************************************************
391  // Validity checking.
392  //
393 
394 
401  {
402  return isPresent_impl (key());
403  }
404 
405 
411  bool
413  {
414 #ifdef DEBUG_VHB
415  dbg::print(stderr, "::VHB::isInitialized({}, proxy={}) const\n", dbg::ptr(this), dbg::proxy(m_proxy));
416 #endif
417  return (0 != m_proxy);
418  }
419 
420 
426  bool VarHandleBase::isSet() const
427  {
428  return isInitialized();
429  }
430 
431 
437  bool
439  {
440 #ifdef DEBUG_VHB
441  dbg::print(stderr, "::VHB::isConst({}, proxy={}) const\n", dbg::ptr(this), dbg::proxy(m_proxy));
442 #endif
443  return 0 != m_proxy
444  ? m_proxy->isConst()
445  : false;
446  }
447 
448 
457  StatusCode
458  VarHandleBase::initialize (bool used /*= true*/)
459  {
460  if (!used) {
461  if (m_ownedKey) {
462  CHECK( m_ownedKey->initialize (used) );
463  }
464  return StatusCode::SUCCESS;
465  }
466 
467  if (!m_store) {
468  if (m_ownedKey) {
469  CHECK( m_ownedKey->initialize() );
470  }
471  m_store = &*(this->storeHandle());
472  m_storeWasSet = false;
473  }
474 
475  if (!m_store) {
476  return StatusCode::FAILURE;
477  }
478 
479  return StatusCode::SUCCESS;
480  }
481 
482 
492  StatusCode
494  {
495  CHECK( initialize() );
496  if (!m_storeWasSet) {
497  IProxyDict* store = storeFromHandle (nullptr);
498  if (store) m_store = store;
499  }
500 
501 #ifdef DEBUG_VHB
502  dbg::print(stderr, "::VHB:: setState() on {} with key={} ({}) and store={} (CLID: {})\n", dbg::ptr(this), this->key(), m_key->hashedKey(), dbg::store(m_store), this->clid());
503 #endif
504 
506  if (!proxy) {
507 #ifdef DEBUG_VHB
508  dbg::print(stderr, "::VHB:: setState() on {} ==> null proxy!\n", dbg::ptr(this));
509 #endif
510  proxy = m_store->proxy(this->clid(), this->key());
511  }
512 
513  if (!proxy) {
514 #ifdef DEBUG_VHB
515  dbg::print(stderr, "::VHB:: setState() on {} ==> STILL null proxy!\n", dbg::ptr(this));
516 #endif
517  }
518  else if (!proxy->isValid()) {
519 #ifdef DEBUG_VHB
520  dbg::print(stderr, "::VHB:: setState() on {} ==> proxy not valid! Dumping Store\n", dbg::ptr(this));
521  if (!m_store) {
522  dbg::print(stderr, "::VHB:: setState() on {} ==> m_store is a nullptr\n", dbg::ptr(this));
523  }
524  else {
525  SGImplSvc* stor = dynamic_cast<SGImplSvc*>(m_store);
526  if (!stor) {
527  dbg::print(stderr, "::VHB:: setState() on {} ==> m_store points not to an SGImplSvc but to a {}\n", dbg::ptr(this), boost::core::demangle(typeid(*m_store).name()));
528  }
529  else {
530  dbg::print(stderr, "\n{}\n", stor->dump());
531  }
532  }
533 #endif
534  }
535  StatusCode sc = this->setState(proxy);
536 
537  // Failure to find the proxy is ok in the case of a @c WriteHandle
538  // that has not yet been written to.
539  if (sc.isFailure() && mode() == Gaudi::DataHandle::Writer && m_ptr == nullptr)
540  return StatusCode::SUCCESS;
541 
542  return sc;
543  }
544 
545 
546  //*************************************************************************
547  // State setting.
548  //
549 
550 
558  {
559  reset(true);
560  m_store = store;
561  m_storeWasSet = true;
562  return StatusCode::SUCCESS;
563  }
564 
565 
575  void
576  VarHandleBase::reset (bool hard) {
577 #ifdef DEBUG_VHB
578  dbg::print(stderr, "::VHB::reset {} with proxy={}, key={}, store={} (hard={})\n", dbg::ptr(this), dbg::proxy(m_proxy), this->key(), dbg::store(this->m_store), hard);
579 #endif
580  m_ptr = 0;
581 
582  if (hard) {
583  m_store = 0;
584  m_storeWasSet = false;
585  }
586 
587  //if the proxy is not resetOnly then release it as it will become invalid
588  // Also release on a hard reset.
589  if (0 != m_proxy && (!m_proxy->isResetOnly() || hard)) {
590  resetProxy();
591  }
592  }
593 
594 
602 #ifdef DEBUG_VHB
603  dbg::print(stderr, "::VHB::finalReset {} with proxy={}, key={}, store={}\n", dbg::ptr(this), dbg::proxy(m_proxy), this->key(), dbg::store(this->m_store));
604 #endif
605  reset (true);
606  }
607 
608 
613  {
614  if (typeless_dataPointer()) {
615  m_proxy->setConst();
616  return StatusCode::SUCCESS;
617  }
618  return StatusCode::FAILURE;
619  }
620 
621 
630  {
631  if (!m_ownedKey) {
633  m_key->storeHandle().name());
634  }
635  return *m_ownedKey;
636  }
637 
638 
649  {
650  return vhKey().assign (sgkey);
651  }
652 
653 
654  //*************************************************************************
655  // Protected methods.
656  //
657 
658 
665  StatusCode
667  {
668 #ifdef DEBUG_VHB
669  dbg::print(stderr, "::VHB::setState({}, proxy={}) const\n", dbg::ptr(this), dbg::proxy(proxy));
670 #endif
671  if (0 == proxy || !proxy->isValid()) {
672  return StatusCode::FAILURE;
673  }
674 
675  if (m_proxy != proxy) {
676  // We're changing proxies. Release the old and bind to the new.
677  setProxy (proxy);
678  // Clear cached pointer.
679  m_ptr=0;
680  }
681 
682  return StatusCode::SUCCESS;
683  }
684 
685 
691  StatusCode
693  {
694  if (0 == store) {
695  return StatusCode::FAILURE;
696  }
697 #ifdef DEBUG_VHB
698  dbg::print(stderr, "::VHB::setState({}, store={}, key={}) const\n", dbg::ptr(this), dbg::store(store), key);
699 #endif
700  CLID cid = this->clid();
701  SG::DataProxy* proxy = store->proxy(cid, key);
702  // std::cerr << "::VHB:: -- clid=[" << cid << "] proxy=[" << proxy << "]\n";
703  return this->setState(proxy);
704  }
705 
706 
718  StatusCode
719  VarHandleBase::record_impl (std::unique_ptr<DataObject> dobj,
720  void* dataPtr,
721  bool allowMods,
722  bool returnExisting)
723  {
724  if (!m_store) {
725  if (m_ownedKey) {
726  CHECK (m_ownedKey->initialize());
727  }
728  m_store = &*(this->storeHandle());
729  m_storeWasSet = false;
730  }
731 
732  if (this->name().empty()) {
733  REPORT_ERROR (StatusCode::FAILURE) << "Attempt to record an object with a null key";
734  return StatusCode::FAILURE;
735  }
736 
737  SG::DataObjectSharedPtr<DataObject> sptr (dobj.release());
738  unsigned int initRefCount = sptr->refCount();
739  SG::DataProxy* new_proxy =
740  m_store->recordObject (sptr, this->name(), allowMods, returnExisting);
741  if (!new_proxy) {
742  REPORT_ERROR (StatusCode::FAILURE) << "recordObject failed";
743  resetProxy();
744  return StatusCode::FAILURE;
745  }
746  if (m_proxy != new_proxy) {
747  CHECK (this->setState (new_proxy));
748  }
749 
750  if (new_proxy && initRefCount == sptr->refCount() && new_proxy->isValid()) {
751  // If the reference count hasn't changed, then we've returned an existing
752  // object rather than recording a new one. Retrieve the pointer, making
753  // sure that it isn't const.
754  if (m_proxy->isConst()) {
755  REPORT_ERROR (StatusCode::FAILURE)
756  << "Found an existing const object from recordOrRetrieve.";
757  return StatusCode::FAILURE;
758  }
760  if (!allowMods)
761  CHECK( setConst() );
762  }
763  else
764  m_ptr=(void*)dataPtr;
765 
766  return StatusCode::SUCCESS;
767  }
768 
769 
787  const void*
788  VarHandleBase::put_impl (const EventContext* ctx,
789  std::unique_ptr<DataObject> dobj,
790  const void* dataPtr,
791  bool allowMods,
792  bool returnExisting,
793  IProxyDict* & store) const
794  {
795  if (this->name().empty()) {
796  REPORT_ERROR (StatusCode::FAILURE) << "Attempt to record an object with a null key";
797  return nullptr;
798  }
799 
800  store = storeFromHandle (ctx);
801  if (!store) {
802  REPORT_ERROR (StatusCode::FAILURE) << "No store.";
803  return nullptr;
804  }
805 
806  SG::DataObjectSharedPtr<DataObject> sptr (std::move (dobj));
807  unsigned int initRefCount = sptr->refCount();
808  SG::DataProxy* new_proxy =
809  store->recordObject (sptr, this->name(), allowMods, returnExisting);
810  if (!new_proxy) {
811  REPORT_ERROR (StatusCode::FAILURE) << "recordObject failed";
812  return nullptr;
813  }
814 
815  if (new_proxy && initRefCount == sptr->refCount() && new_proxy->isValid()) {
816  // If the reference count hasn't changed, then we've returned an existing
817  // object rather than recording a new one. Retrieve the pointer.
818  dataPtr = typeless_dataPointer_fromProxy (new_proxy, true);
819  }
820 
821  return dataPtr;
822  }
823 
824 
829  void*
831  {
832 #ifdef DEBUG_VHB
833  dbg::print(stderr, "::VHB::typeless_dataPointer_impl({}, ptr={}, proxy={}, key={}, store={})\n", dbg::ptr(this), dbg::ptr(this->m_ptr), dbg::proxy(this->m_proxy), this->key(), dbg::store(this->m_store));
834 #endif
835 
836  // First check for cached pointer.
837  if (0 != m_ptr)
838  return m_ptr;
839 
840  if (0 == m_proxy) {
841  // No proxy, need to look it up.
842  if (this->setState().isFailure() || !m_proxy) {
843  if (!quiet) {
844  REPORT_MESSAGE(MSG::WARNING)
845  << "could not get proxy for key " << key();
846  if (this->mode() != Gaudi::DataHandle::Reader) {
847  REPORT_MESSAGE(MSG::WARNING)<< " try using a ReadHandle";
848  }
849  } //quiet
850  return 0;
851  } //setstate
852  } //m_proxy
853 
855  return m_ptr;
856  }
857 
858 
865  void* VarHandleBase::typeless_ptr(bool quiet/*=defaultQuiet*/)
866  {
867  void* p = typeless_dataPointer(quiet);
868  if (p != nullptr && isConst())
869  throw SG::ExcConstObject (clid(), key(), store());
870  return p;
871  }
872 
873 
874  /*
875  * @brief Retrieve an object from SG as a const pointer without caching.
876  * @param ctx The event context, or nullptr to use the current context.
877  * @param quiet If true, suppress failure messages.
878  *
879  * Like typeless_dataPointer_impl, except that we don't change
880  * any members of the handle.
881  */
882  const void* VarHandleBase::get_impl (const EventContext* ctx,
883  bool quiet/*= defaultQuiet*/) const
884  {
885  if (this->mode() != Gaudi::DataHandle::Reader) {
886  if (!quiet)
887  REPORT_ERROR (StatusCode::FAILURE)
888  << "get_impl called for a non-read handle.";
889  return nullptr;
890  }
891 
892  if (this->key().empty()) {
893  if (!quiet)
894  REPORT_ERROR (StatusCode::FAILURE)
895  << "Cannot initialize a Read/Write/Update handle with a null key.";
896  return nullptr;
897  }
898 
900  if (!store) {
901  if (!quiet)
902  REPORT_ERROR (StatusCode::FAILURE) << "No store.";
903  return nullptr;
904  }
905 
906  SG::DataProxy* proxy = store->proxy_exact(m_key->hashedKey());
907  if (!proxy) {
908  proxy = store->proxy(this->clid(), this->key());
909  if (!proxy) {
910  if (!quiet)
911  REPORT_ERROR (StatusCode::FAILURE)
912  << "Cannot find proxy for "
913  << this->clid() << "/" << this->key();
914  return nullptr;
915  }
916  }
917 
918  return typeless_dataPointer_fromProxy (proxy, quiet);
919  }
920 
921 
933  const std::string& newKey)
934  {
935  if (!m_ptr || !m_store) {
936  REPORT_ERROR (StatusCode::FAILURE) << "symlink: Handle not valid.";
937  return StatusCode::FAILURE;
938  }
939 
941  SG::DataProxy* prox = m_store->recordObject (obj, newKey, false, true);
942  if (!prox)
943  return StatusCode::FAILURE;
944  return StatusCode::SUCCESS;
945  }
946 
947 
963  IProxyDict* VarHandleBase::storeFromHandle (const EventContext* ctx) const
964  {
965  if (m_key->isEventStore()) {
966  if (ctx)
967  return Atlas::getExtendedEventContext(*ctx).proxy();
968  if (m_storeWasSet && m_store) return m_store;
969 
970  if ( Atlas::hasExtendedEventContext (Gaudi::Hive::currentContext()) ) {
971  return Atlas::getExtendedEventContext (Gaudi::Hive::currentContext()).proxy();
972  } else {
973  return nullptr;
974  }
975  }
976 
977  if (m_storeWasSet && m_store) return m_store;
979  if (!store)
980  store = &*this->storeHandle();
981 
982  return store->hiveProxyDict();
983  }
984 
985 
993  bool VarHandleBase::setStoreFromHandle (const EventContext* ctx)
994  {
995  if (m_ownedKey) {
996  if (m_ownedKey->initialize().isFailure()) {
997  return false;
998  }
999  }
1000  m_store = storeFromHandle (ctx);
1001  m_storeWasSet = (ctx && m_store ==
1002  Atlas::getExtendedEventContext(*ctx).proxy());
1003  return true;
1004  }
1005 
1006 
1011  {
1012  if (m_proxy) {
1013  if (m_ownedKey) {
1014  m_proxy->unbindHandle(this);
1015  m_proxy->release();
1016  }
1017  m_proxy = nullptr;
1018  }
1019  }
1020 
1021 
1027  {
1028  resetProxy();
1029  if (proxy) {
1030  if (m_ownedKey) {
1031  proxy->addRef();
1032  proxy->bindHandle (this);
1033  }
1034  m_proxy = proxy;
1035  }
1036  }
1037 
1038 
1046  void*
1048  bool quiet) const
1049  {
1050  if (!proxy || !proxy->isValid()) {
1051  // invalid proxy
1052  if (!quiet) {
1053  REPORT_MESSAGE(MSG::WARNING)
1054  << "Proxy "
1055  << " [" << (proxy != 0 ? proxy->clID() : 0)
1056  << "/" << (proxy != 0
1057  ? proxy->name()
1058  : std::string("<N/A>"))
1059  << "] is in an invalid state";
1060  } //quiet
1061  return nullptr;
1062  }
1063 
1064  DataObject* dobj = proxy->accessData();
1065  if (!dobj) {
1066  // invalid dobj
1067  if (!quiet) {
1068  REPORT_MESSAGE(MSG::WARNING)
1069  << "this proxy " << MSG::hex << proxy
1070  << MSG::dec << " has a NULL data object ptr";
1071  }
1072  return nullptr;
1073  }
1074 
1075  const CLID clid = this->clid();
1076  void* ptr = SG::Storable_cast(dobj, clid, nullptr, true, proxy);
1077  if (ptr)
1078  return ptr;
1079 
1080  // If ptr is null, probably the clid we gave wasn't the clid
1081  // the object was stored with, nor it inherits from it.
1082  // before giving up, let's check its transient CLIDs
1083  DataBucketBase *dbb = 0;
1084  if (proxy->transientID(clid) &&
1085  0 != (dbb = dynamic_cast<DataBucketBase*>(dobj))) {
1086  // it is a symlink after all.
1087  // Let's hard cast (and keep our fingers Xed)
1088  ptr = static_cast<void*>(dbb->object());
1089  } else {
1090  if (!quiet) {
1091  REPORT_MESSAGE(MSG::WARNING)
1092  << "Request for an invalid object; requested CLID = "
1093  << clid
1094  << ", proxy primary ID is " << proxy->clID();
1095  }
1096  } // try symlink -- endif
1097  return ptr;
1098  }
1099 
1100 
1107  bool VarHandleBase::isPresent_impl (const std::string& key) const
1108  {
1109  const DataProxy* proxy = m_proxy;
1110  if (!proxy) {
1111  const IProxyDict* store = m_store;
1112  if (!store)
1113  store = this->storeHandle().get();
1114  if (store)
1115  proxy = store->proxy(this->clid(), key);
1116  }
1117  if (proxy) {
1118  return proxy->isValid();
1119  }
1120  return false;
1121  }
1122 
1123 
1124 //*************************************************************************
1125  // Free functions.
1126  //
1127 
1128 
1134  std::ostream& operator<<( std::ostream& out, const VarHandleBase& o )
1135  {
1136  out << "VarHandleBase @" << &o
1137  << " store=" <<o.store()
1138  << ", clid=" <<o.clid()
1139  << ", key=" <<o.key()
1140  << "----------- ptr@" << o.m_ptr
1141  << ", proxy@" << o.m_proxy ;
1142  if (o.m_proxy)
1143  out << ", DataObject@" << o.m_proxy->object();
1144  return out;
1145  }
1146 
1147 
1151  bool operator==(const VarHandleBase& l, const VarHandleBase& r)
1152  {
1153  return (l.clid() == r.clid() &&
1154  l.mode() == r.mode() &&
1155  l.name() == r.name() &&
1156  l.store() == r.store());
1157  }
1158 
1159 
1163  bool operator!=(const VarHandleBase& l, const VarHandleBase& r)
1164  {
1165  return !(l==r);
1166  }
1167 
1168 
1169 } /* namespace SG */
VarHandleBase.h
Base class for VarHandle classes.
SG::operator!=
bool operator!=(const VarHandleBase &l, const VarHandleBase &r)
Inequality comparison.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx:129
SG::IRegisterTransient
Interface for registering a transient object in t2p map.
Definition: IRegisterTransient.h:28
used
SGTest::store
TestStore store
Definition: TestStore.cxx:23
beamspotman.r
def r
Definition: beamspotman.py:676
common.sgkey
def sgkey(tool)
Definition: common.py:1028
SG::VarHandleBase::VarHandleBase
VarHandleBase(CLID clid, Gaudi::DataHandle::Mode mode)
Constructor with default key.
Definition: StoreGate/src/VarHandleBase.cxx:113
REPORT_ERROR
#define REPORT_ERROR(SC)
Report an error.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:355
IProxyDict::proxy
virtual SG::DataProxy * proxy(const CLID &id, const std::string &key) const =0
Get proxy with given id and key.
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:395
IHiveStore.h
SG
Forward declaration.
Definition: CaloCellPacker_400_500.h:32
SG::DataProxy::isConst
bool isConst() const
Check if it is a const object.
SG::VarHandleBase::storeFromHandle
IProxyDict * storeFromHandle(const EventContext *ctx) const
Return the store instance to use.
Definition: StoreGate/src/VarHandleBase.cxx:963
vtune_athena.format
format
Definition: vtune_athena.py:14
SG::VarHandleBase::m_ownedKey
std::unique_ptr< VarHandleKey > m_ownedKey
An owned VarHandleKey.
Definition: StoreGate/StoreGate/VarHandleBase.h:520
getMessageSvc.h
singleton-like access to IMessageSvc via open function and helper
SG::VarHandleBase::finalReset
virtual void finalReset() override final
Reset this handle at the end of processing.
Definition: StoreGate/src/VarHandleBase.cxx:601
SG::VarHandleBase::typeless_dataPointer
void * typeless_dataPointer(bool quiet=defaultQuiet)
Retrieve an object from StoreGate.
SG::SymlinkDataObject::tinfo
virtual const std::type_info & tinfo() const override
Return the type_info for the stored object.
Definition: StoreGate/src/VarHandleBase.cxx:94
python.CaloAddPedShiftConfig.args
args
Definition: CaloAddPedShiftConfig.py:45
DataBucketBase
A non-templated base class for DataBucket, allows to access the transient object address as a void*.
Definition: DataBucketBase.h:24
DataBucketBase.h
StorableConversions.h
convert to and from a SG storable
make_unique
std::unique_ptr< T > make_unique(Args &&... args)
Definition: SkimmingToolEXOT5.cxx:23
quiet
bool quiet
Definition: TrigGlobEffCorrValidation.cxx:190
SG::VarHandleKey::storeHandle
const ServiceHandle< IProxyDict > & storeHandle() const
Return handle to the referenced store.
SG::VarHandleBase::name
const std::string & name() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx:75
SG::VarHandleBase::assign
StatusCode assign(const std::string &sgkey)
Update the underlying key from a string.
Definition: StoreGate/src/VarHandleBase.cxx:648
SG::VarHandleBase::setState
StatusCode setState()
Retrieve and cache all information managed by a handle.
Definition: StoreGate/src/VarHandleBase.cxx:493
SG::VarHandleBase
Base class for VarHandle types.
Definition: StoreGate/StoreGate/VarHandleBase.h:83
ExtendedEventContext.h
DataBucketBase::object
virtual void * object()=0
SG::VarHandleBase::clid
CLID clid() const
Return the class ID for the referenced object.
SG::VarHandleBase::typeless_dataPointer_impl
void * typeless_dataPointer_impl(bool quiet)
Retrieve an object from StoreGate.
Definition: StoreGate/src/VarHandleBase.cxx:830
Atlas::hasExtendedEventContext
bool hasExtendedEventContext(const EventContext &ctx)
Test whether a context object has an extended context installed.
Definition: ExtendedEventContext.cxx:23
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
SG::operator==
bool operator==(const VarHandleBase &l, const VarHandleBase &r)
Equality comparison.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx:119
SG::VarHandleBase::operator=
VarHandleBase & operator=(const VarHandleBase &rhs)
Assignment operator.
Definition: StoreGate/src/VarHandleBase.cxx:273
get_generator_info.stderr
stderr
Definition: get_generator_info.py:40
SG::SymlinkDataObject::cast
virtual void * cast(CLID, SG::IRegisterTransient *, bool) override
Return the contents of the DataBucket, converted to type given by clid.
Definition: StoreGate/src/VarHandleBase.cxx:96
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
SG::DataProxy::isValid
bool isValid() const
called by destructor
errorcheck::context_name
std::string context_name(const INamedInterface *context)
Return the context name from a context (this) pointer.
Definition: errorcheck.cxx:230
isValid
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition: AtlasPID.h:812
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
dbg::ptr
void * ptr(T *p)
Definition: SGImplSvc.cxx:74
DataBucketBase::cast
T * cast(SG::IRegisterTransient *irt=0, bool isConst=true)
Return the contents of the DataBucket, converted to type T.
Args
Definition: test_lwtnn_fastgraph.cxx:12
IProxyDict
A proxy dictionary.
Definition: AthenaKernel/AthenaKernel/IProxyDict.h:47
SG::VarHandleBase::setConst
StatusCode setConst()
Set the 'const' bit for the bound proxy in the store.
Definition: StoreGate/src/VarHandleBase.cxx:612
AthenaPoolTestWrite.stream
string stream
Definition: AthenaPoolTestWrite.py:12
SG::DataProxy::unbindHandle
void unbindHandle(IResetable *ir)
Definition: DataProxy.cxx:293
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
SG::SymlinkDataObject::SymlinkDataObject
SymlinkDataObject(CLID clid, void *obj)
Definition: StoreGate/src/VarHandleBase.cxx:91
Atlas::getExtendedEventContext
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
Definition: ExtendedEventContext.cxx:32
errorcheck
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:138
IProxyDict::proxy_exact
virtual SG::DataProxy * proxy_exact(SG::sgkey_t sgkey) const =0
Get proxy given a hashed key+clid.
IResetable
a resetable object (e.g. a SG DataHandle)
Definition: IResetable.h:15
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
SG::SymlinkDataObject::clID
virtual const CLID & clID() const override
Definition: StoreGate/src/VarHandleBase.cxx:92
SG::VarHandleBase::setProxyDict
virtual StatusCode setProxyDict(IProxyDict *store)
Explicitly set the event store.
Definition: StoreGate/src/VarHandleBase.cxx:557
SG::SymlinkDataObject::lock
virtual void lock() override
If the held object derives from ILockable, call lock() on it.
Definition: StoreGate/src/VarHandleBase.cxx:99
SG::VarHandleBase::resetProxy
void resetProxy()
Clear the m_proxy field and release the old proxy.
Definition: StoreGate/src/VarHandleBase.cxx:1010
exceptions.h
Exceptions that can be thrown from StoreGate.
SG::get
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
Definition: ReadCondHandle.h:287
SG::VarHandleKey::assign
virtual StatusCode assign(const std::string &sgkey)
Change the key of the object to which we're referring.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:88
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::VarHandleBase::m_key
const VarHandleKey * m_key
The associated key object.
Definition: StoreGate/StoreGate/VarHandleBase.h:525
SGImplSvc.h
SG::VarHandleBase::store
std::string store() const
Return the name of the store holding the object we are proxying.
Definition: StoreGate/src/VarHandleBase.cxx:382
LHEF::Reader
Pythia8::Reader Reader
Definition: Prophecy4fMerger.cxx:11
SG::SymlinkDataObject::cast
virtual void * cast(const std::type_info &, SG::IRegisterTransient *, bool) override
Return the contents of the DataBucket, converted to type given by std::type_info.
Definition: StoreGate/src/VarHandleBase.cxx:97
SG::VarHandleKey::isEventStore
bool isEventStore() const
Does this key reference the primary event store?
Preparation.mode
mode
Definition: Preparation.py:107
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
SG::VarHandleBase::m_proxy
SG::DataProxy * m_proxy
Proxy holding the object to which we are bound.
Definition: StoreGate/StoreGate/VarHandleBase.h:507
SG::ExcConstObject
Exception — Tried to retrieve non-const pointer to const object.
Definition: Control/StoreGate/StoreGate/exceptions.h:134
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
SG::VarHandleBase::isInitialized
bool isInitialized() const
Has a proxy been retrieved from SG?
Definition: StoreGate/src/VarHandleBase.cxx:412
SG::DataProxy::release
virtual unsigned long release() override final
release reference to object
Definition: DataProxy.cxx:320
SGImplSvc::dump
std::string dump() const
dump objects in store.
Definition: SGImplSvc.cxx:557
dbg
Definition: SGImplSvc.cxx:69
SG::SymlinkDataObject
Helper for symLink_impl.
Definition: StoreGate/src/VarHandleBase.cxx:89
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
SG::VarHandleBase::mode
Gaudi::DataHandle::Mode mode() const
Return the mode (read/write/update) for this handle.
errorcheck.h
Helpers for checking error return status codes and reporting errors.
EventContainers::Mode
Mode
Definition: IdentifiableContainerBase.h:13
SG::SymlinkDataObject::object
virtual void * object() override
Definition: StoreGate/src/VarHandleBase.cxx:93
SG::VarHandleBase::isPresent_impl
bool isPresent_impl(const std::string &key) const
Is the referenced object present in SG?
Definition: StoreGate/src/VarHandleBase.cxx:1107
SG::VarHandleBase::reset
virtual void reset(bool hard) override
Reset this handle.
Definition: StoreGate/src/VarHandleBase.cxx:576
SG::VarHandleBase::typeless_dataPointer_fromProxy
void * typeless_dataPointer_fromProxy(SG::DataProxy *proxy, bool quiet) const
Retrieve a pointer from a proxy.
Definition: StoreGate/src/VarHandleBase.cxx:1047
SG::VarHandleKey::clid
CLID clid() const
Return the class ID for the referenced object.
Definition: StoreGate/src/VarHandleKey.cxx:185
SG::VarHandleBase::key
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx:64
SG::VarHandleKey
A property holding a SG store/key/clid from which a VarHandle is made.
Definition: StoreGate/StoreGate/VarHandleKey.h:62
SG::VarHandleBase::~VarHandleBase
virtual ~VarHandleBase() override
Destructor.
Definition: StoreGate/src/VarHandleBase.cxx:337
REPORT_MESSAGE
#define REPORT_MESSAGE(LVL)
Report a message.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:365
SG::throwExcNonConstHandleKey
void throwExcNonConstHandleKey(CLID clid, const std::string &sgkey, const std::string &storename)
Throw a SG::ExcNonConstHandleKey exception.
Definition: Control/StoreGate/src/exceptions.cxx:337
SG::VarHandleBase::storeHandle
const ServiceHandle< IProxyDict > & storeHandle() const
Return handle to the referenced store.
SG::VarHandleBase::setStoreFromHandle
bool setStoreFromHandle(const EventContext *ctx)
Initialize the store pointer from the store handle.
Definition: StoreGate/src/VarHandleBase.cxx:993
fmt
SG::Storable_cast
T * Storable_cast(DataObject *pDObj, bool quiet=true, IRegisterTransient *irt=0, bool isConst=true)
Definition: StorableConversions.h:37
SG::ExcUninitKey
Exception — Tried to create a handle from an uninitialized key.
Definition: Control/StoreGate/StoreGate/exceptions.h:111
SG::VarHandleBase::typeless_ptr
void * typeless_ptr(bool quiet=defaultQuiet)
Retrieve an object from StoreGate as non-const pointer.
Definition: StoreGate/src/VarHandleBase.cxx:865
SG::DataProxy::setConst
void setConst()
Mark this object as const.
Definition: DataProxy.cxx:204
SG::VarHandleKey::hashedKey
SG::sgkey_t hashedKey() const
Return the hashed StoreGate key.
SG::VarHandleBase::initialize
StatusCode initialize(bool used=true)
Verify that the handle has been configured properly.
Definition: StoreGate/src/VarHandleBase.cxx:458
SG::ExcHandleInitError
Exception — Error initializing VarHandle from VarHandleKey.
Definition: Control/StoreGate/StoreGate/exceptions.h:92
SG::VarHandleBase::vhKey
SG::VarHandleKey & vhKey()
Return a non-const reference to the HandleKey.
Definition: StoreGate/src/VarHandleBase.cxx:629
SG::VarHandleBase::m_storeWasSet
bool m_storeWasSet
True if the store was set explicitly via setProxyDict.
Definition: StoreGate/StoreGate/VarHandleBase.h:513
SG::VarHandleBase::m_ptr
void * m_ptr
The object to which we are bound.
Definition: StoreGate/StoreGate/VarHandleBase.h:504
IProxyDict::recordObject
virtual SG::DataProxy * recordObject(SG::DataObjectSharedPtr< DataObject > obj, const std::string &key, bool allowMods, bool returnExisting)=0
Record an object in the store.
SG::VarHandleBase::isPresent
bool isPresent() const
Is the referenced object present in SG?
Definition: StoreGate/src/VarHandleBase.cxx:400
SG::DataProxy::isResetOnly
bool isResetOnly() const
Check reset only:
dbg::print
void print(std::FILE *stream, std::format_string< Args... > fmt, Args &&... args)
Definition: SGImplSvc.cxx:70
SG::VarHandleBase::isConst
bool isConst() const
True if this handle has a proxy, and the proxy is const.
Definition: StoreGate/src/VarHandleBase.cxx:438
LHEF::Writer
Pythia8::Writer Writer
Definition: Prophecy4fMerger.cxx:12
SG::DataObjectSharedPtr
Smart pointer to manage DataObject reference counts.
Definition: DataObjectSharedPtr.h:45
SG::VarHandleBase::put_impl
const void * put_impl(const EventContext *ctx, std::unique_ptr< DataObject > dobj, const void *dataPtr, bool allowMods, bool returnExisting, IProxyDict *&store) const
Helper to record an object in the event store.
Definition: StoreGate/src/VarHandleBase.cxx:788
SG::SymlinkDataObject::m_obj
void * m_obj
Definition: StoreGate/src/VarHandleBase.cxx:104
python.PyAthena.obj
obj
Definition: PyAthena.py:132
SG::VarHandleBase::m_store
IProxyDict * m_store
Pointer to the store that owns the object.
Definition: StoreGate/StoreGate/VarHandleBase.h:510
SG::DataProxy
Definition: DataProxy.h:45
SG::SymlinkDataObject::relinquish
virtual void relinquish() override
Give up ownership of the DataBucket contents.
Definition: StoreGate/src/VarHandleBase.cxx:98
SG::VarHandleBase::isSet
virtual bool isSet() const override final
Has a proxy been retrieved from SG?
Definition: StoreGate/src/VarHandleBase.cxx:426
StoreGateSvc.h
SG::VarHandleBase::record_impl
StatusCode record_impl(std::unique_ptr< DataObject > dobj, void *dataPtr, bool allowMods, bool returnExisting)
Helper to record an object in the event store.
Definition: StoreGate/src/VarHandleBase.cxx:719
IProxyDict::hiveProxyDict
virtual IProxyDict * hiveProxyDict() override
Return the current event-slot-specific store.
Definition: IProxyDict.cxx:83
SG::operator<<
std::ostream & operator<<(std::ostream &os, const ArenaAllocatorBase::Stats::Stat &stat)
Format a statistic structure.
Definition: ArenaAllocatorBase.cxx:61
SG::VarHandleBase::symLink_impl
StatusCode symLink_impl(CLID newClid, const std::string &newKey)
Make a symlink or alias to the object currently referenced by this handle.
Definition: StoreGate/src/VarHandleBase.cxx:932
SG::VarHandleBase::get_impl
const void * get_impl(const EventContext *ctx, bool quiet=defaultQuiet) const
Definition: StoreGate/src/VarHandleBase.cxx:882
SG::SymlinkDataObject::m_clid
CLID m_clid
Definition: StoreGate/src/VarHandleBase.cxx:103
SG::VarHandleBase::setProxy
void setProxy(SG::DataProxy *proxy)
Set a new proxy.
Definition: StoreGate/src/VarHandleBase.cxx:1026
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37