use handler allocator for UDP socket read handler

This commit is contained in:
arvidn 2015-09-01 00:20:55 -04:00
parent 915e56022b
commit 3ccb4f7dca
4 changed files with 34 additions and 5 deletions

View File

@ -1,6 +1,6 @@
/*
Copyright (c) 2015, Arvid Norberg
Copyright (c) 2015, Arvid Norberg, Daniel Wallin
All rights reserved.
Redistribution and use in source and binary forms, with or without
@ -97,6 +97,11 @@ namespace libtorrent { namespace aux
handler(std::forward<A>(a)...);
}
#else
void operator()() const
{
handler();
}
template <class A0>
void operator()(A0 const& a0) const
{

View File

@ -983,7 +983,7 @@ namespace libtorrent
// have sent to it
int m_outstanding_bytes;
// TODO: 3 use handler storage for second_tick and udp_packet handler too
// TODO: 3 use handler storage for second_tick too
aux::handler_storage<TORRENT_READ_HANDLER_MAX_SIZE> m_read_handler_storage;
aux::handler_storage<TORRENT_WRITE_HANDLER_MAX_SIZE> m_write_handler_storage;

View File

@ -41,6 +41,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/thread.hpp"
#include "libtorrent/deadline_timer.hpp"
#include "libtorrent/debug.hpp"
#include "libtorrent/aux_/allocating_handler.hpp"
#include <deque>
@ -175,6 +176,29 @@ namespace libtorrent
udp_socket(udp_socket const&);
udp_socket& operator=(udp_socket const&);
template <class Handler>
aux::allocating_handler<Handler, TORRENT_READ_HANDLER_MAX_SIZE>
make_read_handler(udp::socket* s, Handler const& handler)
{
#if TORRENT_USE_IPV6
if (s == &m_ipv6_sock)
{
return aux::allocating_handler<Handler, TORRENT_READ_HANDLER_MAX_SIZE>(
handler, m_read6_handler_storage);
}
#endif
else
{
return aux::allocating_handler<Handler, TORRENT_READ_HANDLER_MAX_SIZE>(
handler, m_read4_handler_storage);
}
}
aux::handler_storage<TORRENT_READ_HANDLER_MAX_SIZE> m_read4_handler_storage;
#if TORRENT_USE_IPV6
aux::handler_storage<TORRENT_READ_HANDLER_MAX_SIZE> m_read6_handler_storage;
#endif
// observers on this udp socket
std::vector<udp_socket_observer*> m_observers;
std::vector<udp_socket_observer*> m_added_observers;

View File

@ -501,7 +501,7 @@ void udp_socket::setup_read(udp::socket* s)
TORRENT_TRY
{
s->async_receive_from(null_buffers()
, ep, boost::bind(&udp_socket::on_read, this, _1, s));
, ep, make_read_handler(s, boost::bind(&udp_socket::on_read, this, _1, s)));
}
TORRENT_CATCH(boost::system::system_error& e)
{
@ -510,8 +510,8 @@ void udp_socket::setup_read(udp::socket* s)
error_code ec;
boost::system::system_error e(ec);
#endif
get_io_service().post(boost::bind(&udp_socket::on_read
, this, e.code(), s));
get_io_service().post(make_read_handler(s, boost::bind(&udp_socket::on_read
, this, e.code(), s)));
}
}