ATLAS Offline Software
Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
AthenaSharedMemoryTool Class Reference

This class provides the IPCTool for SharedMemory objects. More...

#include <AthenaSharedMemoryTool.h>

Inheritance diagram for AthenaSharedMemoryTool:
Collaboration diagram for AthenaSharedMemoryTool:

Public Member Functions

 AthenaSharedMemoryTool (const std::string &type, const std::string &name, const IInterface *parent)
 Standard Service Constructor. More...
 
virtual ~AthenaSharedMemoryTool ()
 Destructor. More...
 
StatusCode initialize ()
 Gaudi Service Interface method implementations: More...
 
StatusCode stop ()
 
StatusCode finalize ()
 
StatusCode makeServer (int num, const std::string &streamPortSuffix)
 
bool isServer () const
 
StatusCode makeClient (int num, std::string &streamPortSuffix)
 
bool isClient () const
 
StatusCode putEvent ATLAS_NOT_THREAD_SAFE (long eventNumber, const void *source, size_t nbytes, unsigned int status) const
 
StatusCode getLockedEvent (void **target, unsigned int &status) const
 
StatusCode lockEvent (long eventNumber) const
 
StatusCode putObject (const void *source, size_t nbytes, int num=0)
 
StatusCode getObject (void **target, size_t &nbytes, int num=0)
 
StatusCode clearObject (const char **tokenString, int &num)
 
StatusCode lockObject (const char *tokenString, int num=0)
 
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc. More...
 
const ServiceHandle< StoreGateSvc > & evtStore () const
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc. More...
 
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc. More...
 
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm. More...
 
virtual StatusCode sysStart () override
 Handle START transition. More...
 
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles. More...
 
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles. More...
 
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T > &t)
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleKey &hndl, const std::string &doc, const SG::VarHandleKeyType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleBase &hndl, const std::string &doc, const SG::VarHandleType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleKeyArray &hndArr, const std::string &doc, const SG::VarHandleKeyArrayType &)
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, T &property, const std::string &doc, const SG::NotHandleType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, T &property, const std::string &doc="none")
 Declare a new Gaudi property. More...
 
void updateVHKA (Gaudi::Details::PropertyBase &)
 
MsgStream & msg () const
 
MsgStream & msg (const MSG::Level lvl) const
 
bool msgLvl (const MSG::Level lvl) const
 
 DeclareInterfaceID (IAthenaIPCTool, 1, 0)
 

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution More...
 
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
 
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed. More...
 

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t
 

Private Member Functions

Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyArrayType &)
 specialization for handling Gaudi::Property<SG::VarHandleKeyArray> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleType &)
 specialization for handling Gaudi::Property<SG::VarHandleBase> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &t, const SG::NotHandleType &)
 specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray> More...
 

Private Attributes

StringProperty m_sharedMemory
 
const size_t m_maxSize
 
const int m_maxDataClients
 
int m_num
 
int m_lastClient
 
std::set< int > m_dataClients
 
boost::interprocess::mapped_region * m_payload
 
boost::interprocess::mapped_region * m_status
 
long m_fileSeqNumber
 
bool m_isServer
 
bool m_isClient
 
ServiceHandle< IIncidentSvc > m_incidentSvc
 
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default) More...
 
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default) More...
 
std::vector< SG::VarHandleKeyArray * > m_vhka
 
bool m_varHandleArraysDeclared
 

Detailed Description

This class provides the IPCTool for SharedMemory objects.

Definition at line 33 of file AthenaSharedMemoryTool.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ AthenaSharedMemoryTool()

AthenaSharedMemoryTool::AthenaSharedMemoryTool ( const std::string &  type,
const std::string &  name,
const IInterface *  parent 
)

Standard Service Constructor.

Definition at line 36 of file AthenaSharedMemoryTool.cxx.

39  m_maxSize(64 * 1024 * 1024),
40  m_maxDataClients(256),
41  m_num(-1),
42  m_lastClient(-1),
43  m_dataClients(),
44  m_payload(nullptr),
45  m_status(nullptr),
46  m_fileSeqNumber(0),
47  m_isServer(false),
48  m_isClient(false),
49  m_incidentSvc("IncidentSvc", name) {
50  declareProperty("SharedMemoryName", m_sharedMemory = name);
51  declareInterface<IAthenaIPCTool>(this);
52 }

◆ ~AthenaSharedMemoryTool()

AthenaSharedMemoryTool::~AthenaSharedMemoryTool ( )
virtual

Destructor.

Definition at line 55 of file AthenaSharedMemoryTool.cxx.

55  {
56  delete m_payload; m_payload = nullptr;
57  delete m_status; m_status = nullptr;
58 }

Member Function Documentation

◆ ATLAS_NOT_THREAD_SAFE()

StatusCode putEvent AthenaSharedMemoryTool::ATLAS_NOT_THREAD_SAFE ( long  eventNumber,
const void *  source,
size_t  nbytes,
unsigned int  status 
) const
virtual

Implements IAthenaIPCTool.

◆ clearObject()

StatusCode AthenaSharedMemoryTool::clearObject ( const char **  tokenString,
int &  num 
)
virtual

Implements IAthenaIPCTool.

Definition at line 376 of file AthenaSharedMemoryTool.cxx.

376  {
377  if (m_isClient) {
378  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
379  if (evtH->evtProcessStatus != ShareEventHeader::CLEARED) {
380  ATH_MSG_DEBUG("Waiting for FILL clearObject");
381  return(StatusCode::RECOVERABLE);
382  }
383  *tokenString = evtH->token;
384  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
385  return(StatusCode::SUCCESS);
386  }
387 
388  for (int i = 1; i <= m_num; i++) { // FIXME: PvG, do round robin
389  void* status = static_cast<char*>(m_status->get_address()) + i * sizeof(ShareEventHeader);
390  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
391  ShareEventHeader::ProcessStatus evtStatus = evtH->evtProcessStatus; // read only once
392  if (evtStatus == ShareEventHeader::FILLED) {
393  ATH_MSG_DEBUG("Waiting for UNFILL clearObject, client = " << i);
394  return(StatusCode::RECOVERABLE);
395  } else if (i == num && evtStatus != ShareEventHeader::LOCKED) {
396  ATH_MSG_DEBUG("Waiting for LOCK clearObject, client = " << i);
397  return(StatusCode::RECOVERABLE);
398  }
399  if (m_lastClient < 0 || m_lastClient == i) { // If Writer is not yet released, only consider last client
400  if ((i == num || num < 0) && evtStatus == ShareEventHeader::LOCKED) {
401  *tokenString = evtH->token;
402  num = i;
403  ATH_MSG_DEBUG("Setting LOCK clearObject, for client = " << num << ": " << evtH->token);
404  m_lastClient = -1;
405  // break;
406  }
407  }
408  }
409 
410  if (num > 0 && *tokenString != nullptr) {
411  m_lastClient = -1; // Release Writer from last client
412  void* status = static_cast<char*>(m_status->get_address()) + num * sizeof(ShareEventHeader);
413  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
414  if (strncmp(*tokenString, "wait", 4) == 0) {
415  ATH_MSG_INFO("Server clearObject() got wait, client = " << num);
416  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
417  m_lastClient = num; // Keep Writer allocated
418  num = -1;
419  return(StatusCode::SUCCESS);
420  }
421  if (strncmp(*tokenString, "release", 7) == 0) {
422  ATH_MSG_INFO("Server clearObject() got release, client = " << num);
423  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
424  num = -1;
425  return(StatusCode::SUCCESS);
426  }
427  if (strncmp(*tokenString, "start", 5) == 0) {
428  ATH_MSG_INFO("Server clearObject() got start, client = " << num << ", of " << m_num - 1);
429  if (m_dataClients.empty()) { // Annouce all workers to prevent early writer termination
430  for (int i = 1; i < m_num - 1; i++) m_dataClients.insert(i);
431  }
432  m_dataClients.insert(num);
433  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
434  num = -1;
435  return(StatusCode::SUCCESS);
436  }
437  if (strncmp(*tokenString, "stop", 4) == 0) {
438  ATH_MSG_INFO("Server clearObject() got stop, client = " << num);
439  m_dataClients.erase(num);
440  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
441  if (m_dataClients.empty()) {
442  ATH_MSG_INFO("Server clearObject() got stop, client ALL: " << m_num);
443  if (num == m_num - 1) { // mother process
444  return(StatusCode::SUCCESS);
445  }
446  return(StatusCode::FAILURE);
447  }
448  num = -1;
449  return(StatusCode::SUCCESS);
450  }
451  evtH->evtSize = 0;
452  m_status->flush(0, sizeof(ShareEventHeader));
453  evtH->evtProcessStatus = ShareEventHeader::CLEARED;
454  return(StatusCode::SUCCESS);
455  }
456  return(StatusCode::RECOVERABLE);
457 }

◆ declareGaudiProperty() [1/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleKeyArrayType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKeyArray>

Definition at line 170 of file AthCommonDataStore.h.

172  {
173  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
174  hndl.value(),
175  hndl.documentation());
176 
177  }

◆ declareGaudiProperty() [2/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleKeyType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158  {
159  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
160  hndl.value(),
161  hndl.documentation());
162 
163  }

◆ declareGaudiProperty() [3/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleBase>

Definition at line 184 of file AthCommonDataStore.h.

186  {
187  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
188  hndl.value(),
189  hndl.documentation());
190  }

◆ declareGaudiProperty() [4/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  t,
const SG::NotHandleType  
)
inlineprivateinherited

specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray>

Definition at line 199 of file AthCommonDataStore.h.

200  {
201  return PBASE::declareProperty(t);
202  }

◆ DeclareInterfaceID()

IAthenaIPCTool::DeclareInterfaceID ( IAthenaIPCTool  ,
,
 
)
inherited

◆ declareProperty() [1/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleBase hndl,
const std::string &  doc,
const SG::VarHandleType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
hndlObject holding the property value.
docDocumentation string for the property.

This is the version for types that derive from SG::VarHandleBase. The property value object is put on the input and output lists as appropriate; then we forward to the base class.

Definition at line 245 of file AthCommonDataStore.h.

249  {
250  this->declare(hndl.vhKey());
251  hndl.vhKey().setOwner(this);
252 
253  return PBASE::declareProperty(name,hndl,doc);
254  }

◆ declareProperty() [2/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleKey hndl,
const std::string &  doc,
const SG::VarHandleKeyType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
hndlObject holding the property value.
docDocumentation string for the property.

This is the version for types that derive from SG::VarHandleKey. The property value object is put on the input and output lists as appropriate; then we forward to the base class.

Definition at line 221 of file AthCommonDataStore.h.

225  {
226  this->declare(hndl);
227  hndl.setOwner(this);
228 
229  return PBASE::declareProperty(name,hndl,doc);
230  }

◆ declareProperty() [3/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleKeyArray hndArr,
const std::string &  doc,
const SG::VarHandleKeyArrayType  
)
inlineinherited

Definition at line 259 of file AthCommonDataStore.h.

263  {
264 
265  // std::ostringstream ost;
266  // ost << Algorithm::name() << " VHKA declareProp: " << name
267  // << " size: " << hndArr.keys().size()
268  // << " mode: " << hndArr.mode()
269  // << " vhka size: " << m_vhka.size()
270  // << "\n";
271  // debug() << ost.str() << endmsg;
272 
273  hndArr.setOwner(this);
274  m_vhka.push_back(&hndArr);
275 
276  Gaudi::Details::PropertyBase* p = PBASE::declareProperty(name, hndArr, doc);
277  if (p != 0) {
278  p->declareUpdateHandler(&AthCommonDataStore<PBASE>::updateVHKA, this);
279  } else {
280  ATH_MSG_ERROR("unable to call declareProperty on VarHandleKeyArray "
281  << name);
282  }
283 
284  return p;
285 
286  }

◆ declareProperty() [4/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
T &  property,
const std::string &  doc,
const SG::NotHandleType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
propertyObject holding the property value.
docDocumentation string for the property.

This is the generic version, for types that do not derive from SG::VarHandleKey. It just forwards to the base class version of declareProperty.

Definition at line 333 of file AthCommonDataStore.h.

337  {
338  return PBASE::declareProperty(name, property, doc);
339  }

◆ declareProperty() [5/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
T &  property,
const std::string &  doc = "none" 
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
propertyObject holding the property value.
docDocumentation string for the property.

This dispatches to either the generic declareProperty or the one for VarHandle/Key/KeyArray.

Definition at line 352 of file AthCommonDataStore.h.

355  {
356  typedef typename SG::HandleClassifier<T>::type htype;
357  return declareProperty (name, property, doc, htype());
358  }

◆ declareProperty() [6/6]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T > &  t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145  {
146  typedef typename SG::HandleClassifier<T>::type htype;
148  }

◆ detStore()

const ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

95 { return m_detStore; }

◆ evtStore() [1/2]

ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

85 { return m_evtStore; }

◆ evtStore() [2/2]

const ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( ) const
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 90 of file AthCommonDataStore.h.

90 { return m_evtStore; }

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase &  ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ finalize()

StatusCode AthenaSharedMemoryTool::finalize ( )

Definition at line 93 of file AthenaSharedMemoryTool.cxx.

93  {
94  ATH_MSG_INFO("in finalize()");
95  if (m_isServer) {
96  try {
98  } catch(boost::interprocess::interprocess_exception &e) {
99  ATH_MSG_WARNING("Cannot remove shared memory " << m_sharedMemory.value() << ": " << boost::diagnostic_information(e));
100  }
101  const std::string statusName = m_sharedMemory.value() + "_status";
102  try {
104  } catch(boost::interprocess::interprocess_exception &e) {
105  ATH_MSG_WARNING("Cannot remove shared memory " << statusName << ": " << boost::diagnostic_information(e));
106  }
107  }
108  // Release IncidentSvc
109  if (!m_incidentSvc.release().isSuccess()) {
110  ATH_MSG_WARNING("Cannot release IncidentSvc.");
111  }
112  return(::AthAlgTool::finalize());
113 }

◆ getLockedEvent()

StatusCode AthenaSharedMemoryTool::getLockedEvent ( void **  target,
unsigned int &  status 
) const
virtual

Implements IAthenaIPCTool.

Definition at line 257 of file AthenaSharedMemoryTool.cxx.

257  {
258  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
259  if (evtH->evtProcessStatus == ShareEventHeader::LOCKED) {
260  const std::size_t nbytes = evtH->evtSize;
261  if (target != nullptr) {
262  char* buf = new char[nbytes];
263  std::memcpy(buf, static_cast<char*>(m_payload->get_address()) + evtH->evtOffset, nbytes);
264  *target = buf;
265  }
266  status = evtH->evtCoreStatusFlag;
267  } else {
268  ATH_MSG_ERROR("No event locked");
269  return(StatusCode::FAILURE);
270  }
271  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
272  return(StatusCode::SUCCESS);
273 }

◆ getObject()

StatusCode AthenaSharedMemoryTool::getObject ( void **  target,
size_t &  nbytes,
int  num = 0 
)
virtual

Implements IAthenaIPCTool.

Definition at line 344 of file AthenaSharedMemoryTool.cxx.

344  {
345  if (target == nullptr) {
346  return(StatusCode::SUCCESS);
347  }
348  void* status = static_cast<char*>(m_status->get_address()) + num * sizeof(ShareEventHeader);
349  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
350  ShareEventHeader::ProcessStatus evtStatus = evtH->evtProcessStatus; // read only once
351  size_t evtSize = evtH->evtSize; // read only once
352  if (evtStatus != ShareEventHeader::FILLED) {
353  ATH_MSG_DEBUG("Waiting for FILLED getObject, client = " << num);
354  nbytes = 0;
355  return(StatusCode::RECOVERABLE);
356  }
357  if (evtH->evtOffset < evtSize) {
358  std::memcpy(&nbytes, static_cast<char*>(m_payload->get_address()) + evtH->evtOffset, sizeof(size_t));
359  evtH->evtOffset += sizeof(size_t);
360  *target = static_cast<char*>(m_payload->get_address()) + evtH->evtOffset;
361  evtH->evtOffset += nbytes;
362  }
363  if (evtH->evtOffset == evtSize) {
364  evtH->evtOffset = 0;
365  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
366  while (evtH->evtProcessStatus != ShareEventHeader::FILLED) {
367  usleep(10);
368  }
369  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
370  }
371 
372  return(StatusCode::SUCCESS);
373 }

◆ initialize()

StatusCode AthenaSharedMemoryTool::initialize ( )

Gaudi Service Interface method implementations:

Definition at line 61 of file AthenaSharedMemoryTool.cxx.

61  {
62  ATH_MSG_INFO("Initializing " << name());
63  if (!::AthAlgTool::initialize().isSuccess()) {
64  ATH_MSG_FATAL("Cannot initialize AthAlgTool base class.");
65  return(StatusCode::FAILURE);
66  }
67  // Retrieve IncidentSvc
68  if (!m_incidentSvc.retrieve().isSuccess()) {
69  ATH_MSG_FATAL("Cannot get IncidentSvc");
70  return(StatusCode::FAILURE);
71  }
72  return(StatusCode::SUCCESS);
73 }

◆ inputHandles()

virtual std::vector<Gaudi::DataHandle*> AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClient()

bool AthenaSharedMemoryTool::isClient ( ) const
virtual

Implements IAthenaIPCTool.

Definition at line 217 of file AthenaSharedMemoryTool.cxx.

217  {
218  return(m_isClient);
219 }

◆ isServer()

bool AthenaSharedMemoryTool::isServer ( ) const
virtual

Implements IAthenaIPCTool.

Definition at line 157 of file AthenaSharedMemoryTool.cxx.

157  {
158  return(m_isServer);
159 }

◆ lockEvent()

StatusCode AthenaSharedMemoryTool::lockEvent ( long  eventNumber) const
virtual

Implements IAthenaIPCTool.

Definition at line 276 of file AthenaSharedMemoryTool.cxx.

276  {
277  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
278  if (evtH->evtSeqNumber > eventNumber) {
279  ATH_MSG_ERROR("eventNumber = " << eventNumber << ", already processed");
280  return(StatusCode::FAILURE);
281  }
282  if (evtH->evtSeqNumber == 0 && evtH->fileSeqNumber == 0 && evtH->evtSize == 0) {
283  ATH_MSG_DEBUG("Server has been terminated");
284  return(StatusCode::FAILURE);
285  }
286  if (evtH->evtSeqNumber != eventNumber || evtH->evtProcessStatus != ShareEventHeader::FILLED) {
287  ATH_MSG_DEBUG("Waiting for lockEvent, eventNumber = " << eventNumber);
288  return(StatusCode::RECOVERABLE);
289  }
290  if (evtH->fileSeqNumber != m_fileSeqNumber && m_fileSeqNumber > 0) {
291  FileIncident endFileIncident(name(), "EndInputFile", "SHM");
292  m_incidentSvc->fireIncident(endFileIncident);
293  const_cast<AthenaSharedMemoryTool*>(this)->m_fileSeqNumber = evtH->fileSeqNumber;
294  FileIncident beginFileIncident(name(), "BeginInputFile", "SHM");
295  m_incidentSvc->fireIncident(beginFileIncident);
296  }
297  ATH_MSG_DEBUG("Locking eventNumber = " << eventNumber);
298  evtH->evtProcessStatus = ShareEventHeader::LOCKED;
299  return(StatusCode::SUCCESS);
300 }

◆ lockObject()

StatusCode AthenaSharedMemoryTool::lockObject ( const char *  tokenString,
int  num = 0 
)
virtual

Implements IAthenaIPCTool.

Definition at line 460 of file AthenaSharedMemoryTool.cxx.

460  {
461  if (strlen(tokenString) >= maxTokenLength) {
462  ATH_MSG_ERROR("Token = " << tokenString << ", too long for AthenaSharedMemoryTool");
463  return(StatusCode::FAILURE);
464  }
465  void* status = static_cast<char*>(m_status->get_address()) + num * sizeof(ShareEventHeader);
466  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
467  if (evtH->evtProcessStatus != ShareEventHeader::UNLOCKED) {
468  ATH_MSG_DEBUG("Waiting for UNLOCKED lockObject: " << tokenString);
469  return(StatusCode::RECOVERABLE);
470  }
471  strncpy(evtH->token, tokenString, maxTokenLength - 1); evtH->token[maxTokenLength - 1] = 0;
472  if (m_isServer) {
473  evtH->evtSize = 0;
474  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
475  evtH->evtProcessStatus = ShareEventHeader::CLEARED;
476  } else {
477  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
478  evtH->evtProcessStatus = ShareEventHeader::LOCKED;
479  }
480  return(StatusCode::SUCCESS);
481 }

◆ makeClient()

StatusCode AthenaSharedMemoryTool::makeClient ( int  num,
std::string &  streamPortSuffix 
)
virtual

Implements IAthenaIPCTool.

Definition at line 162 of file AthenaSharedMemoryTool.cxx.

162  {
163  if (m_isServer) {
164  ATH_MSG_ERROR("Cannot make AthenaSharedMemoryTool a Client.");
165  return(StatusCode::FAILURE);
166  }
167  if (num >= m_maxDataClients) {
168  ATH_MSG_ERROR("Too many clients for AthenaSharedMemoryTool.");
169  return(StatusCode::FAILURE);
170  }
171  if (m_num > 0 && num <= 0) {// stop running client
172  ATH_MSG_DEBUG("Stop AthenaSharedMemoryTool Client.");
173  m_num = -1;
174  while (lockObject("stop").isRecoverable()) {
175  usleep(100);
176  }
177  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
178  while (evtH->evtProcessStatus != ShareEventHeader::UNLOCKED) {
179  usleep(100);
180  }
181  delete m_payload ; m_payload = nullptr;
182  delete m_status ; m_status = nullptr;
183  m_isClient = false;
184  return(StatusCode::SUCCESS);
185  }
186  while (!m_isClient) {
187  try { // Check whether Server created shared memory object
188  const std::string statusName = m_sharedMemory.value() + "_status";
189  boost::interprocess::shared_memory_object shm_status(boost::interprocess::open_only,
190  statusName.c_str(),
191  boost::interprocess::read_write);
192  m_status = new boost::interprocess::mapped_region(shm_status, boost::interprocess::read_write, num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
193  boost::interprocess::shared_memory_object shm(boost::interprocess::open_only,
194  m_sharedMemory.value().c_str(),
195  boost::interprocess::read_write);
196  m_payload = new boost::interprocess::mapped_region(shm, boost::interprocess::read_write, 0, m_maxSize);
197  m_isClient = true;
198  } catch (boost::interprocess::interprocess_exception& e) {
199  usleep(100000);
200  }
201  }
202  if (m_num <= 0 && num > 0) {
203  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
204  streamPortSuffix.assign(evtH->token);
205  while (lockObject("start").isRecoverable()) {
206  usleep(100);
207  }
208  while (evtH->evtProcessStatus != ShareEventHeader::UNLOCKED) {
209  usleep(100);
210  }
211  m_num = num;
212  }
213  return(StatusCode::SUCCESS);
214 }

◆ makeServer()

StatusCode AthenaSharedMemoryTool::makeServer ( int  num,
const std::string &  streamPortSuffix 
)
virtual

Implements IAthenaIPCTool.

Definition at line 116 of file AthenaSharedMemoryTool.cxx.

116  {
117  if (m_isServer || m_isClient) {
118  ATH_MSG_ERROR("Cannot make AthenaSharedMemoryTool a Server.");
119  return(StatusCode::FAILURE);
120  }
121  if (num > m_maxDataClients) {
122  ATH_MSG_ERROR("Too many clients for AthenaSharedMemoryTool Server.");
123  return(StatusCode::FAILURE);
124  }
125  m_num = num;
126  m_isServer = true;
127  ATH_MSG_DEBUG("Creating shared memory object with name \"" << m_sharedMemory.value() << "\"");
128  std::optional<boost::interprocess::shared_memory_object> shm;
129  try {
130  shm.emplace(boost::interprocess::create_only, m_sharedMemory.value().c_str(), boost::interprocess::read_write);
131  } catch(boost::interprocess::interprocess_exception &e) {
132  ATH_MSG_ERROR("Cannot create shared memory " << m_sharedMemory.value() << ": " << boost::diagnostic_information(e));
133  return StatusCode::FAILURE;
134  }
135  shm->truncate(m_maxSize);
136  m_payload = new boost::interprocess::mapped_region(*shm, boost::interprocess::read_write, 0, m_maxSize);
137  const std::string statusName = m_sharedMemory.value() + "_status";
138  std::optional<boost::interprocess::shared_memory_object> shm_status;
139  try {
140  shm_status.emplace(boost::interprocess::create_only, statusName.c_str(), boost::interprocess::read_write);
141  } catch(boost::interprocess::interprocess_exception &e) {
142  ATH_MSG_ERROR("Cannot create shared memory " << statusName << ": " << boost::diagnostic_information(e));
143  return StatusCode::FAILURE;
144  }
145  shm_status->truncate(num * sizeof(ShareEventHeader));
146  m_status = new boost::interprocess::mapped_region(*shm_status, boost::interprocess::read_write, 0, num * sizeof(ShareEventHeader));
147  ShareEventHeader evtH = { ShareEventHeader::UNLOCKED, -1, -1, 0, 0, 0, "" };
148  std::memcpy(evtH.token, streamPortSuffix.c_str(), maxTokenLength - 1);
149  evtH.token[maxTokenLength - 1] = 0;
150  for (int i = 0; i < num; i++) {
151  std::memcpy(static_cast<char*>(m_status->get_address()) + i * sizeof(ShareEventHeader), &evtH, sizeof(ShareEventHeader));
152  }
153  return(StatusCode::SUCCESS);
154 }

◆ msg() [1/2]

MsgStream& AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24  {
25  return this->msgStream();
26  }

◆ msg() [2/2]

MsgStream& AthCommonMsg< AlgTool >::msg ( const MSG::Level  lvl) const
inlineinherited

Definition at line 27 of file AthCommonMsg.h.

27  {
28  return this->msgStream(lvl);
29  }

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level  lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30  {
31  return this->msgLevel(lvl);
32  }

◆ outputHandles()

virtual std::vector<Gaudi::DataHandle*> AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ putObject()

StatusCode AthenaSharedMemoryTool::putObject ( const void *  source,
size_t  nbytes,
int  num = 0 
)
virtual

Implements IAthenaIPCTool.

Definition at line 303 of file AthenaSharedMemoryTool.cxx.

303  {
304  if (nbytes > m_maxSize) {
305  ATH_MSG_ERROR("Object size = " << nbytes << " greater than maximum for client = " << num);
306  return(StatusCode::FAILURE);
307  }
308  void* status = static_cast<char*>(m_status->get_address()) + num * sizeof(ShareEventHeader);
309  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
310  ShareEventHeader::ProcessStatus evtStatus = evtH->evtProcessStatus; // read only once
311  if (evtStatus != ShareEventHeader::CLEARED) {
312  ATH_MSG_DEBUG("Waiting for CLEARED putObject, client = " << num << ", in state " << evtStatus);
313  return(StatusCode::RECOVERABLE);
314  }
315  if (source == nullptr) {
316  evtH->evtSize = evtH->evtOffset;
317  evtH->evtOffset = 0;
318  m_payload->flush(0 + evtH->evtOffset, evtH->evtSize);
319  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
320  evtH->evtProcessStatus = ShareEventHeader::FILLED;
321  } else {
322  if (evtH->evtOffset + sizeof(size_t) + nbytes > m_maxSize) {
323  ATH_MSG_ERROR("Object location = " << evtH->evtOffset << " greater than maximum for client = " << num);
324  return(StatusCode::FAILURE);
325  }
326  bool first = (evtH->evtOffset == 0);
327  std::memcpy(static_cast<char*>(m_payload->get_address()) + evtH->evtOffset, &nbytes, sizeof(size_t));
328  evtH->evtOffset += sizeof(size_t);
329  std::memcpy(static_cast<char*>(m_payload->get_address()) + evtH->evtOffset, source, nbytes);
330  evtH->evtOffset += nbytes;
331  if (evtH->evtSize == m_maxSize) {
332  evtH->evtSize = evtH->evtOffset;
333  }
334  if (first) {
335  evtH->evtSize = m_maxSize;
336  m_payload->flush(0, evtH->evtOffset);
337  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
338  }
339  }
340  return(StatusCode::SUCCESS);
341 }

◆ renounce()

std::enable_if_t<std::is_void_v<std::result_of_t<decltype(&T::renounce)(T)> > && !std::is_base_of_v<SG::VarHandleKeyArray, T> && std::is_base_of_v<Gaudi::DataHandle, T>, void> AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T &  h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381  {
382  h.renounce();
383  PBASE::renounce (h);
384  }

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364  {
365  handlesArray.renounce();
366  }

◆ stop()

StatusCode AthenaSharedMemoryTool::stop ( )

Definition at line 76 of file AthenaSharedMemoryTool.cxx.

76  {
77  ATH_MSG_INFO("in stop()");
78  if (m_isClient && m_num > 0) {
79  ATH_MSG_INFO("Client stop() inform Server: " << m_num);
80  m_num = -1;
81  while (lockObject("stop").isRecoverable()) {
82  usleep(100);
83  }
84  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
85  while (evtH->evtProcessStatus != ShareEventHeader::UNLOCKED) {
86  usleep(100);
87  }
88  }
89  return(StatusCode::SUCCESS);
90 }

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in DerivationFramework::CfAthAlgTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and asg::AsgMetadataTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase &  )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308  {
309  // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310  // << " size: " << m_vhka.size() << endmsg;
311  for (auto &a : m_vhka) {
312  std::vector<SG::VarHandleKey*> keys = a->keys();
313  for (auto k : keys) {
314  k->setOwner(this);
315  }
316  }
317  }

Member Data Documentation

◆ m_dataClients

std::set<int> AthenaSharedMemoryTool::m_dataClients
private

Definition at line 65 of file AthenaSharedMemoryTool.h.

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_fileSeqNumber

long AthenaSharedMemoryTool::m_fileSeqNumber
private

Definition at line 68 of file AthenaSharedMemoryTool.h.

◆ m_incidentSvc

ServiceHandle<IIncidentSvc> AthenaSharedMemoryTool::m_incidentSvc
private

Definition at line 71 of file AthenaSharedMemoryTool.h.

◆ m_isClient

bool AthenaSharedMemoryTool::m_isClient
private

Definition at line 70 of file AthenaSharedMemoryTool.h.

◆ m_isServer

bool AthenaSharedMemoryTool::m_isServer
private

Definition at line 69 of file AthenaSharedMemoryTool.h.

◆ m_lastClient

int AthenaSharedMemoryTool::m_lastClient
private

Definition at line 64 of file AthenaSharedMemoryTool.h.

◆ m_maxDataClients

const int AthenaSharedMemoryTool::m_maxDataClients
private

Definition at line 62 of file AthenaSharedMemoryTool.h.

◆ m_maxSize

const size_t AthenaSharedMemoryTool::m_maxSize
private

Definition at line 61 of file AthenaSharedMemoryTool.h.

◆ m_num

int AthenaSharedMemoryTool::m_num
private

Definition at line 63 of file AthenaSharedMemoryTool.h.

◆ m_payload

boost::interprocess::mapped_region* AthenaSharedMemoryTool::m_payload
private

Definition at line 66 of file AthenaSharedMemoryTool.h.

◆ m_sharedMemory

StringProperty AthenaSharedMemoryTool::m_sharedMemory
private

Definition at line 60 of file AthenaSharedMemoryTool.h.

◆ m_status

boost::interprocess::mapped_region* AthenaSharedMemoryTool::m_status
private

Definition at line 67 of file AthenaSharedMemoryTool.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files:
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
AthenaSharedMemoryTool::m_status
boost::interprocess::mapped_region * m_status
Definition: AthenaSharedMemoryTool.h:67
AthenaSharedMemoryTool::m_isServer
bool m_isServer
Definition: AthenaSharedMemoryTool.h:69
python.tests.PyTestsLib.finalize
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
Definition: PyTestsLib.py:50
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AthenaSharedMemoryTool::m_maxDataClients
const int m_maxDataClients
Definition: AthenaSharedMemoryTool.h:62
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
initialize
void initialize()
Definition: run_EoverP.cxx:894
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
StoreGateSvc_t m_evtStore
Pointer to StoreGate (event store by default)
Definition: AthCommonDataStore.h:390
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
std::vector< SG::VarHandleKeyArray * > m_vhka
Definition: AthCommonDataStore.h:398
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
SG::VarHandleKeyArray::setOwner
virtual void setOwner(IDataHandleHolder *o)=0
IDTPMcnv.htype
htype
Definition: IDTPMcnv.py:29
AthenaSharedMemoryTool::m_lastClient
int m_lastClient
Definition: AthenaSharedMemoryTool.h:64
PixelModuleFeMask_create_db.remove
string remove
Definition: PixelModuleFeMask_create_db.py:83
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
AthCommonDataStore
Definition: AthCommonDataStore.h:52
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
AthenaSharedMemoryTool::m_isClient
bool m_isClient
Definition: AthenaSharedMemoryTool.h:70
lumiFormat.i
int i
Definition: lumiFormat.py:85
python.DecayParser.buf
buf
print ("=> [%s]"cmd)
Definition: DecayParser.py:27
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
AthenaSharedMemoryTool::m_sharedMemory
StringProperty m_sharedMemory
Definition: AthenaSharedMemoryTool.h:60
AthenaSharedMemoryTool::m_dataClients
std::set< int > m_dataClients
Definition: AthenaSharedMemoryTool.h:65
test_pyathena.parent
parent
Definition: test_pyathena.py:15
AthenaSharedMemoryTool::m_payload
boost::interprocess::mapped_region * m_payload
Definition: AthenaSharedMemoryTool.h:66
taskman.statusName
statusName
Definition: taskman.py:461
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
StoreGateSvc_t m_detStore
Pointer to StoreGate (detector store by default)
Definition: AthCommonDataStore.h:393
xAOD::eventNumber
eventNumber
Definition: EventInfo_v1.cxx:124
AthAlgTool::AthAlgTool
AthAlgTool()
Default constructor:
SG::VarHandleKeyArray::renounce
virtual void renounce()=0
SG::HandleClassifier::type
std::conditional< std::is_base_of< SG::VarHandleKeyArray, T >::value, VarHandleKeyArrayType, type2 >::type type
Definition: HandleClassifier.h:54
trigbs_pickEvents.num
num
Definition: trigbs_pickEvents.py:76
merge_scale_histograms.doc
string doc
Definition: merge_scale_histograms.py:9
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
AthenaSharedMemoryTool::m_maxSize
const size_t m_maxSize
Definition: AthenaSharedMemoryTool.h:61
AthenaSharedMemoryTool::m_fileSeqNumber
long m_fileSeqNumber
Definition: AthenaSharedMemoryTool.h:68
maxTokenLength
const std::size_t maxTokenLength
Definition: AthenaSharedMemoryTool.cxx:20
a
TList * a
Definition: liststreamerinfos.cxx:10
h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
copySelective.target
string target
Definition: copySelective.py:37
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DeMoScan.first
bool first
Definition: DeMoScan.py:536
SG::VarHandleBase::vhKey
SG::VarHandleKey & vhKey()
Return a non-const reference to the HandleKey.
Definition: StoreGate/src/VarHandleBase.cxx:623
copySelective.source
string source
Definition: copySelective.py:32
AthenaSharedMemoryTool
This class provides the IPCTool for SharedMemory objects.
Definition: AthenaSharedMemoryTool.h:33
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:798
merge.status
status
Definition: merge.py:17
AthenaSharedMemoryTool::m_num
int m_num
Definition: AthenaSharedMemoryTool.h:63
AthenaSharedMemoryTool::lockObject
StatusCode lockObject(const char *tokenString, int num=0)
Definition: AthenaSharedMemoryTool.cxx:460
AthCommonDataStore::declareGaudiProperty
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>
Definition: AthCommonDataStore.h:156
AthenaSharedMemoryTool::m_incidentSvc
ServiceHandle< IIncidentSvc > m_incidentSvc
Definition: AthenaSharedMemoryTool.h:71
fitman.k
k
Definition: fitman.py:528