listeners.hh
Go to the documentation of this file.
1 
37 #ifndef LibMultiSense_impl_listeners
38 #define LibMultiSense_impl_listeners
39 
40 #include "MultiSenseTypes.hh"
41 
44 
45 namespace crl {
46 namespace multisense {
47 namespace details {
48 
49 //
50 // For access to a buffer back-end in a dispatch thread
51 
52 extern CRL_THREAD_LOCAL utility::BufferStream *dispatchBufferReferenceTP;
53 
54 //
55 // The dispatch mechanism. Each instance represents a bound
56 // listener to a datum stream.
57 
58 template<class THeader, class TCallback>
59 class Listener {
60 public:
61 
62  Listener(TCallback c,
63  DataSource s,
64  void *d,
65  uint32_t m=0)
66  : m_callback(c),
67  m_sourceMask(s),
68  m_userDataP(d),
69  m_running(false),
70  m_queue(m),
71  m_dispatchThreadP(NULL) {
72 
73  m_running = true;
75  };
76 
78  m_callback(NULL),
79  m_sourceMask(0),
80  m_userDataP(NULL),
81  m_running(false),
82  m_queue(),
83  m_dispatchThreadP(NULL) {};
84 
86  if (m_running) {
87  m_running = false;
88  m_queue.kick();
89  delete m_dispatchThreadP;
90  }
91  };
92 
93  #if __cplusplus > 199711L
94  Listener(Listener const&) = default;
95  Listener(Listener &&) = default;
96  Listener& operator=(Listener const&) = default;
97  Listener& operator=(Listener &&) = default;
98  #endif
99 
100  void dispatch(THeader& header) {
101 
102  if (header.inMask(m_sourceMask))
104  header,
105  m_userDataP));
106  };
107 
109  THeader& header) {
110 
111  if (header.inMask(m_sourceMask))
113  buffer,
114  header,
115  m_userDataP));
116  };
117 
118  TCallback callback() { return m_callback; };
119 
120 private:
121 
122  //
123  // For thread-safe dispatching
124 
125  class Dispatch {
126  public:
127 
128  Dispatch(TCallback c,
129  THeader& h,
130  void *d) :
131  m_callback(c),
132  m_exposeBuffer(false),
133  m_header(h),
134  m_userDataP(d) {};
135 
136  Dispatch(TCallback c,
138  THeader& h,
139  void *d) :
140  m_callback(c),
141  m_buffer(b),
142  m_exposeBuffer(true),
143  m_header(h),
144  m_userDataP(d) {};
145 
147  m_callback(NULL),
148  m_buffer(),
149  m_exposeBuffer(false),
150  m_header(),
151  m_userDataP(NULL) {};
152 
153 
154  #if __cplusplus > 199711L
155  Dispatch(Dispatch const&) = default;
156  Dispatch(Dispatch &&) = default;
157  Dispatch& operator=(Dispatch const&) = default;
158  Dispatch& operator=(Dispatch &&) = default;
159  #endif
160 
161  void operator() (void) {
162 
163  if (m_callback) {
164  if (m_exposeBuffer)
165  dispatchBufferReferenceTP = &m_buffer;
167  }
168  };
169 
170  private:
171 
172  TCallback m_callback;
175  THeader m_header;
176  void *m_userDataP;
177  };
178 
179  //
180  // The dispatch thread
181  //
182  // We are penalized with two memory copies of
183  // HEADER by std::deque, but the image/lidar data
184  // is zero-copy (reference-counted by BufferStream)
185 
186 #if WIN32
187  static DWORD WINAPI dispatchThread(void *argumentP) {
188 #else
189  static void *dispatchThread(void *argumentP) {
190 #endif
191 
192  Listener<THeader,TCallback> *selfP = reinterpret_cast< Listener<THeader,TCallback> * >(argumentP);
193 
194  while(selfP->m_running) {
195  try {
196  Dispatch d;
197  if (false == selfP->m_queue.wait(d))
198  break;
199  d();
200  } catch (const std::exception& e) {
201  CRL_DEBUG("exception invoking image callback: %s\n",
202  e.what());
203  } catch ( ... ) {
204  CRL_DEBUG_RAW("unknown exception invoking image callback\n");
205  }
206  };
207 
208  return NULL;
209  }
210 
211  //
212  // Set by user
213 
214  TCallback m_callback;
216  void *m_userDataP;
217 
218  //
219  // Dispatch mechanism
220 
221  volatile bool m_running;
224 };
225 
230 
231 } // namespace details
232 } // namespace multisense
233 } // namespace crl
234 
235 
236 #endif // LibMultiSense_impl_listeners
d
Listener< image::Header, image::Callback > ImageListener
Definition: listeners.hh:226
#define CRL_DEBUG_RAW(fmt)
Definition: Exception.hh:90
CRL_THREAD_LOCAL utility::BufferStream * dispatchBufferReferenceTP
Definition: public.cc:109
Listener(TCallback c, DataSource s, void *d, uint32_t m=0)
Definition: listeners.hh:62
Listener< pps::Header, pps::Callback > PpsListener
Definition: listeners.hh:228
static void * dispatchThread(void *argumentP)
Definition: listeners.hh:189
void dispatch(THeader &header)
Definition: listeners.hh:100
void dispatch(utility::BufferStream &buffer, THeader &header)
Definition: listeners.hh:108
Definition: channel.cc:56
Listener< lidar::Header, lidar::Callback > LidarListener
Definition: listeners.hh:227
utility::Thread * m_dispatchThreadP
Definition: listeners.hh:223
#define CRL_DEBUG(fmt,...)
Definition: Exception.hh:83
Listener< imu::Header, imu::Callback > ImuListener
Definition: listeners.hh:229
Dispatch(TCallback c, THeader &h, void *d)
Definition: listeners.hh:128
utility::WaitQueue< Dispatch > m_queue
Definition: listeners.hh:222
Dispatch(TCallback c, utility::BufferStream &b, THeader &h, void *d)
Definition: listeners.hh:136


multisense_lib
Author(s):
autogenerated on Sun Mar 14 2021 02:34:50