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  void dispatch(THeader& header) {
94 
95  if (header.inMask(m_sourceMask))
97  header,
98  m_userDataP));
99  };
100 
102  THeader& header) {
103 
104  if (header.inMask(m_sourceMask))
106  buffer,
107  header,
108  m_userDataP));
109  };
110 
111  TCallback callback() { return m_callback; };
112 
113 private:
114 
115  //
116  // For thread-safe dispatching
117 
118  class Dispatch {
119  public:
120 
121  Dispatch(TCallback c,
122  THeader& h,
123  void *d) :
124  m_callback(c),
125  m_exposeBuffer(false),
126  m_header(h),
127  m_userDataP(d) {};
128 
129  Dispatch(TCallback c,
131  THeader& h,
132  void *d) :
133  m_callback(c),
134  m_buffer(b),
135  m_exposeBuffer(true),
136  m_header(h),
137  m_userDataP(d) {};
138 
140  m_callback(NULL),
141  m_buffer(),
142  m_exposeBuffer(false),
143  m_header(),
144  m_userDataP(NULL) {};
145 
146  void operator() (void) {
147 
148  if (m_callback) {
149  if (m_exposeBuffer)
150  dispatchBufferReferenceTP = &m_buffer;
152  }
153  };
154 
155  private:
156 
157  TCallback m_callback;
160  THeader m_header;
161  void *m_userDataP;
162  };
163 
164  //
165  // The dispatch thread
166  //
167  // We are penalized with two memory copies of
168  // HEADER by std::deque, but the image/lidar data
169  // is zero-copy (reference-counted by BufferStream)
170 
171 #if WIN32
172  static DWORD WINAPI dispatchThread(void *argumentP) {
173 #else
174  static void *dispatchThread(void *argumentP) {
175 #endif
176 
177  Listener<THeader,TCallback> *selfP = reinterpret_cast< Listener<THeader,TCallback> * >(argumentP);
178 
179  while(selfP->m_running) {
180  try {
181  Dispatch d;
182  if (false == selfP->m_queue.wait(d))
183  break;
184  d();
185  } catch (const std::exception& e) {
186  CRL_DEBUG("exception invoking image callback: %s\n",
187  e.what());
188  } catch ( ... ) {
189  CRL_DEBUG("unknown exception invoking image callback\n");
190  }
191  };
192 
193  return NULL;
194  }
195 
196  //
197  // Set by user
198 
199  TCallback m_callback;
201  void *m_userDataP;
202 
203  //
204  // Dispatch mechanism
205 
206  volatile bool m_running;
209 };
210 
215 
216 }; // namespace details
217 }; // namespace multisense
218 }; // namespace crl
219 
220 
221 #endif // LibMultiSense_impl_listeners
d
Listener< image::Header, image::Callback > ImageListener
Definition: listeners.hh:211
CRL_THREAD_LOCAL utility::BufferStream * dispatchBufferReferenceTP
Definition: public.cc:105
Listener(TCallback c, DataSource s, void *d, uint32_t m=0)
Definition: listeners.hh:62
Listener< pps::Header, pps::Callback > PpsListener
Definition: listeners.hh:213
static void * dispatchThread(void *argumentP)
Definition: listeners.hh:174
void dispatch(THeader &header)
Definition: listeners.hh:93
void dispatch(utility::BufferStream &buffer, THeader &header)
Definition: listeners.hh:101
Definition: channel.cc:56
Listener< lidar::Header, lidar::Callback > LidarListener
Definition: listeners.hh:212
utility::Thread * m_dispatchThreadP
Definition: listeners.hh:208
#define CRL_DEBUG(fmt,...)
Definition: Exception.hh:77
Listener< imu::Header, imu::Callback > ImuListener
Definition: listeners.hh:214
Dispatch(TCallback c, THeader &h, void *d)
Definition: listeners.hh:121
utility::WaitQueue< Dispatch > m_queue
Definition: listeners.hh:207
Dispatch(TCallback c, utility::BufferStream &b, THeader &h, void *d)
Definition: listeners.hh:129


multisense_lib
Author(s):
autogenerated on Sat Apr 6 2019 02:16:46