Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
AthenaSharedMemoryTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 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, UNKNOWN };
25  ProcessStatus evtProcessStatus;
26  long evtSeqNumber;
27  long fileSeqNumber;
28  std::size_t evtSize;
29  std::size_t evtOffset;
30  unsigned int evtCoreStatusFlag;
31  char token[maxTokenLength];
32 };
33 } // anonymous namespace
34 
35 //___________________________________________________________________________
37  const std::string& name,
38  const IInterface* parent) :
39  base_class(type, name, parent),
40  m_incidentSvc("IncidentSvc", name) {
41  m_sharedMemory.setValue(name);
42 }
43 
44 //___________________________________________________________________________
46 }
47 
48 //___________________________________________________________________________
50  ATH_MSG_INFO("Initializing " << name());
51 
52  ATH_CHECK( m_incidentSvc.retrieve() );
53 
54  return(StatusCode::SUCCESS);
55 }
56 
57 //___________________________________________________________________________
59  ATH_MSG_INFO("in stop()");
60  if (m_isClient && m_num > 0) {
61  ATH_MSG_INFO("Client stop() inform Server: " << m_num);
62  m_num = -1;
63  while (lockObject("stop").isRecoverable()) {
64  usleep(100);
65  }
66  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
67  while (evtH->evtProcessStatus != ShareEventHeader::UNLOCKED) {
68  usleep(100);
69  }
70  }
71  return(StatusCode::SUCCESS);
72 }
73 
74 //___________________________________________________________________________
76  ATH_MSG_INFO("in finalize()");
77  if (m_isServer) {
78  try {
80  } catch(boost::interprocess::interprocess_exception &e) {
81  ATH_MSG_WARNING("Cannot remove shared memory " << m_sharedMemory.value() << ": " << boost::diagnostic_information(e));
82  }
83  const std::string statusName = m_sharedMemory.value() + "_status";
84  try {
86  } catch(boost::interprocess::interprocess_exception &e) {
87  ATH_MSG_WARNING("Cannot remove shared memory " << statusName << ": " << boost::diagnostic_information(e));
88  }
89  }
90  // Release IncidentSvc
91  if (!m_incidentSvc.release().isSuccess()) {
92  ATH_MSG_WARNING("Cannot release IncidentSvc.");
93  }
94  return(::AthAlgTool::finalize());
95 }
96 
97 //___________________________________________________________________________
98 StatusCode AthenaSharedMemoryTool::makeServer(int num, const std::string& streamPortSuffix) {
99  if (m_isServer || m_isClient) {
100  ATH_MSG_ERROR("Cannot make AthenaSharedMemoryTool a Server.");
101  return(StatusCode::FAILURE);
102  }
103  if (num > m_maxDataClients) {
104  ATH_MSG_ERROR("Too many clients for AthenaSharedMemoryTool Server.");
105  return(StatusCode::FAILURE);
106  }
107  m_num = num;
108  m_isServer = true;
109  ATH_MSG_DEBUG("Creating shared memory object with name \"" << m_sharedMemory.value() << "\"");
110  std::optional<boost::interprocess::shared_memory_object> shm;
111  try {
112  shm.emplace(boost::interprocess::create_only, m_sharedMemory.value().c_str(), boost::interprocess::read_write);
113  } catch(boost::interprocess::interprocess_exception &e) {
114  ATH_MSG_ERROR("Cannot create shared memory " << m_sharedMemory.value() << ": " << boost::diagnostic_information(e));
115  return StatusCode::FAILURE;
116  }
117  shm->truncate(m_maxSize);
118  m_payload = std::make_unique<boost::interprocess::mapped_region>(*shm, boost::interprocess::read_write, 0, m_maxSize);
119  const std::string statusName = m_sharedMemory.value() + "_status";
120  std::optional<boost::interprocess::shared_memory_object> shm_status;
121  try {
122  shm_status.emplace(boost::interprocess::create_only, statusName.c_str(), boost::interprocess::read_write);
123  } catch(boost::interprocess::interprocess_exception &e) {
124  ATH_MSG_ERROR("Cannot create shared memory " << statusName << ": " << boost::diagnostic_information(e));
125  return StatusCode::FAILURE;
126  }
127  shm_status->truncate(num * sizeof(ShareEventHeader));
128  m_status = std::make_unique<boost::interprocess::mapped_region>(*shm_status, boost::interprocess::read_write, 0, num * sizeof(ShareEventHeader));
129  ShareEventHeader evtH = { ShareEventHeader::UNLOCKED, -1, -1, 0, 0, 0, "" };
130  std::memcpy(evtH.token, streamPortSuffix.c_str(), maxTokenLength - 1);
131  evtH.token[maxTokenLength - 1] = 0;
132  for (int i = 0; i < num; i++) {
133  std::memcpy(static_cast<char*>(m_status->get_address()) + i * sizeof(ShareEventHeader), &evtH, sizeof(ShareEventHeader));
134  }
135  return(StatusCode::SUCCESS);
136 }
137 
138 //___________________________________________________________________________
140  return(m_isServer);
141 }
142 
143 //___________________________________________________________________________
144 StatusCode AthenaSharedMemoryTool::makeClient(int num, std::string& streamPortSuffix) {
145  if (m_isServer) {
146  ATH_MSG_ERROR("Cannot make AthenaSharedMemoryTool a Client.");
147  return(StatusCode::FAILURE);
148  }
149  if (num >= m_maxDataClients) {
150  ATH_MSG_ERROR("Too many clients for AthenaSharedMemoryTool.");
151  return(StatusCode::FAILURE);
152  }
153  if (m_num > 0 && num <= 0) {// stop running client
154  ATH_MSG_DEBUG("Stop AthenaSharedMemoryTool Client.");
155  m_num = -1;
156  while (lockObject("stop").isRecoverable()) {
157  usleep(100);
158  }
159  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
160  while (evtH->evtProcessStatus != ShareEventHeader::UNLOCKED) {
161  usleep(100);
162  }
163  m_payload.reset();
164  m_status.reset();
165  m_isClient = false;
166  return(StatusCode::SUCCESS);
167  }
168  while (!m_isClient) {
169  try { // Check whether Server created shared memory object
170  const std::string statusName = m_sharedMemory.value() + "_status";
171  boost::interprocess::shared_memory_object shm_status(boost::interprocess::open_only,
172  statusName.c_str(),
173  boost::interprocess::read_write);
174  m_status = std::make_unique<boost::interprocess::mapped_region>(shm_status, boost::interprocess::read_write, num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
175  boost::interprocess::shared_memory_object shm(boost::interprocess::open_only,
176  m_sharedMemory.value().c_str(),
177  boost::interprocess::read_write);
178  m_payload = std::make_unique<boost::interprocess::mapped_region>(shm, boost::interprocess::read_write, 0, m_maxSize);
179  m_isClient = true;
180  } catch (boost::interprocess::interprocess_exception& e) {
181  usleep(100000);
182  }
183  }
184  if (m_num <= 0 && num > 0) {
185  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
186  streamPortSuffix.assign(evtH->token);
187  while (lockObject("start").isRecoverable()) {
188  usleep(100);
189  }
190  while (evtH->evtProcessStatus != ShareEventHeader::UNLOCKED) {
191  usleep(100);
192  }
193  m_num = num;
194  }
195  return(StatusCode::SUCCESS);
196 }
197 
198 //___________________________________________________________________________
200  return(m_isClient);
201 }
202 
203 //___________________________________________________________________________
204 StatusCode AthenaSharedMemoryTool::putEvent(long eventNumber, const void* source, std::size_t nbytes, unsigned int status) const {
205  if (nbytes > m_maxSize) {
206  ATH_MSG_ERROR("Event size = " << nbytes << " greater than maximum for eventNumber = " << eventNumber);
207  return(StatusCode::FAILURE);
208  }
209  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
210  if (evtH->evtProcessStatus != ShareEventHeader::UNLOCKED) {
211  ATH_MSG_DEBUG("Waiting for putEvent, eventNumber = " << eventNumber);
212  return(StatusCode::RECOVERABLE);
213  }
214  if (source == nullptr && nbytes == 0) {
215  ATH_MSG_DEBUG("putEvent got last Event marker");
216  evtH->evtSeqNumber = 0;
217  evtH->fileSeqNumber = 0;
218  evtH->evtSize = 0;
219  evtH->evtOffset = 0;
220  m_status->flush(0, sizeof(ShareEventHeader));
221  return(StatusCode::SUCCESS);
222  }
223  evtH->evtProcessStatus = ShareEventHeader::CLEARED;
224  if (source != nullptr && source != m_payload->get_address()) {
225  std::memcpy(m_payload->get_address(), source, nbytes);
226  m_payload->flush(0, nbytes);
227  }
228  evtH->evtSeqNumber = eventNumber;
229  evtH->fileSeqNumber = m_fileSeqNumber;
230  evtH->evtSize = nbytes;
231  evtH->evtOffset = 0;
232  evtH->evtCoreStatusFlag = status;
233  m_status->flush(0, sizeof(ShareEventHeader));
234  evtH->evtProcessStatus = ShareEventHeader::FILLED;
235  return(StatusCode::SUCCESS);
236 }
237 
238 //___________________________________________________________________________
240  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
241  if (evtH->evtProcessStatus == ShareEventHeader::LOCKED) {
242  const std::size_t nbytes = evtH->evtSize;
243  if (target != nullptr) {
244  char* buf = new char[nbytes];
245  std::memcpy(buf, static_cast<char*>(m_payload->get_address()) + evtH->evtOffset, nbytes);
246  *target = buf;
247  }
248  status = evtH->evtCoreStatusFlag;
249  } else {
250  ATH_MSG_ERROR("No event locked");
251  return(StatusCode::FAILURE);
252  }
253  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
254  return(StatusCode::SUCCESS);
255 }
256 
257 //___________________________________________________________________________
259  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
260  if (evtH->evtSeqNumber > eventNumber) {
261  ATH_MSG_ERROR("eventNumber = " << eventNumber << ", already processed");
262  return(StatusCode::FAILURE);
263  }
264  if (evtH->evtSeqNumber == 0 && evtH->fileSeqNumber == 0 && evtH->evtSize == 0) {
265  ATH_MSG_DEBUG("Server has been terminated");
266  return(StatusCode::FAILURE);
267  }
268  if (evtH->evtSeqNumber != eventNumber || evtH->evtProcessStatus != ShareEventHeader::FILLED) {
269  ATH_MSG_DEBUG("Waiting for lockEvent, eventNumber = " << eventNumber);
270  return(StatusCode::RECOVERABLE);
271  }
272  if (evtH->fileSeqNumber != m_fileSeqNumber && m_fileSeqNumber > 0) {
273  FileIncident endFileIncident(name(), "EndInputFile", "SHM");
274  m_incidentSvc->fireIncident(endFileIncident);
275  const_cast<AthenaSharedMemoryTool*>(this)->m_fileSeqNumber = evtH->fileSeqNumber;
276  FileIncident beginFileIncident(name(), "BeginInputFile", "SHM");
277  m_incidentSvc->fireIncident(beginFileIncident);
278  }
279  ATH_MSG_DEBUG("Locking eventNumber = " << eventNumber);
280  evtH->evtProcessStatus = ShareEventHeader::LOCKED;
281  return(StatusCode::SUCCESS);
282 }
283 
284 //___________________________________________________________________________
285 StatusCode AthenaSharedMemoryTool::putObject(const void* source, size_t nbytes, int num) {
286  if (nbytes > m_maxSize) {
287  ATH_MSG_ERROR("Object size = " << nbytes << " greater than maximum for client = " << num);
288  return(StatusCode::FAILURE);
289  }
290  void* status = static_cast<char*>(m_status->get_address()) + num * sizeof(ShareEventHeader);
291  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
292  ShareEventHeader::ProcessStatus evtStatus = evtH->evtProcessStatus; // read only once
293  if (evtStatus != ShareEventHeader::CLEARED) {
294  ATH_MSG_DEBUG("Waiting for CLEARED putObject, client = " << num << ", in state " << evtStatus);
295  return(StatusCode::RECOVERABLE);
296  }
297  if (source == nullptr) {
298  evtH->evtSize = evtH->evtOffset;
299  evtH->evtOffset = 0;
300  m_payload->flush(0 + evtH->evtOffset, evtH->evtSize);
301  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
302  evtH->evtProcessStatus = ShareEventHeader::FILLED;
303  } else {
304  if (evtH->evtOffset + sizeof(size_t) + nbytes > m_maxSize) {
305  ATH_MSG_ERROR("Object location = " << evtH->evtOffset << " greater than maximum for client = " << num);
306  return(StatusCode::FAILURE);
307  }
308  bool first = (evtH->evtOffset == 0);
309  std::memcpy(static_cast<char*>(m_payload->get_address()) + evtH->evtOffset, &nbytes, sizeof(size_t));
310  evtH->evtOffset += sizeof(size_t);
311  std::memcpy(static_cast<char*>(m_payload->get_address()) + evtH->evtOffset, source, nbytes);
312  evtH->evtOffset += nbytes;
313  if (evtH->evtSize == m_maxSize) {
314  evtH->evtSize = evtH->evtOffset;
315  }
316  if (first) {
317  evtH->evtSize = m_maxSize;
318  m_payload->flush(0, evtH->evtOffset);
319  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
320  }
321  }
322  return(StatusCode::SUCCESS);
323 }
324 
325 //___________________________________________________________________________
327  if (target == nullptr) {
328  return(StatusCode::SUCCESS);
329  }
330  void* status = static_cast<char*>(m_status->get_address()) + num * sizeof(ShareEventHeader);
331  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
332  ShareEventHeader::ProcessStatus evtStatus = evtH->evtProcessStatus; // read only once
333  size_t evtSize = evtH->evtSize; // read only once
334  if (evtStatus != ShareEventHeader::FILLED) {
335  ATH_MSG_DEBUG("Waiting for FILLED getObject, client = " << num);
336  nbytes = 0;
337  return(StatusCode::RECOVERABLE);
338  }
339  if (evtH->evtOffset < evtSize) {
340  std::memcpy(&nbytes, static_cast<char*>(m_payload->get_address()) + evtH->evtOffset, sizeof(size_t));
341  evtH->evtOffset += sizeof(size_t);
342  *target = static_cast<char*>(m_payload->get_address()) + evtH->evtOffset;
343  evtH->evtOffset += nbytes;
344  }
345  if (evtH->evtOffset == evtSize) {
346  evtH->evtOffset = 0;
347  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
348  while (evtH->evtProcessStatus != ShareEventHeader::FILLED) {
349  usleep(10);
350  }
351  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
352  }
353 
354  return(StatusCode::SUCCESS);
355 }
356 
357 //___________________________________________________________________________
358 StatusCode AthenaSharedMemoryTool::clearObject(const char** tokenString, int& num) {
359  if (m_isClient) {
360  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(m_status->get_address());
361  if (evtH->evtProcessStatus != ShareEventHeader::CLEARED) {
362  ATH_MSG_DEBUG("Waiting for FILL clearObject");
363  return(StatusCode::RECOVERABLE);
364  }
365  *tokenString = evtH->token;
366  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
367  return(StatusCode::SUCCESS);
368  }
369 
370  for (int i = 1; i <= m_num; i++) { // FIXME: PvG, do round robin
371  void* status = static_cast<char*>(m_status->get_address()) + i * sizeof(ShareEventHeader);
372  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
373  ShareEventHeader::ProcessStatus evtStatus = evtH->evtProcessStatus; // read only once
374  if (evtStatus == ShareEventHeader::FILLED) {
375  ATH_MSG_DEBUG("Waiting for UNFILL clearObject, client = " << i);
376  return(StatusCode::RECOVERABLE);
377  } else if (i == num && evtStatus != ShareEventHeader::LOCKED) {
378  ATH_MSG_DEBUG("Waiting for LOCK clearObject, client = " << i);
379  return(StatusCode::RECOVERABLE);
380  }
381  if (m_lastClient < 0 || m_lastClient == i) { // If Writer is not yet released, only consider last client
382  if ((i == num || num < 0) && evtStatus == ShareEventHeader::LOCKED) {
383  *tokenString = evtH->token;
384  num = i;
385  ATH_MSG_DEBUG("Setting LOCK clearObject, for client = " << num << ": " << evtH->token);
386  m_lastClient = -1;
387  // break;
388  }
389  }
390  }
391 
392  if (num > 0 && *tokenString != nullptr) {
393  m_lastClient = -1; // Release Writer from last client
394  void* status = static_cast<char*>(m_status->get_address()) + num * sizeof(ShareEventHeader);
395  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
396  if (strncmp(*tokenString, "wait", 4) == 0) {
397  ATH_MSG_INFO("Server clearObject() got wait, client = " << num);
398  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
399  m_lastClient = num; // Keep Writer allocated
400  num = -1;
401  return(StatusCode::SUCCESS);
402  }
403  if (strncmp(*tokenString, "release", 7) == 0) {
404  ATH_MSG_INFO("Server clearObject() got release, client = " << num);
405  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
406  num = -1;
407  return(StatusCode::SUCCESS);
408  }
409  if (strncmp(*tokenString, "start", 5) == 0) {
410  ATH_MSG_INFO("Server clearObject() got start, client = " << num << ", of " << m_num - 1);
411  if (m_dataClients.empty()) { // Annouce all workers to prevent early writer termination
412  for (int i = 1; i < m_num - 1; i++) m_dataClients.insert(i);
413  }
414  m_dataClients.insert(num);
415  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
416  num = -1;
417  return(StatusCode::SUCCESS);
418  }
419  if (strncmp(*tokenString, "stop", 4) == 0) {
420  ATH_MSG_INFO("Server clearObject() got stop, client = " << num);
421  m_dataClients.erase(num);
422  evtH->evtProcessStatus = ShareEventHeader::UNLOCKED;
423  if (m_dataClients.empty()) {
424  ATH_MSG_INFO("Server clearObject() got stop, client ALL: " << m_num);
425  if (num == m_num - 1) { // mother process
426  return(StatusCode::SUCCESS);
427  }
428  return(StatusCode::FAILURE);
429  }
430  num = -1;
431  return(StatusCode::SUCCESS);
432  }
433  evtH->evtSize = 0;
434  m_status->flush(0, sizeof(ShareEventHeader));
435  evtH->evtProcessStatus = ShareEventHeader::CLEARED;
436  return(StatusCode::SUCCESS);
437  }
438  return(StatusCode::RECOVERABLE);
439 }
440 
441 //___________________________________________________________________________
442 StatusCode AthenaSharedMemoryTool::lockObject(const char* tokenString, int num) {
443  if (strlen(tokenString) >= maxTokenLength) {
444  ATH_MSG_ERROR("Token = " << tokenString << ", too long for AthenaSharedMemoryTool");
445  return(StatusCode::FAILURE);
446  }
447  void* status = static_cast<char*>(m_status->get_address()) + num * sizeof(ShareEventHeader);
448  ShareEventHeader* evtH = static_cast<ShareEventHeader*>(status);
449  if (evtH->evtProcessStatus != ShareEventHeader::UNLOCKED) {
450  ATH_MSG_DEBUG("Waiting for UNLOCKED lockObject: " << tokenString);
451  return(StatusCode::RECOVERABLE);
452  }
453  strncpy(evtH->token, tokenString, maxTokenLength - 1); evtH->token[maxTokenLength - 1] = 0;
454  if (m_isServer) {
455  evtH->evtSize = 0;
456  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
457  evtH->evtProcessStatus = ShareEventHeader::CLEARED;
458  } else {
459  m_status->flush(num * sizeof(ShareEventHeader), sizeof(ShareEventHeader));
460  evtH->evtProcessStatus = ShareEventHeader::LOCKED;
461  }
462  return(StatusCode::SUCCESS);
463 }
python.StoreID.UNKNOWN
int UNKNOWN
Definition: StoreID.py:16
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
AthenaSharedMemoryTool::m_isServer
bool m_isServer
Definition: AthenaSharedMemoryTool.h:71
AthenaSharedMemoryTool::clearObject
virtual StatusCode clearObject(const char **tokenString, int &num) override
Definition: AthenaSharedMemoryTool.cxx:358
python.tests.PyTestsLib.finalize
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
Definition: PyTestsLib.py:50
AthenaSharedMemoryTool::putObject
virtual StatusCode putObject(const void *source, size_t nbytes, int num=0) override
Definition: AthenaSharedMemoryTool.cxx:285
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AthenaSharedMemoryTool::m_maxDataClients
const int m_maxDataClients
Definition: AthenaSharedMemoryTool.h:64
AthenaSharedMemoryTool::~AthenaSharedMemoryTool
virtual ~AthenaSharedMemoryTool()
Destructor.
Definition: AthenaSharedMemoryTool.cxx:45
AthenaSharedMemoryTool::lockEvent
virtual StatusCode lockEvent(long eventNumber) const override
Definition: AthenaSharedMemoryTool.cxx:258
AthenaSharedMemoryTool::makeClient
virtual StatusCode makeClient(int num, std::string &streamPortSuffix) override
Definition: AthenaSharedMemoryTool.cxx:144
AthenaSharedMemoryTool::getLockedEvent
virtual StatusCode getLockedEvent(void **target, unsigned int &status) const override
Definition: AthenaSharedMemoryTool.cxx:239
AthenaSharedMemoryTool::isServer
virtual bool isServer() const override
Definition: AthenaSharedMemoryTool.cxx:139
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
AthenaSharedMemoryTool::m_lastClient
int m_lastClient
Definition: AthenaSharedMemoryTool.h:66
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::finalize
virtual StatusCode finalize() override
Definition: AthenaSharedMemoryTool.cxx:75
AthenaSharedMemoryTool::lockObject
virtual StatusCode lockObject(const char *tokenString, int num=0) override
Definition: AthenaSharedMemoryTool.cxx:442
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
AthenaSharedMemoryTool::m_isClient
bool m_isClient
Definition: AthenaSharedMemoryTool.h:72
AthenaSharedMemoryTool::initialize
virtual StatusCode initialize() override
Gaudi Service Interface method implementations:
Definition: AthenaSharedMemoryTool.cxx:49
lumiFormat.i
int i
Definition: lumiFormat.py:85
AthenaSharedMemoryTool::AthenaSharedMemoryTool
AthenaSharedMemoryTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard Service Constructor.
Definition: AthenaSharedMemoryTool.cxx:36
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_dataClients
std::set< int > m_dataClients
Definition: AthenaSharedMemoryTool.h:67
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
taskman.statusName
statusName
Definition: taskman.py:461
xAOD::eventNumber
eventNumber
Definition: EventInfo_v1.cxx:124
AthenaSharedMemoryTool::m_status
std::unique_ptr< boost::interprocess::mapped_region > m_status
Definition: AthenaSharedMemoryTool.h:69
AthenaSharedMemoryTool::stop
virtual StatusCode stop() override
Definition: AthenaSharedMemoryTool.cxx:58
trigbs_pickEvents.num
num
Definition: trigbs_pickEvents.py:76
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
AthenaSharedMemoryTool::m_maxSize
const size_t m_maxSize
Definition: AthenaSharedMemoryTool.h:63
AthenaSharedMemoryTool::m_fileSeqNumber
long m_fileSeqNumber
Definition: AthenaSharedMemoryTool.h:70
maxTokenLength
const std::size_t maxTokenLength
Definition: AthenaSharedMemoryTool.cxx:20
AthenaSharedMemoryTool::isClient
virtual bool isClient() const override
Definition: AthenaSharedMemoryTool.cxx:199
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
copySelective.target
string target
Definition: copySelective.py:37
DeMoScan.first
bool first
Definition: DeMoScan.py:536
AthenaSharedMemoryTool::makeServer
virtual StatusCode makeServer(int num, const std::string &streamPortSuffix) override
Definition: AthenaSharedMemoryTool.cxx:98
copySelective.source
string source
Definition: copySelective.py:32
AthenaSharedMemoryTool
This class provides the IPCTool for SharedMemory objects.
Definition: AthenaSharedMemoryTool.h:34
merge.status
status
Definition: merge.py:17
AthenaSharedMemoryTool::m_sharedMemory
Gaudi::Property< std::string > m_sharedMemory
Definition: AthenaSharedMemoryTool.h:61
AthenaSharedMemoryTool::getObject
virtual StatusCode getObject(void **target, size_t &nbytes, int num=0) override
Definition: AthenaSharedMemoryTool.cxx:326
AthenaSharedMemoryTool::m_num
int m_num
Definition: AthenaSharedMemoryTool.h:65
AthenaSharedMemoryTool::m_incidentSvc
ServiceHandle< IIncidentSvc > m_incidentSvc
Definition: AthenaSharedMemoryTool.h:73
AthenaSharedMemoryTool::m_payload
std::unique_ptr< boost::interprocess::mapped_region > m_payload
Definition: AthenaSharedMemoryTool.h:68