ATLAS Offline Software
AthenaSharedMemoryTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 /* file contains the implementation for the AthenaSharedMemoryTool class.
6  * @author Peter van Gemmeren <gemmeren@anl.gov>
7  **/
8 
10 
11 #include "GaudiKernel/FileIncident.h"
12 
13 #include <boost/exception/diagnostic_information.hpp>
14 #include <boost/interprocess/shared_memory_object.hpp>
15 #include <boost/interprocess/mapped_region.hpp>
16 
17 #include <optional>
18 #include <sstream>
19 
20 const std::size_t maxTokenLength = 512;
21 
22 namespace {
23 struct ShareEventHeader {
24  enum ProcessStatus { CLEARED, FILLED, LOCKED, UNLOCKED, PARTIAL, SHARED, UNKNOWN };
25  ProcessStatus evtProcessStatus;
26  long evtSeqNumber;
27  long fileSeqNumber;
28  std::size_t evtSize;
29  std::size_t evtOffset;
30  std::size_t evtCursor;
31  unsigned int evtCoreStatusFlag;
32  char token[maxTokenLength];
33 };
34 } // anonymous namespace
35 
36 //___________________________________________________________________________
38  const std::string& name,
39  const IInterface* parent) : AthAlgTool(type, name, parent),
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 }
54 
55 //___________________________________________________________________________
57  delete m_payload; m_payload = nullptr;
58  delete m_status; m_status = nullptr;
59 }
60 
61 //___________________________________________________________________________
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 }
75 
76 //___________________________________________________________________________
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 }
92 
93 //___________________________________________________________________________
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 }
115 
116 //___________________________________________________________________________
117 StatusCode AthenaSharedMemoryTool::makeServer(int num, const std::string& streamPortSuffix) {
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 }
156 
157 //___________________________________________________________________________
159  return(m_isServer);
160 }
161 
162 //___________________________________________________________________________
163 StatusCode AthenaSharedMemoryTool::makeClient(int num, std::string& streamPortSuffix) {
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 }
216 
217 //___________________________________________________________________________
219  return(m_isClient);
220 }
221 
222 //___________________________________________________________________________
223 StatusCode AthenaSharedMemoryTool::putEvent(long eventNumber, const void* source, std::size_t nbytes, unsigned int status) const {
224  if (nbytes > m_maxSize) {
225  ATH_MSG_ERROR("Event size = " << nbytes << " greater than maximum for eventNumber = " << eventNumber);
226  return(StatusCode::FAILURE);
227  }
228  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
229  if (evtH->evtProcessStatus != ShareEventHeader::UNLOCKED) {
230  ATH_MSG_DEBUG("Waiting for putEvent, eventNumber = " << eventNumber);
231  return(StatusCode::RECOVERABLE);
232  }
233  if (source == nullptr && nbytes == 0) {
234  ATH_MSG_DEBUG("putEvent got last Event marker");
235  evtH->evtSeqNumber = 0;
236  evtH->fileSeqNumber = 0;
237  evtH->evtSize = 0;
238  evtH->evtOffset = 0;
239  m_status->flush(0, sizeof(ShareEventHeader));
240  return(StatusCode::SUCCESS);
241  }
242  evtH->evtProcessStatus = ShareEventHeader::CLEARED;
243  if (source != nullptr && source != m_payload->get_address()) {
244  std::memcpy(m_payload->get_address(), source, nbytes);
245  m_payload->flush(0, nbytes);
246  }
247  evtH->evtSeqNumber = eventNumber;
248  evtH->fileSeqNumber = m_fileSeqNumber;
249  evtH->evtSize = nbytes;
250  evtH->evtOffset = 0;
251  evtH->evtCoreStatusFlag = status;
252  m_status->flush(0, sizeof(ShareEventHeader));
253  evtH->evtProcessStatus = ShareEventHeader::FILLED;
254  return(StatusCode::SUCCESS);
255 }
256 
257 //___________________________________________________________________________
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 }
275 
276 //___________________________________________________________________________
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 }
302 
303 //___________________________________________________________________________
304 StatusCode AthenaSharedMemoryTool::putObject(const void* source, size_t nbytes, int num) {
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 }
344 
345 //___________________________________________________________________________
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 }
391 
392 //___________________________________________________________________________
393 StatusCode AthenaSharedMemoryTool::clearObject(const char** tokenString, int& num) {
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 }
475 
476 //___________________________________________________________________________
477 StatusCode AthenaSharedMemoryTool::lockObject(const char* tokenString, int num) {
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 }
python.StoreID.UNKNOWN
int UNKNOWN
Definition: StoreID.py:16
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:53
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
AthenaSharedMemoryTool::stop
StatusCode stop()
Definition: AthenaSharedMemoryTool.cxx:77
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AthenaSharedMemoryTool::m_maxDataClients
const int m_maxDataClients
Definition: AthenaSharedMemoryTool.h:62
AthenaSharedMemoryTool::finalize
StatusCode finalize()
Definition: AthenaSharedMemoryTool.cxx:94
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
AthenaSharedMemoryTool::makeClient
StatusCode makeClient(int num, std::string &streamPortSuffix)
Definition: AthenaSharedMemoryTool.cxx:163
AthenaSharedMemoryTool::isServer
bool isServer() const
Definition: AthenaSharedMemoryTool.cxx:158
initialize
void initialize()
Definition: run_EoverP.cxx:894
AthenaSharedMemoryTool::~AthenaSharedMemoryTool
virtual ~AthenaSharedMemoryTool()
Destructor.
Definition: AthenaSharedMemoryTool.cxx:56
AthenaSharedMemoryTool::getLockedEvent
StatusCode getLockedEvent(void **target, unsigned int &status) const
Definition: AthenaSharedMemoryTool.cxx:258
AthenaSharedMemoryTool::m_lastClient
int m_lastClient
Definition: AthenaSharedMemoryTool.h:64
PixelModuleFeMask_create_db.remove
string remove
Definition: PixelModuleFeMask_create_db.py:83
AthenaSharedMemoryTool.h
This file contains the class definition for the AthenaSharedMemoryTool class.
AthenaSharedMemoryTool::putObject
StatusCode putObject(const void *source, size_t nbytes, int num=0)
Definition: AthenaSharedMemoryTool.cxx:304
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
AthenaSharedMemoryTool::makeServer
StatusCode makeServer(int num, const std::string &streamPortSuffix)
Definition: AthenaSharedMemoryTool.cxx:117
AthenaSharedMemoryTool::m_isClient
bool m_isClient
Definition: AthenaSharedMemoryTool.h:70
lumiFormat.i
int i
Definition: lumiFormat.py:92
AthenaSharedMemoryTool::AthenaSharedMemoryTool
AthenaSharedMemoryTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard Service Constructor.
Definition: AthenaSharedMemoryTool.cxx:37
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
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
AthenaSharedMemoryTool::clearObject
StatusCode clearObject(const char **tokenString, int &num)
Definition: AthenaSharedMemoryTool.cxx:393
test_pyathena.parent
parent
Definition: test_pyathena.py:15
AthenaSharedMemoryTool::m_payload
boost::interprocess::mapped_region * m_payload
Definition: AthenaSharedMemoryTool.h:66
AthenaSharedMemoryTool::getObject
StatusCode getObject(void **target, size_t &nbytes, int num=0)
Definition: AthenaSharedMemoryTool.cxx:346
taskman.statusName
statusName
Definition: taskman.py:461
xAOD::eventNumber
eventNumber
Definition: EventInfo_v1.cxx:124
trigbs_pickEvents.num
num
Definition: trigbs_pickEvents.py:76
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
AthenaSharedMemoryTool::lockEvent
StatusCode lockEvent(long eventNumber) const
Definition: AthenaSharedMemoryTool.cxx:277
AthenaSharedMemoryTool::m_maxSize
const size_t m_maxSize
Definition: AthenaSharedMemoryTool.h:61
AthenaSharedMemoryTool::isClient
bool isClient() const
Definition: AthenaSharedMemoryTool.cxx:218
AthenaSharedMemoryTool::m_fileSeqNumber
long m_fileSeqNumber
Definition: AthenaSharedMemoryTool.h:68
maxTokenLength
const std::size_t maxTokenLength
Definition: AthenaSharedMemoryTool.cxx:20
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DeMoScan.first
bool first
Definition: DeMoScan.py:534
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:569
AthenaSharedMemoryTool
This class provides the IPCTool for SharedMemory objects.
Definition: AthenaSharedMemoryTool.h:33
merge.status
status
Definition: merge.py:17
COOLRates.target
target
Definition: COOLRates.py:1106
AthAlgTool
Definition: AthAlgTool.h:26
AthenaSharedMemoryTool::m_num
int m_num
Definition: AthenaSharedMemoryTool.h:63
AthenaSharedMemoryTool::lockObject
StatusCode lockObject(const char *tokenString, int num=0)
Definition: AthenaSharedMemoryTool.cxx:477
AthenaSharedMemoryTool::initialize
StatusCode initialize()
Gaudi Service Interface method implementations:
Definition: AthenaSharedMemoryTool.cxx:62
AthenaSharedMemoryTool::m_incidentSvc
ServiceHandle< IIncidentSvc > m_incidentSvc
Definition: AthenaSharedMemoryTool.h:71