fix read buffer bug in udp_socket

This commit is contained in:
Arvid Norberg 2011-01-19 07:16:45 +00:00
parent ba0aed2282
commit 35aaec3b38
2 changed files with 34 additions and 17 deletions

View File

@ -147,7 +147,7 @@ namespace libtorrent
void wrap(char const* hostname, int port, char const* p, int len, error_code& ec); void wrap(char const* hostname, int port, char const* p, int len, error_code& ec);
void unwrap(error_code const& e, char const* buf, int size); void unwrap(error_code const& e, char const* buf, int size);
void maybe_realloc_buffers(); void maybe_realloc_buffers(int which = 3);
#ifdef TORRENT_DEBUG #ifdef TORRENT_DEBUG
#if defined BOOST_HAS_PTHREADS #if defined BOOST_HAS_PTHREADS
@ -168,12 +168,22 @@ namespace libtorrent
udp::endpoint m_v4_ep; udp::endpoint m_v4_ep;
int m_v4_buf_size; int m_v4_buf_size;
char* m_v4_buf; char* m_v4_buf;
// this is set to true to indicate that the
// m_v4_buf should be reallocated to the size
// of the buffer size members the next time their
// read handler gets triggered
bool m_reallocate_buffer4;
#if TORRENT_USE_IPV6 #if TORRENT_USE_IPV6
udp::socket m_ipv6_sock; udp::socket m_ipv6_sock;
udp::endpoint m_v6_ep; udp::endpoint m_v6_ep;
int m_v6_buf_size; int m_v6_buf_size;
char* m_v6_buf; char* m_v6_buf;
// this is set to true to indicate that the
// m_v6_buf should be reallocated to the size
// of the buffer size members the next time their
// read handler gets triggered
bool m_reallocate_buffer6;
#endif #endif
int m_bind_port; int m_bind_port;
@ -188,11 +198,6 @@ namespace libtorrent
bool m_queue_packets; bool m_queue_packets;
bool m_tunnel_packets; bool m_tunnel_packets;
bool m_abort; bool m_abort;
// this is set to true to indicate that the m_v4_buf
// and m_v6_buf should be reallocated to the size
// of the buffer size members the next time their
// read handler gets triggered
bool m_reallocate_buffers;
udp::endpoint m_proxy_addr; udp::endpoint m_proxy_addr;
// while we're connecting to the proxy // while we're connecting to the proxy
// we have to queue the packets, we'll flush // we have to queue the packets, we'll flush

View File

@ -61,10 +61,12 @@ udp_socket::udp_socket(asio::io_service& ios
, m_ipv4_sock(ios) , m_ipv4_sock(ios)
, m_v4_buf_size(0) , m_v4_buf_size(0)
, m_v4_buf(0) , m_v4_buf(0)
, m_reallocate_buffer4(false)
#if TORRENT_USE_IPV6 #if TORRENT_USE_IPV6
, m_ipv6_sock(ios) , m_ipv6_sock(ios)
, m_v6_buf_size(0) , m_v6_buf_size(0)
, m_v6_buf(0) , m_v6_buf(0)
, m_reallocate_buffer6(false)
#endif #endif
, m_bind_port(0) , m_bind_port(0)
, m_outstanding(0) , m_outstanding(0)
@ -75,7 +77,6 @@ udp_socket::udp_socket(asio::io_service& ios
, m_queue_packets(false) , m_queue_packets(false)
, m_tunnel_packets(false) , m_tunnel_packets(false)
, m_abort(false) , m_abort(false)
, m_reallocate_buffers(false)
{ {
#ifdef TORRENT_DEBUG #ifdef TORRENT_DEBUG
m_magic = 0x1337; m_magic = 0x1337;
@ -184,16 +185,20 @@ void udp_socket::send(udp::endpoint const& ep, char const* p, int len, error_cod
#endif #endif
} }
void udp_socket::maybe_realloc_buffers() void udp_socket::maybe_realloc_buffers(int which)
{ {
if (m_reallocate_buffers) if (m_reallocate_buffer4 && (which & 1))
{ {
m_v4_buf = (char*)realloc(m_v4_buf, m_v4_buf_size); m_v4_buf = (char*)realloc(m_v4_buf, m_v4_buf_size);
#if TORRENT_USE_IPV6 m_reallocate_buffer4 = false;
m_v6_buf = (char*)realloc(m_v6_buf, m_v6_buf_size);
#endif
m_reallocate_buffers = false;
} }
#if TORRENT_USE_IPV6
if (m_reallocate_buffer6 && (which & 2))
{
m_v6_buf = (char*)realloc(m_v6_buf, m_v6_buf_size);
m_reallocate_buffer6 = false;
}
#endif
} }
void udp_socket::on_read(udp::socket* s, error_code const& e, std::size_t bytes_transferred) void udp_socket::on_read(udp::socket* s, error_code const& e, std::size_t bytes_transferred)
@ -221,6 +226,12 @@ void udp_socket::on_read(udp::socket* s, error_code const& e, std::size_t bytes_
CHECK_MAGIC; CHECK_MAGIC;
if (!m_callback) return; if (!m_callback) return;
#if TORRENT_USE_IPV6
int which = (s == &m_ipv4_sock) ? 1 : 2;
#else
int which = 1;
#endif
if (e) if (e)
{ {
#ifndef BOOST_NO_EXCEPTIONS #ifndef BOOST_NO_EXCEPTIONS
@ -259,7 +270,7 @@ void udp_socket::on_read(udp::socket* s, error_code const& e, std::size_t bytes_
if (m_abort) return; if (m_abort) return;
maybe_realloc_buffers(); maybe_realloc_buffers(which);
#if defined TORRENT_ASIO_DEBUGGING #if defined TORRENT_ASIO_DEBUGGING
add_outstanding_async("udp_socket::on_read"); add_outstanding_async("udp_socket::on_read");
@ -308,7 +319,7 @@ void udp_socket::on_read(udp::socket* s, error_code const& e, std::size_t bytes_
if (m_abort) return; if (m_abort) return;
maybe_realloc_buffers(); maybe_realloc_buffers(which);
#if defined TORRENT_ASIO_DEBUGGING #if defined TORRENT_ASIO_DEBUGGING
add_outstanding_async("udp_socket::on_read"); add_outstanding_async("udp_socket::on_read");
@ -340,7 +351,7 @@ void udp_socket::on_read(udp::socket* s, error_code const& e, std::size_t bytes_
if (m_abort) return; if (m_abort) return;
maybe_realloc_buffers(); maybe_realloc_buffers(which);
#if defined TORRENT_ASIO_DEBUGGING #if defined TORRENT_ASIO_DEBUGGING
add_outstanding_async("udp_socket::on_read"); add_outstanding_async("udp_socket::on_read");
@ -505,10 +516,11 @@ void udp_socket::set_buf_size(int s)
if (s > m_v4_buf_size) if (s > m_v4_buf_size)
{ {
m_v4_buf_size = s; m_v4_buf_size = s;
m_reallocate_buffer4 = true;
#if TORRENT_USE_IPV6 #if TORRENT_USE_IPV6
m_v6_buf_size = s; m_v6_buf_size = s;
m_reallocate_buffer6 = true;
#endif #endif
m_reallocate_buffers = true;
} }
} }