Jpp
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 32MB
48  // (default between 32 and 128KB)
49  static const int recv_buf_size = 33554432;
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
InChannelHandler
Definition: input_channel_handler.hh:15
InBufferCollector::putDataGram
void putDataGram(CLBDataGram *p)
Definition: input_buffer_collector.hh:53
InChannelHandler::cont
void cont()
Definition: input_channel_handler.hh:56
InBufferCollector
Definition: input_buffer_collector.hh:14
InChannelHandler::m_socket
boost::asio::ip::udp::socket m_socket
Definition: input_channel_handler.hh:17
frame_farm.hh
CLBDataGram::resize
void resize(size_t s)
Definition: clb_datagram.hh:54
InChannelHandler::m_farm
FrameFarm *const m_farm
Definition: input_channel_handler.hh:19
InChannelHandler::InChannelHandler
InChannelHandler(boost::asio::io_service &service, unsigned short port, FrameFarm &farm)
Definition: input_channel_handler.hh:61
InBufferCollector::getEmptyDataGram
CLBDataGram * getEmptyDataGram()
Definition: input_buffer_collector.hh:34
CLBDataGram::capacity
size_t capacity() const
Definition: clb_datagram.hh:75
InChannelHandler::pause
void pause()
Definition: input_channel_handler.hh:51
InChannelHandler::~InChannelHandler
~InChannelHandler()
Definition: input_channel_handler.hh:76
InChannelHandler::handle
void handle(const boost::system::error_code &error, size_t size)
Definition: input_channel_handler.hh:22
CLBDataGram::raw
char * raw()
Definition: clb_datagram.hh:65
FrameFarm::insert
bool insert(CLBDataGram *datagram)
Definition: frame_farm.cc:98
InChannelHandler::recv_buf_size
static const int recv_buf_size
Definition: input_channel_handler.hh:49
CLBDataGram
Definition: clb_datagram.hh:15
InChannelHandler::m_buffer
CLBDataGram * m_buffer
Definition: input_channel_handler.hh:18
input_buffer_collector.hh
FrameFarm
Definition: frame_farm.hh:23
InBufferCollector::getCollector
static InBufferCollector & getCollector()
Definition: input_buffer_collector.hh:27
InChannelHandler::m_paused
boost::atomic< bool > m_paused
Definition: input_channel_handler.hh:20