Belle II Software  release-05-01-25
RunInfoBuffer.cc
1 #include "daq/slc/readout/RunInfoBuffer.h"
2 
3 #include <daq/slc/system/LogFile.h>
4 #include <daq/slc/system/LockGuard.h>
5 
6 #include <cstring>
7 #include <cstdlib>
8 
9 using namespace Belle2;
10 
11 size_t RunInfoBuffer::size()
12 {
13  return m_mutex.size() + m_cond.size() +
14  sizeof(ronode_info);
15 }
16 
17 bool RunInfoBuffer::open(const std::string& nodename,
18  int nodeid, bool recreate)
19 {
20  m_nodename = nodename;
21  std::string username = getenv("USER");
22  m_path = "/run_info_" + username + "_" + nodename;
23  if (!m_memory.open(m_path, size())) {
24  perror("shm_open");
25  LogFile::fatal("Failed to open %s", m_path.c_str());
26  return false;
27  }
28  char* buf = (char*)m_memory.map(0, size());
29  if (buf == NULL) {
30  return false;
31  }
32  m_mutex = MMutex(buf);
33  buf += m_mutex.size();
34  m_cond = MCond(buf);
35  buf += m_cond.size();
36  m_info = (ronode_info*)buf;
37  if (recreate) init();
38  if (nodeid > 0) setNodeId(nodeid);
39  return true;
40 }
41 
42 bool RunInfoBuffer::init()
43 {
44  if (m_info == NULL) return false;
45  m_mutex.init();
46  m_cond.init();
47  memset(m_info, 0, sizeof(ronode_info));
48  LogFile::debug("Initialized %s", m_path.c_str());
49  return true;
50 }
51 
52 void RunInfoBuffer::clear()
53 {
54  if (m_info == NULL) return;
55  MLockGuard lockGuard(m_mutex);
56  memset(m_info, 0, sizeof(ronode_info));
57 }
58 
59 bool RunInfoBuffer::close()
60 {
61  m_memory.close();
62  return true;
63 }
64 
65 bool RunInfoBuffer::unlink()
66 {
67  m_memory.unlink();
68  m_memory.close();
69  return true;
70 }
71 
72 bool RunInfoBuffer::lock()
73 {
74  if (m_info == NULL) return false;
75  return m_mutex.lock();
76 }
77 
78 bool RunInfoBuffer::unlock()
79 {
80  if (m_info == NULL) return false;
81  return m_mutex.unlock();
82 }
83 
84 bool RunInfoBuffer::wait()
85 {
86  if (m_info == NULL) return false;
87  return m_cond.wait(m_mutex);
88 }
89 
90 bool RunInfoBuffer::wait(int time)
91 {
92  if (m_info == NULL) return false;
93  return m_cond.wait(m_mutex, time, 0);
94 }
95 
96 bool RunInfoBuffer::notify()
97 {
98  if (m_info == NULL) return false;
99  return m_cond.broadcast();
100 }
101 
102 bool RunInfoBuffer::waitRunning(int timeout)
103 {
104  if (m_info == NULL) return false;
105  MLockGuard lockGuard(m_mutex);
106  if (getState() != RunInfoBuffer::RUNNING) {
107  if (!wait(timeout)) {
108  return false;
109  }
110  }
111  return true;
112 }
113 
114 bool RunInfoBuffer::waitReady(int timeout)
115 {
116  if (m_info == NULL) return false;
117  MLockGuard lockGuard(m_mutex);
118  if (getState() != RunInfoBuffer::READY &&
119  getState() != RunInfoBuffer::RUNNING) {
120  if (!wait(timeout)) {
121  if (getState() != RunInfoBuffer::READY &&
122  getState() != RunInfoBuffer::RUNNING) {
123  return false;
124  }
125  }
126  }
127  return true;
128 }
129 
130 bool RunInfoBuffer::reportRunning()
131 {
132  if (m_info == NULL) return false;
133  MLockGuard lockGuard(m_mutex);
134  setState(RunInfoBuffer::RUNNING);
135  notify();
136  return true;
137 }
138 
139 bool RunInfoBuffer::reportError(EFlag eflag)
140 {
141  if (m_info == NULL) return false;
142  MLockGuard lockGuard(m_mutex);
143  setErrorFlag(eflag);
144  notify();
145  return true;
146 }
147 
148 bool RunInfoBuffer::reportReady()
149 {
150  if (m_info == NULL) return false;
151  MLockGuard lockGuard(m_mutex);
152  setState(RunInfoBuffer::READY);
153  notify();
154  return true;
155 }
156 
157 bool RunInfoBuffer::reportNotReady()
158 {
159  if (m_info == NULL) return false;
160  MLockGuard lockGuard(m_mutex);
161  setState(RunInfoBuffer::NOTREADY);
162  notify();
163  return true;
164 }
165 
166 void RunInfoBuffer::copyEventHeader(int* buf)
167 {
168  if (m_info == NULL) return;
169  memcpy(&(m_info->header), buf, sizeof(event_header));
170 }
Belle2::event_header
Definition: ronode_info.h:12
Belle2::MMutex
Definition: MMutex.h:19
Belle2::GenericLockGuard
Lock Guard for a Mutex instance.
Definition: LockGuard.h:40
Belle2::MCond
Definition: MCond.h:14
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::ronode_info
Definition: ronode_info.h:23