ATLAS Offline Software
Public Types | Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Private Types | Private Attributes | Static Private Attributes | List of all members
CondContMixedBase Class Referenceabstract

Base class for conditions containers for which keys are ranges in both Run+LBN and timestamp. More...

#include <CondCont.h>

Inheritance diagram for CondContMixedBase:
Collaboration diagram for CondContMixedBase:

Public Types

enum  KeyType { KeyType::SINGLE, KeyType::TIMESTAMP, KeyType::RUNLBN, KeyType::MIXED }
 Type of key used for this container. More...
 
typedef void Payload
 Payload type held by this class. More...
 
typedef uint64_t key_type
 Type used to store an IOV time internally. More...
 

Public Member Functions

virtual void list (std::ostream &ost) const override final
 Dump the container contents for debugging. More...
 
virtual size_t entries () const override final
 Return the number of conditions objects in the container. More...
 
virtual std::vector< EventIDRange > ranges () const override final
 Return all IOV validity ranges defined in this container. More...
 
virtual StatusCode typelessInsert (const EventIDRange &r, void *obj, const EventContext &ctx=Gaudi::Hive::currentContext()) override final
 Insert a new conditions object. More...
 
virtual bool valid (const EventIDBase &t) const override final
 Test to see if a given IOV time is mapped in the container. More...
 
virtual bool range (const EventIDBase &t, EventIDRange &r) const override final
 Return the mapped validity range for an IOV time. More...
 
virtual StatusCode erase (const EventIDBase &t, const EventContext &ctx=Gaudi::Hive::currentContext()) override final
 Erase the first element not less than t. More...
 
virtual StatusCode extendLastRange (const EventIDRange &newRange, const EventContext &ctx=Gaudi::Hive::currentContext()) override final
 Extend the range of the last IOV. More...
 
CLID clid () const
 Return the CLID of the most-derived CondCont. More...
 
KeyType keyType () const
 Return the key type for this container. More...
 
const DataObjID & id () const
 Return CLID/key corresponding to this container. More...
 
SG::DataProxyproxy ()
 Return the associated DataProxy, if any. More...
 
const SG::DataProxyproxy () const
 Return the associated DataProxy, if any. More...
 
void setProxy (SG::DataProxy *)
 Set the associated DataProxy. More...
 
void print () const
 Dump the container to cout. More...
 
virtual size_t trim (const std::vector< key_type > &runLbnKeys, const std::vector< key_type > &TSKeys)
 Remove unused entries from the front of the list. More...
 
void clear ()
 Remove all entries in the container. More...
 
void quiescent (const EventContext &ctx=Gaudi::Hive::currentContext())
 Mark that this thread is no longer accessing data from this container. More...
 
size_t nInserts () const
 Return the number times an item was inserted into the map. More...
 
size_t maxSize () const
 Return the maximum size of the map. More...
 
void addDep (CondContBase *dep)
 Declare another conditions container that depends on this one. More...
 
std::vector< CondContBase * > getDeps ()
 Return the list of conditions containers that depend on this one. More...
 

Static Public Member Functions

static key_type keyFromRunLBN (const EventIDBase &b)
 Make a run+lbn key from an EventIDBase. More...
 
static key_type keyFromTimestamp (const EventIDBase &b)
 Make a timestamp key from an EventIDBase. More...
 
static void setCleanerSvcName ATLAS_NOT_THREAD_SAFE (const std::string &name)
 Allow overriding the name of the global conditions cleaner service (for testing purposes). More...
 

Protected Types

typedef CxxUtils::ConcurrentRangeMap< RangeKey, key_type, void, Compare, Athena::RCUUpdaterCondContSet
 
typedef CondContSet::Updater_t Updater_t
 
typedef CondContSet::delete_function delete_function
 

Protected Member Functions

 CondContMixedBase (Athena::IRCUSvc &rcusvc, CLID clid, const DataObjID &id, SG::DataProxy *proxy, std::shared_ptr< CondContSet::IPayloadDeleter > payloadDeleter, size_t capacity)
 Internal constructor. More...
 
StatusCode insertMixed (const EventIDRange &r, CondContBase::CondContSet::payload_unique_ptr t, const EventContext &ctx=Gaudi::Hive::currentContext())
 Insert a new conditions object. More...
 
const void * findMixed (const EventIDBase &t, EventIDRange const **r) const
 Internal lookup function. More...
 
delete_functionpayloadDelfcn () const
 Return the payload deletion function for this container. More...
 
StatusCode insertBase (const EventIDRange &r, CondContSet::payload_unique_ptr t, const EventContext &ctx=Gaudi::Hive::currentContext())
 Insert a new conditions object. More...
 
StatusCode eraseBase (const EventIDBase &t, const EventContext &ctx=Gaudi::Hive::currentContext())
 Erase the first element not less than t. More...
 
StatusCode extendLastRangeBase (const EventIDRange &newRange, const EventContext &ctx=Gaudi::Hive::currentContext())
 Extend the range of the last IOV. More...
 
const void * findBase (const EventIDBase &t, EventIDRange const **r) const
 Internal lookup function. More...
 
const void * cast (CLID clid, const void *ptr) const
 Do pointer conversion for the payload type. More...
 
virtual const void * doCast (CLID clid, const void *ptr) const =0
 Do pointer conversion for the payload type. More...
 
template<class FUNC >
void forEach (const FUNC &func) const
 Call func on each entry in the container. More...
 
StatusCode inserted (const EventContext &ctx)
 Tell the cleaner that a new object was added to the container. More...
 
void insertError (CLID usedCLID) const
 Helper to report an error due to using a base class for insertion. More...
 
delete_functiondelfcn () const
 Return the deletion function for this container. More...
 
std::string title () const
 Description of this container to use for MsgStream. More...
 

Private Types

using DepSet = CxxUtils::ConcurrentPtrSet< CondContBase, CxxUtils::SimpleUpdater >
 Other conditions dependencies that depend on this one, as inferred by addDependency calls. More...
 

Private Attributes

Athena::IRCUSvcm_rcusvc
 Need to remember the RCU svc here in order to pass it to the TS maps. More...
 
std::shared_ptr< CondContSet::IPayloadDeleter > m_payloadDeleter
 Deletion object for actual payload objects. More...
 
std::mutex m_mutex
 Mutex for insertions. More...
 
std::atomic< KeyTypem_keyType
 Key type of this container. More...
 
CLID m_clid
 CLID of the most-derived CondCont. More...
 
DataObjID m_id
 CLID+key for this container. More...
 
SG::DataProxym_proxy
 Associated DataProxy. More...
 
CondContSet m_condSet
 Set of mapped objects. More...
 
ServiceHandle< Athena::IConditionsCleanerSvcm_cleanerSvc
 Handle to the cleaner service. More...
 
DepSet m_deps
 

Static Private Attributes

static std::string s_cleanerSvcName ATLAS_THREAD_SAFE
 Name of the global conditions cleaner service. More...
 

Detailed Description

Base class for conditions containers for which keys are ranges in both Run+LBN and timestamp.

Definition at line 1030 of file CondCont.h.

Member Typedef Documentation

◆ CondContSet

typedef CxxUtils::ConcurrentRangeMap<RangeKey, key_type, void, Compare, Athena::RCUUpdater> CondContBase::CondContSet
protectedinherited

Definition at line 517 of file CondCont.h.

◆ delete_function

typedef CondContSet::delete_function CondContBase::delete_function
protectedinherited

Definition at line 520 of file CondCont.h.

◆ DepSet

Other conditions dependencies that depend on this one, as inferred by addDependency calls.

There should only be a few of them.

Definition at line 682 of file CondCont.h.

◆ key_type

typedef uint64_t CondContBase::key_type
inherited

Type used to store an IOV time internally.

For efficiency, we pack two 32-bit words into a 64-bit word Can be either run+lbn or a timestamp.

Definition at line 204 of file CondCont.h.

◆ Payload

typedef void CondContBase::Payload
inherited

Payload type held by this class.

Need to define this here for cast() to work properly.

Definition at line 198 of file CondCont.h.

◆ Updater_t

typedef CondContSet::Updater_t CondContBase::Updater_t
protectedinherited

Definition at line 519 of file CondCont.h.

Member Enumeration Documentation

◆ KeyType

enum CondContBase::KeyType
stronginherited

Type of key used for this container.

Enumerator
SINGLE 

Either TIMESTAMP or RUNLBN, but nothing's been put in the container yet, so we don't know which one.

TIMESTAMP 

Container uses timestamp keys.

RUNLBN 

Container uses run+lbn keys.

MIXED 

Mixed Run+lbn / timestamp container.

Definition at line 179 of file CondCont.h.

180  {
183  SINGLE,
184 
186  TIMESTAMP,
187 
189  RUNLBN,
190 
192  MIXED,
193  };

Constructor & Destructor Documentation

◆ CondContMixedBase()

CondContMixedBase::CondContMixedBase ( Athena::IRCUSvc rcusvc,
CLID  clid,
const DataObjID &  id,
SG::DataProxy proxy,
std::shared_ptr< CondContSet::IPayloadDeleter >  payloadDeleter,
size_t  capacity 
)
protected

Internal constructor.

Parameters
rcusvcRCU service instance.
CLIDof the most-derived CondCont.
idCLID+key for this object.
proxyDataProxy for this object.
payloadDeleterObject for deleting actual payload objects.
capacityInitial capacity of the container.

Definition at line 901 of file CondCont.cxx.

907  : CondContBase (rcusvc, KeyType::MIXED, clid, id, proxy,
908  std::make_shared<Athena::CondObjDeleter<CondContSet> > (rcusvc),
909  capacity),
910  m_rcusvc (rcusvc),
911  m_payloadDeleter (payloadDeleter)
912 {
913 }

Member Function Documentation

◆ addDep()

void CondContBase::addDep ( CondContBase dep)
inherited

Declare another conditions container that depends on this one.

Parameters
depConditions container that depends on this one.

Definition at line 696 of file CondCont.cxx.

697 {
698  m_deps.insert (dep);
699 }

◆ ATLAS_NOT_THREAD_SAFE()

static void setCleanerSvcName CondContBase::ATLAS_NOT_THREAD_SAFE ( const std::string &  name)
staticinherited

Allow overriding the name of the global conditions cleaner service (for testing purposes).

Parameters
nameThe name of the global conditions cleaner service.

◆ cast()

const void* CondContBase::cast ( CLID  clid,
const void *  ptr 
) const
protectedinherited

Do pointer conversion for the payload type.

Parameters
clidCLID for the desired pointer type.
ptrPointer of type T*.

Converts ptr from T* to a pointer to the type given by clid. Returns nullptr if the conversion is not possible.

◆ clear()

void CondContBase::clear ( )
inherited

Remove all entries in the container.

Mostly for testing — should not normally be used.

Definition at line 361 of file CondCont.cxx.

362 {
363  m_condSet.clear();
364 }

◆ clid()

CLID CondContBase::clid ( ) const
inherited

Return the CLID of the most-derived CondCont.

◆ delfcn()

CondContBase::delete_function * CondContBase::delfcn ( ) const
protectedinherited

Return the deletion function for this container.

Definition at line 740 of file CondCont.cxx.

741 {
742  return m_condSet.deleter().delfcn();
743 }

◆ doCast()

virtual const void* CondContBase::doCast ( CLID  clid,
const void *  ptr 
) const
protectedpure virtualinherited

Do pointer conversion for the payload type.

Parameters
clidCLID for the desired pointer type.
ptrPointer of type T*.

Converts ptr from T* to a pointer to the type given by clid. Returns nullptr if the conversion is not possible.

This is a virtual function that calls cast from the most-derived class of the hierarchy.

◆ entries()

size_t CondContMixedBase::entries ( ) const
finaloverridevirtual

Return the number of conditions objects in the container.

Reimplemented from CondContBase.

Definition at line 943 of file CondCont.cxx.

944 {
945  size_t nent = 0;
946  forEach ([&] (const CondContSet::value_type& ent) {
947  const CondContSet* tsmap =
948  reinterpret_cast<const CondContSet*> (ent.second);
949  nent += tsmap->size();
950  });
951  return nent;
952 }

◆ erase()

StatusCode CondContMixedBase::erase ( const EventIDBase &  t,
const EventContext &  ctx = Gaudi::Hive::currentContext() 
)
finaloverridevirtual

Erase the first element not less than t.

Parameters
IOVtime of element to erase.
ctxEvent context for the current thread.

This is not implemented for mixed containers.

Implements CondContBase.

Definition at line 1033 of file CondCont.cxx.

1035 {
1036  MsgStream msg (Athena::getMessageSvc(), title());
1037  msg << MSG::ERROR << "CondContMixedBase::erase: "
1038  << "erase() is not implemented for mixed containers."
1039  << endmsg;
1040  return StatusCode::FAILURE;
1041 }

◆ eraseBase()

StatusCode CondContBase::eraseBase ( const EventIDBase &  t,
const EventContext &  ctx = Gaudi::Hive::currentContext() 
)
protectedinherited

Erase the first element not less than t.

Parameters
IOVtime of element to erase.
ctxEvent context for the current thread.

Definition at line 539 of file CondCont.cxx.

541 {
542  switch (m_keyType) {
543  case KeyType::RUNLBN:
544  if (!t.isRunLumi()) {
545  MsgStream msg (Athena::getMessageSvc(), title());
546  msg << MSG::ERROR << "CondContBase::erase: "
547  << "Non-Run/LBN key used in Run/LBN container."
548  << endmsg;
549  return StatusCode::FAILURE;
550  }
551  m_condSet.erase (CondContBase::keyFromRunLBN (t), ctx);
552  break;
553  case KeyType::TIMESTAMP:
554  if (!t.isTimeStamp()) {
555  MsgStream msg (Athena::getMessageSvc(), title());
556  msg << MSG::ERROR << "CondContBase::erase: "
557  << "Non-Timestamp key used in timestamp container."
558  << endmsg;
559  return StatusCode::FAILURE;
560  }
562  break;
563  case KeyType::SINGLE:
564  break;
565  default:
566  std::abort();
567  }
568  return StatusCode::SUCCESS;
569 }

◆ extendLastRange()

StatusCode CondContMixedBase::extendLastRange ( const EventIDRange &  newRange,
const EventContext &  ctx = Gaudi::Hive::currentContext() 
)
finaloverridevirtual

Extend the range of the last IOV.

Parameters
newRangeNew validity range.
ctxEvent context.

Returns failure if the start time of newRange does not match the start time of the last IOV in the container. Otherwise, the end time for the last IOV is changed to the end time for newRange. (If the end time for newRange is before the end of the last IOV, then nothing is changed.)

This is not implemented for mixed containers.

Implements CondContBase.

Definition at line 1057 of file CondCont.cxx.

1059 {
1060  MsgStream msg (Athena::getMessageSvc(), title());
1061  msg << MSG::ERROR << "CondContMixedBase::extendLastRange: "
1062  << "extendLastRange() is not implemented for mixed containers."
1063  << endmsg;
1064  return StatusCode::FAILURE;
1065 }

◆ extendLastRangeBase()

StatusCode CondContBase::extendLastRangeBase ( const EventIDRange &  newRange,
const EventContext &  ctx = Gaudi::Hive::currentContext() 
)
protectedinherited

Extend the range of the last IOV.

Parameters
newRangeNew validity range.
ctxEvent context.

Returns failure if the start time of newRange does not match the start time of the last IOV in the container. Otherwise, the end time for the last IOV is changed to the end time for newRange. (If the end time for newRange is before the end of the last IOV, then nothing is changed.)

Definition at line 583 of file CondCont.cxx.

585 {
586  key_type start;
587  key_type stop;
588  switch (m_keyType) {
589  case KeyType::RUNLBN:
590  case KeyType::MIXED: // To handle the extension case of insertMixed().
591  if (!newRange.start().isRunLumi()) {
592  MsgStream msg (Athena::getMessageSvc(), title());
593  msg << MSG::ERROR << "CondContBase::extendLastRange: "
594  << "Non-Run/LBN range used in Run/LBN container."
595  << endmsg;
596  return StatusCode::FAILURE;
597  }
598  start = keyFromRunLBN (newRange.start());
599  stop = keyFromRunLBN (newRange.stop());
600  break;
601  case KeyType::TIMESTAMP:
602  if (!newRange.start().isTimeStamp()) {
603  MsgStream msg (Athena::getMessageSvc(), title());
604  msg << MSG::ERROR << "CondContBase::extendLastRange: "
605  << "Non-timestamp range used in timestamp container."
606  << endmsg;
607  return StatusCode::FAILURE;
608  }
609  start = keyFromTimestamp (newRange.start());
610  stop = keyFromTimestamp (newRange.stop());
611  break;
612  case KeyType::SINGLE:
613  // Empty container.
614  return StatusCode::FAILURE;
615  default:
616  std::abort();
617  }
618 
619  if (m_condSet.extendLastRange (RangeKey (newRange, start, stop), ctx) >= 0)
620  {
621  return StatusCode::SUCCESS;
622  }
623  return StatusCode::FAILURE;
624 }

◆ findBase()

const void * CondContBase::findBase ( const EventIDBase &  t,
EventIDRange const **  r 
) const
protectedinherited

Internal lookup function.

Parameters
tIOV time to find.
rIf non-null, copy validity range of the object here.

Looks up the conditions object corresponding to the IOV time t. If found, return the pointer (as a pointer to the payload type of the most-derived CondCont). Otherwise, return nullptr.

Parameters
clidCLID for the desired pointer type.
tIOV time to find.
rIf non-null, copy validity range of the object here.

Looks up the conditions object corresponding to the IOV time t. If found, convert the pointer to a pointer to the type identified by CLID and return it. Otherwise, return nullptr.

Definition at line 637 of file CondCont.cxx.

639 {
640  const void* ptr = nullptr;
641  key_type key;
642  switch (m_keyType) {
643  case KeyType::RUNLBN:
644  case KeyType::MIXED:
645  if (ATH_UNLIKELY (!t.isRunLumi())) {
646  MsgStream msg (Athena::getMessageSvc(), title());
647  msg << MSG::ERROR << "CondContBase::findBase: "
648  << "Non-Run/LBN key used in Run/LBN container."
649  << endmsg;
650  return nullptr;
651  }
652  key = keyFromRunLBN (t);
653  break;
654  case KeyType::TIMESTAMP:
655  if (ATH_UNLIKELY (!t.isTimeStamp())) {
656  MsgStream msg (Athena::getMessageSvc(), title());
657  msg << MSG::ERROR << "CondContBase::findBase: "
658  << "Non-timestamp key used in timestamp container."
659  << endmsg;
660  return nullptr;
661  }
662  key = keyFromTimestamp (t);
663  break;
664  case KeyType::SINGLE:
665  // Empty container.
666  return nullptr;
667  default:
668  std::abort();
669  }
670 
671  CondContSet::const_iterator it = m_condSet.find (key);
672  if (it && key < it->first.m_stop) {
673  if (r) {
674  *r = &it->first.m_range;
675  }
676  ptr = it->second;
677  }
678 
679  return ptr;
680 }

◆ findMixed()

const void * CondContMixedBase::findMixed ( const EventIDBase &  t,
EventIDRange const **  r 
) const
protected

Internal lookup function.

Parameters
tIOV time to find.
rIf non-null, copy validity range of the object here.

Looks up the conditions object corresponding to the IOV time t. If found, return the pointer (as a pointer to the payload type of the most-derived CondCont). Otherwise, return nullptr.

Definition at line 1211 of file CondCont.cxx.

1213 {
1214  if (!t.isTimeStamp()) {
1215  MsgStream msg (Athena::getMessageSvc(), title());
1216  msg << MSG::ERROR << "CondContMixedBase::findMixed: "
1217  << "No valid timestamp in key used with mixed container."
1218  << endmsg;
1219  return nullptr;
1220  }
1221 
1222  auto dostall = []() { CxxUtils::stall(); return true; };
1223  const void* ptr = nullptr;
1224  CondContSet::const_iterator it;
1225  do {
1226  ptr = CondContBase::findBase (t, nullptr);
1227  if (!ptr) return nullptr;
1228 
1229  const CondContSet* tsmap = reinterpret_cast<const CondContSet*> (ptr);
1231  it = tsmap->find (key);
1232 
1233  if (it && key < it->first.m_stop) {
1234  if (r) {
1235  *r = &it->first.m_range;
1236  }
1237  ptr = it->second;
1238  }
1239  else {
1240  ptr = nullptr;
1241  }
1242 
1243  // When we extend a range in a mixed container, the run/lbn fields
1244  // in the ts map are extended as a separate step. This means
1245  // that there is a window in which we can successfully look up
1246  // an entry, but the range we get will have the old, unextended
1247  // run/lbn. Work around here: if the run/lbn we're looking
1248  // for isn't in the range we get, then try again.
1249  } while (ptr &&
1250  keyFromRunLBN (t) >= keyFromRunLBN (it->first.m_range.stop()) &&
1251  dostall());
1252 
1253  return ptr;
1254 }

◆ forEach()

template<class FUNC >
void CondContBase::forEach ( const FUNC &  func) const
protectedinherited

Call func on each entry in the container.

Parameters
funcFunctional to call on each entry.

func will be called on each container element (being passed const CondContSet::value_type&).

◆ getDeps()

std::vector< CondContBase * > CondContBase::getDeps ( )
inherited

Return the list of conditions containers that depend on this one.

Definition at line 705 of file CondCont.cxx.

706 {
707  return std::vector<CondContBase*> (m_deps.begin(), m_deps.end());
708 }

◆ id()

const DataObjID& CondContBase::id ( ) const
inherited

Return CLID/key corresponding to this container.

◆ insertBase()

StatusCode CondContBase::insertBase ( const EventIDRange &  r,
CondContSet::payload_unique_ptr  t,
const EventContext &  ctx = Gaudi::Hive::currentContext() 
)
protectedinherited

Insert a new conditions object.

Parameters
rRange of validity of this object.
tPointer to the object being inserted.
ctxEvent context for the current thread.

Returns SUCCESS if the object was successfully inserted; EXTENDED if the last existing range in the container was extended to match the new range; OVERLAP if the object was inserted but the range partially overlaps with an existing one; DUPLICATE if the object wasn't inserted because the range duplicates an existing one, and FAILURE otherwise (ownership of the object will be taken in any case).

Definition at line 446 of file CondCont.cxx.

449 {
450  EventIDBase start = r.start();
451  EventIDBase stop = r.stop();
452 
453  key_type start_key, stop_key;
454 
455  if (m_keyType == KeyType::MIXED) {
456  if (start.run_number() == EventIDBase::UNDEFNUM ||
457  stop.run_number() == EventIDBase::UNDEFNUM)
458  {
459  MsgStream msg (Athena::getMessageSvc(), title());
460  msg << MSG::ERROR << "CondContBase::insertBase: "
461  << "Run part of range invalid in mixed container."
462  << endmsg;
463  return StatusCode::FAILURE;
464  }
465 
466  start_key = keyFromRunLBN (start);
467  stop_key = keyFromRunLBN (stop);
468  }
469  else if (start.isTimeStamp() && stop.isTimeStamp()) {
470  if (m_keyType == KeyType::SINGLE) {
472  }
473  else if (m_keyType != KeyType::TIMESTAMP) {
474  MsgStream msg (Athena::getMessageSvc(), title());
475  msg << MSG::ERROR << "CondContBase::insertBase: "
476  << "Timestamp key used in non-timestamp container."
477  << endmsg;
478  return StatusCode::FAILURE;
479  }
480 
481  start_key = keyFromTimestamp (start);
482  stop_key = keyFromTimestamp (stop);
483  }
484 
485  else if (start.run_number() != EventIDBase::UNDEFNUM &&
486  stop.run_number() != EventIDBase::UNDEFNUM)
487  {
488  if (m_keyType == KeyType::SINGLE) {
490  }
491  else if (m_keyType != KeyType::RUNLBN) {
492  MsgStream msg (Athena::getMessageSvc(), title());
493  msg << MSG::ERROR << "CondContBase::insertBase: "
494  << "Run/LBN key used in non-Run/LBN container."
495  << endmsg;
496  return StatusCode::FAILURE;
497  }
498 
499  start_key = keyFromRunLBN (start);
500  stop_key = keyFromRunLBN (stop);
501  }
502 
503  else {
504  MsgStream msg (Athena::getMessageSvc(), title());
505  msg << MSG::ERROR << "CondContBase::insertBase: EventIDRange " << r
506  << " is neither fully RunEvent nor TimeStamp"
507  << endmsg;
508  return StatusCode::FAILURE;
509  }
510 
511  CondContSet::EmplaceResult reslt =
512  m_condSet.emplace( RangeKey(r, start_key, stop_key),
513  std::move(t),
515  ctx );
516 
517  if (reslt == CondContSet::EmplaceResult::DUPLICATE)
518  {
520  }
521  else if (reslt == CondContSet::EmplaceResult::EXTENDED)
522  {
524  }
525  else if (reslt == CondContSet::EmplaceResult::OVERLAP) {
527  }
528 
529  return this->inserted (ctx);
530 }

◆ inserted()

StatusCode CondContBase::inserted ( const EventContext &  ctx)
protectedinherited

Tell the cleaner that a new object was added to the container.

Definition at line 686 of file CondCont.cxx.

687 {
688  return m_cleanerSvc->condObjAdded (ctx, *this);
689 }

◆ insertError()

void CondContBase::insertError ( CLID  usedCLID) const
protectedinherited

Helper to report an error due to using a base class for insertion.

Parameters
usedCLIDCLID of the class used for insertion.

Definition at line 727 of file CondCont.cxx.

728 {
729  MsgStream msg (Athena::getMessageSvc(), title());
730  msg << MSG::ERROR << "CondCont<T>::insert: Not most-derived class; "
731  << "CLID used: " << usedCLID
732  << "; container CLID: " << m_clid
733  << endmsg;
734 }

◆ insertMixed()

StatusCode CondContMixedBase::insertMixed ( const EventIDRange &  r,
CondContBase::CondContSet::payload_unique_ptr  t,
const EventContext &  ctx = Gaudi::Hive::currentContext() 
)
protected

Insert a new conditions object.

Parameters
rRange of validity of this object.
tPointer to the object being inserted.
ctxEvent context for the current thread.

Returns SUCCESS if the object was successfully inserted; OVERLAP if the object was inserted but the range partially overlaps with an existing one; DUPLICATE if the object wasn't inserted because the range duplicates an existing one, and FAILURE otherwise (ownership of the object will be taken in any case).

Parameters
rRange of validity of this object.
tPointer to the object being inserted.
ctxEvent context for the current thread.

Returns SUCCESS if the object was successfully inserted; EXTENDED if the last existing range in the container was extended to match the new range; OVERLAP if the object was inserted but the range partially overlaps with an existing one; DUPLICATE if the object wasn't inserted because the range duplicates an existing one, and FAILURE otherwise (ownership of the object will be taken in any case).

Definition at line 1084 of file CondCont.cxx.

1087 {
1088  // Serialize insertions.
1089  std::lock_guard<std::mutex> lock (m_mutex);
1090 
1091  const EventIDRange* range = nullptr;
1092  const void* tsmap_void = findBase (r.start(), &range);
1094  const_cast<CondContSet*>(reinterpret_cast<const CondContSet*> (tsmap_void));
1095 
1096  // Only test start timestamp. stop timestamp may be missing
1097  // for open-ended ranges.
1098  key_type start_key=0; //If there is no TimeStamp in start, assume infinite range
1099  if (r.start().isTimeStamp() ) {
1100  start_key = keyFromTimestamp (r.start());
1101  }
1102 
1103  key_type stop_key = keyFromTimestamp (r.stop());
1104 
1105  StatusCode sc = StatusCode::SUCCESS;
1106  sc.ignore();
1107  if (tsmap) {
1108  if (r.start().run_number() != range->start().run_number() ||
1109  r.stop().run_number() != range->stop().run_number() ||
1110  r.start().lumi_block() != range->start().lumi_block() ||
1111  r.stop().lumi_block() != range->stop().lumi_block())
1112  {
1113  // Run+lbn part doesn't match. If this range contains only a single
1114  // timestamp range which matches the timestamp part of the key,
1115  // then try to extend it. Otherwise, give an error.
1116 
1117  bool extended = false;
1118  if (tsmap->size() == 1) {
1119  CondContSet::const_iterator elt = tsmap->find (start_key);
1120  if (elt) {
1121  if (elt->first.m_start == start_key &&
1122  elt->first.m_stop == stop_key)
1123  {
1124  if (extendLastRangeBase (r, ctx).isSuccess())
1125  {
1127  sc.ignore();
1128  extended = true;
1129 
1130  // We also need to update the ending run+lbn value
1131  // for each entry in the tsmap.
1132  // (This doesn't affect sorting within the tsmap.)
1133  // There's a potential race here: a lookup happening
1134  // between the extendLastRangeBase above and the updateRanges
1135  // below can get a range with an unupdated run/lbn.
1136  // It would be cleaner to do the extend/update as a single
1137  // operation, but for now we work around by having findMixed
1138  // retry if the run/lbn being sought is in the range
1139  // of the entry that's actually found.
1140  tsmap->updateRanges ([&] (RangeKey& k)
1141  { EventIDBase start = k.m_range.start();
1142  EventIDBase stop = k.m_range.stop();
1143  stop.set_run_number(r.stop().run_number());
1144  stop.set_lumi_block(r.stop().lumi_block());
1145  k.m_range = EventIDRange (start, stop);
1146  },
1147  ctx);
1148  }
1149  }
1150  }
1151  }
1152 
1153  if (!extended) {
1154  MsgStream msg (Athena::getMessageSvc(), title());
1155  msg << MSG::ERROR << "CondContMixedBase::insertMixed: "
1156  << "Run+lbn part of new range doesn't match existing range, "
1157  << "or can't extend. "
1158  << "New: " << r << "; existing: " << *range
1159  << endmsg;
1160  return StatusCode::FAILURE;
1161  }
1162  }
1163  }
1164  else {
1165  auto newmap = std::make_unique<CondContSet>
1167  tsmap = newmap.get();
1168  sc = insertBase (r, std::move (newmap), ctx);
1169  if (sc.isFailure()) {
1170  return sc;
1171  }
1172  else if (Category::isDuplicate (sc)) {
1173  // Shouldn't happen...
1174  std::abort();
1175  }
1176  }
1177 
1178  CondContSet::EmplaceResult reslt =
1179  tsmap->emplace ( RangeKey(r, start_key, stop_key),
1180  std::move(t), false, ctx );
1181 
1182  if (reslt == CondContSet::EmplaceResult::OVERLAP) {
1184  }
1185  else if (Category::isExtended (sc)) {
1186  return sc;
1187  }
1188  else if (reslt == CondContSet::EmplaceResult::DUPLICATE)
1189  {
1191  }
1192  else if (reslt == CondContSet::EmplaceResult::EXTENDED)
1193  {
1194  std::abort(); // Shouldn't happen.
1195  }
1196  return this->inserted (ctx);
1197  //return sc;
1198 }

◆ keyFromRunLBN()

static key_type CondContBase::keyFromRunLBN ( const EventIDBase &  b)
staticinherited

Make a run+lbn key from an EventIDBase.

Parameters
EventID to convert.

◆ keyFromTimestamp()

static key_type CondContBase::keyFromTimestamp ( const EventIDBase &  b)
staticinherited

Make a timestamp key from an EventIDBase.

Parameters
EventID to convert.

◆ keyType()

KeyType CondContBase::keyType ( ) const
inherited

Return the key type for this container.

◆ list()

void CondContMixedBase::list ( std::ostream &  ost) const
finaloverridevirtual

Dump the container contents for debugging.

Parameters
ostStream to which to write the dump.

Implements CondContBase.

Definition at line 920 of file CondCont.cxx.

921 {
922  ost << "id: " << id() << " proxy: " << proxy() << " ["
923  << CondContBase::entries() << "] run+lbn entries" << std::endl;
924  forEach ([&] (const CondContSet::value_type& ent)
925  {
926  const CondContSet* tsmap =
927  reinterpret_cast<const CondContSet*> (ent.second);
928  if (tsmap->empty()) {
929  ost << ent.first.m_range << " (empty tsmap)" << std::endl;
930  }
931  else {
932  for (const CondContSet::value_type& ent2 : tsmap->range()) {
933  ost << ent2.first.m_range << " " << ent2.second << std::endl;
934  }
935  }
936  });
937 }

◆ maxSize()

size_t CondContBase::maxSize ( ) const
inherited

Return the maximum size of the map.

Definition at line 393 of file CondCont.cxx.

394 {
395  return m_condSet.maxSize();
396 }

◆ nInserts()

size_t CondContBase::nInserts ( ) const
inherited

Return the number times an item was inserted into the map.

Definition at line 384 of file CondCont.cxx.

385 {
386  return m_condSet.nInserts();
387 }

◆ payloadDelfcn()

CondContBase::delete_function * CondContMixedBase::payloadDelfcn ( ) const
protected

Return the payload deletion function for this container.

Definition at line 1260 of file CondCont.cxx.

1261 {
1262  return m_payloadDeleter->delfcn();
1263 }

◆ print()

void CondContBase::print ( ) const
inherited

Dump the container to cout.

For calling from the debugger.

Definition at line 285 of file CondCont.cxx.

286 {
287  list (std::cout);
288 }

◆ proxy() [1/2]

SG::DataProxy* CondContBase::proxy ( )
inherited

Return the associated DataProxy, if any.

◆ proxy() [2/2]

const SG::DataProxy* CondContBase::proxy ( ) const
inherited

Return the associated DataProxy, if any.

◆ quiescent()

void CondContBase::quiescent ( const EventContext &  ctx = Gaudi::Hive::currentContext())
inherited

Mark that this thread is no longer accessing data from this container.

Parameters
ctxEvent context for the current thread.

This would normally be done through RCU service. Defined here for purposes of testing.

Definition at line 375 of file CondCont.cxx.

376 {
377  m_condSet.quiescent (ctx);
378 }

◆ range()

bool CondContMixedBase::range ( const EventIDBase &  t,
EventIDRange &  r 
) const
finaloverridevirtual

Return the mapped validity range for an IOV time.

Parameters
tIOV time to check.
r[out]The range containing t.

Returns true if t is mapped; false otherwise.

Implements CondContBase.

Definition at line 1014 of file CondCont.cxx.

1015 {
1016  const EventIDRange* rp = nullptr;
1017  if (findMixed (t, &rp) != nullptr) {
1018  r = *rp;
1019  return true;
1020  }
1021  return false;
1022 }

◆ ranges()

std::vector< EventIDRange > CondContMixedBase::ranges ( ) const
finaloverridevirtual

Return all IOV validity ranges defined in this container.

Implements CondContBase.

Definition at line 959 of file CondCont.cxx.

960 {
961  std::vector<EventIDRange> r;
962  r.reserve (entries()*2);
963 
964  forEach ([&] (const CondContSet::value_type& ent)
965  {
966  const CondContSet* tsmap =
967  reinterpret_cast<const CondContSet*> (ent.second);
968  for (const CondContSet::value_type& ent2 : tsmap->range()) {
969  r.push_back (ent2.first.m_range);
970  }
971  });
972 
973  return r;
974 }

◆ setProxy()

void CondContBase::setProxy ( SG::DataProxy proxy)
inherited

Set the associated DataProxy.

Parameters
proxyThe proxy to set.

Definition at line 276 of file CondCont.cxx.

277 {
278  m_proxy = proxy;
279 }

◆ title()

std::string CondContBase::title ( ) const
protectedinherited

Description of this container to use for MsgStream.

Definition at line 749 of file CondCont.cxx.

750 {
751  return m_id.fullKey();
752 }

◆ trim()

size_t CondContBase::trim ( const std::vector< key_type > &  runLbnKeys,
const std::vector< key_type > &  TSKeys 
)
virtualinherited

Remove unused entries from the front of the list.

Parameters
runLbnKeysList of Run-Lumi keys that may still be in use. (Must be sorted.)
TSKeysList of time-stamp keys that may still be in use. (Must be sorted.)

We examine the objects in the container, starting with the earliest one. If none of the keys in keys match the range for this object, then it is removed from the container. We stop when we either find an object with a range matching a key in keys or when there is only one object left. Mixed containers are trimmed recursivly.

The list runLbnKeys should contain keys as computed by keyFromRunLBN, the list TSKey should contain keys from keyFromTimestamp. Depending on the type (RUNLUMI, TIMESTAMP, MIXED) only one of the lists or both are used. The list must be sorted.

Removed objects are queued for deletion once all slots have been marked as quiescent.

Returns the number of objects that were removed.

Parameters
keysList of keys that may still be in use. (Must be sorted.)

We examine the objects in the container, starting with the earliest one. If none of the keys in keys match the range for this object, then it is removed from the container. We stop when we either find an object with a range matching a key in keys or when there is only one object left.

The list keys should contain keys as computed by keyFromRunLBN or keyFromTimestamp, as appropriate for the container's key type (as returned from keyType()). The list must be sorted.

Removed objects are queued for deletion once all slots have been marked as quiescent.

Returns the number of objects that were removed.

Definition at line 320 of file CondCont.cxx.

321 {
322  if (m_keyType == KeyType::RUNLBN) {
323  return m_condSet.trim (runLbnKeys);
324  }
325 
326  if (m_keyType == KeyType::TIMESTAMP) {
327  return m_condSet.trim ( TSKeys );
328  }
329 
330 
331  if (m_keyType == KeyType::MIXED) {
332  //For mixed containers, first trim inner container based in TimeStamps
333  size_t nTrimmed=0;
334  for (const typename CondContSet::value_type& ent : m_condSet.range()) {
335  const CondContSet* tsmap = reinterpret_cast<const CondContSet*> (ent.second);
336  //size_t before=tsmap->size();
337  CondContSet* tsmap_nc ATLAS_THREAD_SAFE = const_cast<CondContSet*>(tsmap);
338  // Trim inner containers, allowing the removal of all elements.
339  // See ATLASRECTS-7421.
340  size_t ntrim=tsmap_nc->trim (TSKeys, true);
341  nTrimmed+=ntrim;
342  //std::cout << "WL: Trimming inner container for clid " << m_clid << " (" << ntrim << " out of " << before << ", nKeys= " << TSKeys.size() << ")" << std::endl;
343  }
344  // Then trim outer container based on run-LB.
345  size_t outerTrimmed=m_condSet.trim(runLbnKeys);
346  //std::cout << "WL: Removing outer sets " << outerTrimmed << ", remaining " << m_condSet.size() << std::endl;
347  //FIXME: The number returned may be inaccurate, only correct if the outer container
348  //has exactly one element left by the time it gets removed.
349  return nTrimmed+outerTrimmed;
350  }
351 
352 //Arrive here for KeyType::SINGLE .. do nothing.
353  return 0;
354 }

◆ typelessInsert()

StatusCode CondContMixedBase::typelessInsert ( const EventIDRange &  r,
void *  obj,
const EventContext &  ctx = Gaudi::Hive::currentContext() 
)
finaloverridevirtual

Insert a new conditions object.

Parameters
rRange of validity of this object.
objPointer to the object being inserted.
ctxEvent context for the current thread.

obj must point to an object of type T, except in the case of inheritance, where the type of obj must correspond to the most-derived CondCont type. The container will take ownership of this object.

Returns SUCCESS if the object was successfully inserted; OVERLAP if the object was inserted but the range partially overlaps with an existing one; DUPLICATE if the object wasn't inserted because the range duplicates an existing one, and FAILURE otherwise (ownership of the object will be taken in any case).

Implements CondContBase.

Definition at line 996 of file CondCont.cxx.

999 {
1000  return insertMixed (r,
1001  CondContSet::payload_unique_ptr (obj, payloadDelfcn()),
1002  ctx);
1003 }

◆ valid()

virtual bool CondContMixedBase::valid ( const EventIDBase &  t) const
finaloverridevirtual

Test to see if a given IOV time is mapped in the container.

Parameters
tIOV time to check.

Implements CondContBase.

Member Data Documentation

◆ ATLAS_THREAD_SAFE

std::string s_cleanerSvcName CondContBase::ATLAS_THREAD_SAFE
staticprivateinherited

Name of the global conditions cleaner service.

Definition at line 686 of file CondCont.h.

◆ m_cleanerSvc

ServiceHandle<Athena::IConditionsCleanerSvc> CondContBase::m_cleanerSvc
privateinherited

Handle to the cleaner service.

Definition at line 678 of file CondCont.h.

◆ m_clid

CLID CondContBase::m_clid
privateinherited

CLID of the most-derived CondCont.

Definition at line 666 of file CondCont.h.

◆ m_condSet

CondContSet CondContBase::m_condSet
privateinherited

Set of mapped objects.

Definition at line 675 of file CondCont.h.

◆ m_deps

DepSet CondContBase::m_deps
privateinherited

Definition at line 683 of file CondCont.h.

◆ m_id

DataObjID CondContBase::m_id
privateinherited

CLID+key for this container.

Definition at line 669 of file CondCont.h.

◆ m_keyType

std::atomic<KeyType> CondContBase::m_keyType
privateinherited

Key type of this container.

Definition at line 663 of file CondCont.h.

◆ m_mutex

std::mutex CondContMixedBase::m_mutex
private

Mutex for insertions.

Definition at line 1191 of file CondCont.h.

◆ m_payloadDeleter

std::shared_ptr<CondContSet::IPayloadDeleter> CondContMixedBase::m_payloadDeleter
private

Deletion object for actual payload objects.

Definition at line 1188 of file CondCont.h.

◆ m_proxy

SG::DataProxy* CondContBase::m_proxy
privateinherited

Associated DataProxy.

Definition at line 672 of file CondCont.h.

◆ m_rcusvc

Athena::IRCUSvc& CondContMixedBase::m_rcusvc
private

Need to remember the RCU svc here in order to pass it to the TS maps.

Definition at line 1185 of file CondCont.h.


The documentation for this class was generated from the following files:
CondContMixedBase::m_mutex
std::mutex m_mutex
Mutex for insertions.
Definition: CondCont.h:1191
beamspotman.r
def r
Definition: beamspotman.py:676
CondContBase::keyFromTimestamp
static key_type keyFromTimestamp(const EventIDBase &b)
Make a timestamp key from an EventIDBase.
python.trigbs_prescaleL1.ost
ost
Definition: trigbs_prescaleL1.py:104
CondContBase::KeyType::RUNLBN
@ RUNLBN
Container uses run+lbn keys.
Athena::CondObjDeleter
Deletion object for conditions payloads.
Definition: CondObjDeleter.h:41
CondContBase::keyFromRunLBN
static key_type keyFromRunLBN(const EventIDBase &b)
Make a run+lbn key from an EventIDBase.
CondContMixedBase::payloadDelfcn
delete_function * payloadDelfcn() const
Return the payload deletion function for this container.
Definition: CondCont.cxx:1260
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:14
CondContMixedBase::m_payloadDeleter
std::shared_ptr< CondContSet::IPayloadDeleter > m_payloadDeleter
Deletion object for actual payload objects.
Definition: CondCont.h:1188
skel.it
it
Definition: skel.GENtoEVGEN.py:423
CondContBase::Updater_t
CondContSet::Updater_t Updater_t
Definition: CondCont.h:519
ATH_UNLIKELY
#define ATH_UNLIKELY(x)
Definition: AthUnlikelyMacros.h:17
PixelModuleFeMask_create_db.stop
int stop
Definition: PixelModuleFeMask_create_db.py:76
CondContBase::findBase
const void * findBase(const EventIDBase &t, EventIDRange const **r) const
Internal lookup function.
Definition: CondCont.cxx:637
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
CondContBase::list
virtual void list(std::ostream &ost) const =0
Dump the container contents for debugging.
CondContBase::m_id
DataObjID m_id
CLID+key for this container.
Definition: CondCont.h:669
Athena::getMessageSvc
IMessageSvc * getMessageSvc(bool quiet=false)
Definition: getMessageSvc.cxx:20
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
CondContBase::inserted
StatusCode inserted(const EventContext &ctx)
Tell the cleaner that a new object was added to the container.
Definition: CondCont.cxx:686
CondContMixedBase::insertMixed
StatusCode insertMixed(const EventIDRange &r, CondContBase::CondContSet::payload_unique_ptr t, const EventContext &ctx=Gaudi::Hive::currentContext())
Insert a new conditions object.
Definition: CondCont.cxx:1084
CondContStatusCode::DUPLICATE
@ DUPLICATE
CondContStatusCode::OVERLAP
@ OVERLAP
CxxUtils::stall
void stall()
Emit stall instruction for use in a spin loop.
Definition: stall.h:37
CondContBase::id
const DataObjID & id() const
Return CLID/key corresponding to this container.
CxxUtils::ConcurrentPtrSet::insert
std::pair< const_iterator, bool > insert(const key_type p)
Add an element to the set.
CondContBase::forEach
void forEach(const FUNC &func) const
Call func on each entry in the container.
CondContMixedBase::range
virtual bool range(const EventIDBase &t, EventIDRange &r) const override final
Return the mapped validity range for an IOV time.
Definition: CondCont.cxx:1014
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
CondContMixedBase::m_rcusvc
Athena::IRCUSvc & m_rcusvc
Need to remember the RCU svc here in order to pass it to the TS maps.
Definition: CondCont.h:1185
CxxUtils::ConcurrentPtrSet::end
const_iterator end() const
Iterator at the end of the set.
CondContBase::m_clid
CLID m_clid
CLID of the most-derived CondCont.
Definition: CondCont.h:666
CondContBase::KeyType::TIMESTAMP
@ TIMESTAMP
Container uses timestamp keys.
CondContBase::entries
virtual size_t entries() const
Return the number of conditions objects in the container.
Definition: CondCont.cxx:294
CondContBase::m_proxy
SG::DataProxy * m_proxy
Associated DataProxy.
Definition: CondCont.h:672
CxxUtils::ConcurrentPtrSet::begin
const_iterator begin() const
Iterator at the start of the set.
jet::JetTopology::MIXED
@ MIXED
Definition: UncertaintyEnum.h:214
CondContBase::CondContSet
CxxUtils::ConcurrentRangeMap< RangeKey, key_type, void, Compare, Athena::RCUUpdater > CondContSet
Definition: CondCont.h:517
CondContBase::KeyType::MIXED
@ MIXED
Mixed Run+lbn / timestamp container.
CondContBase::ATLAS_THREAD_SAFE
static std::string s_cleanerSvcName ATLAS_THREAD_SAFE
Name of the global conditions cleaner service.
Definition: CondCont.h:686
CondContBase::extendLastRangeBase
StatusCode extendLastRangeBase(const EventIDRange &newRange, const EventContext &ctx=Gaudi::Hive::currentContext())
Extend the range of the last IOV.
Definition: CondCont.cxx:583
CondContBase::m_cleanerSvc
ServiceHandle< Athena::IConditionsCleanerSvc > m_cleanerSvc
Handle to the cleaner service.
Definition: CondCont.h:678
CondContBase::title
std::string title() const
Description of this container to use for MsgStream.
Definition: CondCont.cxx:749
CondContBase::CondContBase
CondContBase(Athena::IRCUSvc &rcusvc, KeyType keytype, CLID clid, const DataObjID &id, SG::DataProxy *proxy, std::shared_ptr< CondContSet::IPayloadDeleter > payloadDeleter, size_t capacity)
Internal constructor.
Definition: CondCont.cxx:409
CondContMixedBase::findMixed
const void * findMixed(const EventIDBase &t, EventIDRange const **r) const
Internal lookup function.
Definition: CondCont.cxx:1211
DeMoScan.first
bool first
Definition: DeMoScan.py:534
CondContBase::clid
CLID clid() const
Return the CLID of the most-derived CondCont.
CondContBase::key_type
uint64_t key_type
Type used to store an IOV time internally.
Definition: CondCont.h:204
CondContBase::Category::isExtended
static bool isExtended(code_t code)
Helper to test whether a code is EXTENDED.
Definition: CondCont.cxx:256
CondContBase::m_condSet
CondContSet m_condSet
Set of mapped objects.
Definition: CondCont.h:675
CondContBase::proxy
SG::DataProxy * proxy()
Return the associated DataProxy, if any.
CondContBase::insertBase
StatusCode insertBase(const EventIDRange &r, CondContSet::payload_unique_ptr t, const EventContext &ctx=Gaudi::Hive::currentContext())
Insert a new conditions object.
Definition: CondCont.cxx:446
CondContBase::m_deps
DepSet m_deps
Definition: CondCont.h:683
CondContBase::Category::isDuplicate
static bool isDuplicate(code_t code)
Helper to test whether a code is DUPLICATE.
Definition: CondCont.cxx:228
rp
ReadCards * rp
Definition: IReadCards.cxx:26
CondContStatusCode::EXTENDED
@ EXTENDED
python.PyAthena.obj
obj
Definition: PyAthena.py:135
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
CondContMixedBase::entries
virtual size_t entries() const override final
Return the number of conditions objects in the container.
Definition: CondCont.cxx:943
fitman.k
k
Definition: fitman.py:528
CondContBase::KeyType::SINGLE
@ SINGLE
Either TIMESTAMP or RUNLBN, but nothing's been put in the container yet, so we don't know which one.
CondContBase::m_keyType
std::atomic< KeyType > m_keyType
Key type of this container.
Definition: CondCont.h:663
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37