increase the maximum buffer size on bottled http_requests

This commit is contained in:
Marcos Pinto 2007-09-11 22:37:58 +00:00
parent f4bd67c320
commit 63501ebe5b
4 changed files with 32 additions and 17 deletions

View File

@ -201,7 +201,8 @@ namespace libtorrent
void async_read( void async_read(
peer_request const& r peer_request const& r
, boost::function<void(int, disk_io_job const&)> const& handler); , boost::function<void(int, disk_io_job const&)> const& handler
, char* buffer = 0);
void async_write( void async_write(
peer_request const& r peer_request const& r

View File

@ -179,29 +179,35 @@ namespace libtorrent
int ret = 0; int ret = 0;
bool free_buffer = true;
try try
{ {
// std::cerr << "DISK THREAD: executing job: " << j.action << std::endl; // std::cerr << "DISK THREAD: executing job: " << j.action << std::endl;
switch (j.action) switch (j.action)
{ {
case disk_io_job::read: case disk_io_job::read:
if (j.buffer == 0)
{
l.lock(); l.lock();
j.buffer = (char*)m_pool.ordered_malloc(); j.buffer = (char*)m_pool.ordered_malloc();
l.unlock(); l.unlock();
assert(j.buffer_size <= m_block_size);
if (j.buffer == 0) if (j.buffer == 0)
{ {
ret = -1; ret = -1;
j.str = "out of memory"; j.str = "out of memory";
break;
}
} }
else else
{ {
assert(j.buffer_size <= m_block_size); free_buffer = false;
}
ret = j.storage->read_impl(j.buffer, j.piece, j.offset ret = j.storage->read_impl(j.buffer, j.piece, j.offset
, j.buffer_size); , j.buffer_size);
// simulates slow drives // simulates slow drives
// usleep(300); // usleep(300);
}
break; break;
case disk_io_job::write: case disk_io_job::write:
assert(j.buffer); assert(j.buffer);
@ -240,7 +246,7 @@ namespace libtorrent
try { if (handler) handler(ret, j); } try { if (handler) handler(ret, j); }
catch (std::exception&) {} catch (std::exception&) {}
if (j.buffer) if (j.buffer && free_buffer)
{ {
l.lock(); l.lock();
m_pool.ordered_free(j.buffer); m_pool.ordered_free(j.buffer);
@ -249,3 +255,4 @@ namespace libtorrent
} }
} }

View File

@ -42,6 +42,8 @@ using boost::bind;
namespace libtorrent namespace libtorrent
{ {
enum { max_bottled_buffer = 1024 * 1024 };
void http_connection::get(std::string const& url, time_duration timeout void http_connection::get(std::string const& url, time_duration timeout
, bool handle_redirect) , bool handle_redirect)
{ {
@ -311,8 +313,8 @@ void http_connection::on_read(asio::error_code const& e
} }
if (int(m_recvbuffer.size()) == m_read_pos) if (int(m_recvbuffer.size()) == m_read_pos)
m_recvbuffer.resize((std::min)(m_read_pos + 2048, 1024*500)); m_recvbuffer.resize((std::min)(m_read_pos + 2048, int(max_bottled_buffer)));
if (m_read_pos == 1024 * 500) if (m_read_pos == max_bottled_buffer)
{ {
close(); close();
if (m_bottled && m_called) return; if (m_bottled && m_called) return;
@ -383,3 +385,4 @@ void http_connection::rate_limit(int limit)
} }

View File

@ -1083,7 +1083,8 @@ namespace libtorrent
void piece_manager::async_read( void piece_manager::async_read(
peer_request const& r peer_request const& r
, boost::function<void(int, disk_io_job const&)> const& handler) , boost::function<void(int, disk_io_job const&)> const& handler
, char* buffer)
{ {
disk_io_job j; disk_io_job j;
j.storage = this; j.storage = this;
@ -1091,7 +1092,10 @@ namespace libtorrent
j.piece = r.piece; j.piece = r.piece;
j.offset = r.start; j.offset = r.start;
j.buffer_size = r.length; j.buffer_size = r.length;
assert(r.length <= 16 * 1024); j.buffer = buffer;
// if a buffer is not specified, only one block can be read
// since that is the size of the pool allocator's buffers
assert(r.length <= 16 * 1024 || buffer != 0);
m_io_thread.add_job(j, handler); m_io_thread.add_job(j, handler);
} }