Jpp  18.6.0-rc.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
input_channel_handler.hh
Go to the documentation of this file.
1 #ifndef INPUT_CHANNEL_HANDLER_HH
2 #define INPUT_CHANNEL_HANDLER_HH
3 
4 #include <boost/bind.hpp>
5 #include <boost/asio.hpp>
6 #include <boost/atomic.hpp>
7 
10 
11 /**
12  * \author cpellegrino
13  */
14 
16 {
17  boost::asio::ip::udp::socket m_socket;
19  FrameFarm* const m_farm;
20  boost::atomic<bool> m_paused;
21 
22  void handle(const boost::system::error_code& error, size_t size)
23  {
24  // The error_code should be handled in principle, but
25  // it is not mandatory, since all possibilities should be already
26  // handled somewhere else.
27 
28  if (size && ! m_paused)
29  {
30  m_buffer->resize(size);
32 
34  }
35 
36  m_socket.async_receive(
37  boost::asio::buffer(m_buffer->raw(), m_buffer->capacity()),
38  boost::bind(
40  this,
41  boost::asio::placeholders::error,
42  boost::asio::placeholders::bytes_transferred));
43  }
44 
45  public:
46 
47  // Receive buffer size (see SOL_SOCKET/SO_RCVBUF) set to 64MB
48  // (default between 32 and 128KB)
49  static const int recv_buf_size = 67108864;
50 
51  void pause()
52  {
53  m_paused = true;
54  }
55 
56  void cont()
57  {
58  m_paused = false;
59  }
60 
61  InChannelHandler(boost::asio::io_service& service,
62  unsigned short port,
63  FrameFarm& farm)
64  :
65  m_socket(service, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port)),
66  m_buffer(
67  InBufferCollector::getCollector().getEmptyDataGram()),
68  m_farm(&farm),
69  m_paused(false)
70  {
71  boost::asio::ip::udp::socket::receive_buffer_size option(recv_buf_size);
72  m_socket.set_option(option);
73  handle(boost::system::error_code(), 0);
74  }
75 
77  {
79  }
80 };
81 
82 #endif // INPUT_CHANNEL_HANDLER_HH
boost::asio::ip::udp::socket m_socket
size_t capacity() const
Definition: clb_datagram.hh:75
void handle(const boost::system::error_code &error, size_t size)
FrameFarm *const m_farm
void putDataGram(CLBDataGram *p)
void resize(size_t s)
Definition: clb_datagram.hh:54
static const int recv_buf_size
InChannelHandler(boost::asio::io_service &service, unsigned short port, FrameFarm &farm)
char * raw()
Definition: clb_datagram.hh:65
bool insert(CLBDataGram *datagram)
Definition: frame_farm.cc:100
CLBDataGram * getEmptyDataGram()
static InBufferCollector & getCollector()
boost::atomic< bool > m_paused