diff --git a/include/libtorrent/disk_io_thread.hpp b/include/libtorrent/disk_io_thread.hpp index ec93e2f25..f542cd390 100644 --- a/include/libtorrent/disk_io_thread.hpp +++ b/include/libtorrent/disk_io_thread.hpp @@ -222,8 +222,9 @@ namespace libtorrent int m_allocations; #endif #ifdef TORRENT_DISK_STATS - protected: + public: void rename_buffer(char* buf, char const* category); + protected: std::map m_categories; std::map m_buf_to_category; std::ofstream m_log; diff --git a/include/libtorrent/peer_connection.hpp b/include/libtorrent/peer_connection.hpp index ca0fd0adf..22068e7f8 100644 --- a/include/libtorrent/peer_connection.hpp +++ b/include/libtorrent/peer_connection.hpp @@ -474,6 +474,9 @@ namespace libtorrent template void append_send_buffer(char* buffer, int size, Destructor const& destructor) { +#if TORRENT_DISK_STATS + m_ses.m_disk_thread.rename_buffer(buffer, "queued send buffer"); +#endif m_send_buffer.append_buffer(buffer, size, size, destructor); #ifdef TORRENT_STATS m_ses.m_buffer_usage_logger << log_time() << " append_send_buffer: " << size << std::endl; diff --git a/parse_disk_buffer_log.py b/parse_disk_buffer_log.py index 891d67924..ca6491bfc 100755 --- a/parse_disk_buffer_log.py +++ b/parse_disk_buffer_log.py @@ -9,8 +9,12 @@ lines = open(sys.argv[1], 'rb').readlines() # example: # 16434 read cache: 17 -key_order = ['receive buffer', 'send buffer', 'write cache', 'read cache', 'hash temp'] -colors = ['30f030', 'f03030', '80f080', 'f08080', '4040ff'] +key_order = ['receive buffer', 'send buffer', 'released send buffer', 'posted send buffer', + 'received send buffer', 'dispatched send buffer', 'queued send buffer', + 'write cache', 'read cache', 'hash temp'] +colors = ['30f030', '001070', '101080', '2040a0', + '4070d0', '80a0f0', 'f03030', + '80f080', 'f08080', '4040ff'] keys = [] fields = {} @@ -45,13 +49,7 @@ for l in lines: print >>out, '%d\t' % maximum[i], print >>out, '\n', - if not c in keys: - keys.append(c) - fields[c] = 0 - maximum[c] = 0 - field_sum[c] = 0 - field_num_samples[c] = 0 - field_timestamp[c] = 0 + if not c in keys: continue field_sum[c] += fields[c] * float(t - field_timestamp[c]) field_timestamp[c] = t diff --git a/src/disk_io_thread.cpp b/src/disk_io_thread.cpp index ddc08a22d..78c7a278c 100644 --- a/src/disk_io_thread.cpp +++ b/src/disk_io_thread.cpp @@ -819,7 +819,7 @@ namespace libtorrent file::iovec_t b = { buf.get(), buffer_size }; ret = p.storage->read_impl(&b, p.piece, start_block * m_block_size, 1); l.lock(); - if (p.storage->error()) { return -1; } + if (p.storage->error()) return -1; if (ret != buffer_size) { // this means the file wasn't big enough for this read @@ -858,7 +858,7 @@ namespace libtorrent l.unlock(); ret = p.storage->read_impl(iov, p.piece, start_block * m_block_size, iov_counter); l.lock(); - if (p.storage->error()) { return -1; } + if (p.storage->error()) return -1; if (ret != buffer_size) { // this means the file wasn't big enough for this read @@ -1456,6 +1456,9 @@ namespace libtorrent TORRENT_ASSERT(j.buffer == read_holder.get()); read_holder.release(); +#if TORRENT_DISK_STATS + rename_buffer(j.buffer, "released send buffer"); +#endif break; } case disk_io_job::read: @@ -1517,6 +1520,9 @@ namespace libtorrent } TORRENT_ASSERT(j.buffer == read_holder.get()); read_holder.release(); +#if TORRENT_DISK_STATS + rename_buffer(j.buffer, "released send buffer"); +#endif break; } case disk_io_job::write: @@ -1745,6 +1751,7 @@ namespace libtorrent * (piece_size / (16 * 1024)) - total_milliseconds(now - m_last_file_check); if (sleep_time < 0) sleep_time = 0; + TORRENT_ASSERT(sleep_time < 5 * 1000); boost::thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(sleep_time)); @@ -1824,6 +1831,11 @@ namespace libtorrent #endif TORRENT_ASSERT(ret != -2 || !j.str.empty() || j.action == disk_io_job::hash); +#if TORRENT_DISK_STATS + if ((j.action == disk_io_job::read || j.action == disk_io_job::read_and_hash) + && j.buffer != 0) + rename_buffer(j.buffer, "posted send buffer"); +#endif post_callback(handler, j, ret); #ifndef BOOST_NO_EXCEPTIONS } catch (std::exception&) diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index 53eeb96ba..651c7f0f7 100644 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -3510,6 +3510,9 @@ namespace libtorrent m_reading_bytes -= r.length; disk_buffer_holder buffer(m_ses, j.buffer); +#if TORRENT_DISK_STATS + m_ses.m_disk_thread.rename_buffer(j.buffer, "received send buffer"); +#endif boost::shared_ptr t = m_torrent.lock(); if (ret != r.length || m_torrent.expired()) @@ -3547,6 +3550,9 @@ namespace libtorrent << " | l: " << r.length << " ]\n"; #endif +#if TORRENT_DISK_STATS + m_ses.m_disk_thread.rename_buffer(j.buffer, "dispatched send buffer"); +#endif write_piece(r, buffer); setup_send(); }