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 37 of file AthenaSharedMemoryTool.cxx.

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

◆ ~AthenaSharedMemoryTool()

AthenaSharedMemoryTool::~AthenaSharedMemoryTool ( )
virtual

Destructor.

Definition at line 56 of file AthenaSharedMemoryTool.cxx.

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

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 393 of file AthenaSharedMemoryTool.cxx.

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

◆ 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 94 of file AthenaSharedMemoryTool.cxx.

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

◆ getLockedEvent()

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

Implements IAthenaIPCTool.

Definition at line 258 of file AthenaSharedMemoryTool.cxx.

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

◆ getObject()

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

Implements IAthenaIPCTool.

Definition at line 346 of file AthenaSharedMemoryTool.cxx.

346  {
347  if (target == nullptr) {
348  return(StatusCode::SUCCESS);
349  }
350  void* status = static_cast<char*>(m_status->get_address()) + num * sizeof(ShareEventHeader);
351  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
352  ShareEventHeader::ProcessStatus evtStatus = evtH->evtProcessStatus; // read only once
353  size_t evtSize = evtH->evtSize; // read only once
354  if (evtStatus == ShareEventHeader::PARTIAL && evtH->evtCursor > 0) {
355  ATH_MSG_DEBUG("Waiting for UNPARTIAL getObject, client = " << num);
356  nbytes = evtH->evtCursor;
357  return(StatusCode::RECOVERABLE);
358  }
359  if (evtStatus != ShareEventHeader::FILLED &&
360  evtStatus != ShareEventHeader::SHARED &&
361  evtStatus != ShareEventHeader::PARTIAL) {
362  ATH_MSG_DEBUG("Waiting for FILLED getObject, client = " << num);
363  nbytes = 0;
364  return(StatusCode::RECOVERABLE);
365  }
366  if (evtH->evtCursor < evtSize) {
367  std::memcpy(&nbytes, static_cast<char*>(m_payload->get_address()) + evtH->evtCursor, sizeof(size_t));
368  evtH->evtCursor += sizeof(size_t);
369  *target = static_cast<char*>(m_payload->get_address()) + evtH->evtCursor;
370  if (evtStatus != ShareEventHeader::PARTIAL) {
371  evtH->evtProcessStatus = ShareEventHeader::SHARED;
372  }
373  evtH->evtCursor += nbytes;
374  } else {
375  nbytes = 0;
376  }
377  if (evtH->evtCursor == evtSize) {
378  if (evtH->evtProcessStatus == ShareEventHeader::SHARED) {
379  evtH->evtProcessStatus = ShareEventHeader::FILLED;
380  } else {
381  evtH->evtCursor = 0;
382  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
383  while (evtH->evtProcessStatus != ShareEventHeader::FILLED) {
384  usleep(10);
385  }
386  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
387  }
388  }
389  return(StatusCode::SUCCESS);
390 }

◆ initialize()

StatusCode AthenaSharedMemoryTool::initialize ( )

Gaudi Service Interface method implementations:

Definition at line 62 of file AthenaSharedMemoryTool.cxx.

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

◆ 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 218 of file AthenaSharedMemoryTool.cxx.

218  {
219  return(m_isClient);
220 }

◆ isServer()

bool AthenaSharedMemoryTool::isServer ( ) const
virtual

Implements IAthenaIPCTool.

Definition at line 158 of file AthenaSharedMemoryTool.cxx.

158  {
159  return(m_isServer);
160 }

◆ lockEvent()

StatusCode AthenaSharedMemoryTool::lockEvent ( long  eventNumber) const
virtual

Implements IAthenaIPCTool.

Definition at line 277 of file AthenaSharedMemoryTool.cxx.

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

◆ lockObject()

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

Implements IAthenaIPCTool.

Definition at line 477 of file AthenaSharedMemoryTool.cxx.

477  {
478  if (strlen(tokenString) >= maxTokenLength) {
479  ATH_MSG_ERROR("Token = " << tokenString << ", too long for AthenaSharedMemoryTool");
480  return(StatusCode::FAILURE);
481  }
482  void* status = static_cast<char*>(m_status->get_address()) + num * sizeof(ShareEventHeader);
483  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
484  if (evtH->evtProcessStatus != ShareEventHeader::UNLOCKED) {
485  ATH_MSG_DEBUG("Waiting for UNLOCKED lockObject: " << tokenString);
486  return(StatusCode::RECOVERABLE);
487  }
488  strncpy(evtH->token, tokenString, maxTokenLength - 1); evtH->token[maxTokenLength - 1] = 0;
489  if (m_isServer) {
490  evtH->evtSize = 0;
491  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
492  evtH->evtProcessStatus = ShareEventHeader::CLEARED;
493  } else {
494  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
495  evtH->evtProcessStatus = ShareEventHeader::LOCKED;
496  }
497  return(StatusCode::SUCCESS);
498 }

◆ makeClient()

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

Implements IAthenaIPCTool.

Definition at line 163 of file AthenaSharedMemoryTool.cxx.

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

◆ makeServer()

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

Implements IAthenaIPCTool.

Definition at line 117 of file AthenaSharedMemoryTool.cxx.

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

◆ 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 304 of file AthenaSharedMemoryTool.cxx.

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

◆ 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 77 of file AthenaSharedMemoryTool.cxx.

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

◆ 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:27
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:221
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
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
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:477
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