forked from premiere/premiere-libtorrent
optimized disk cache flushing a bit
This commit is contained in:
parent
4c45d84160
commit
7e3f69ecbf
|
@ -344,6 +344,8 @@ namespace libtorrent
|
||||||
ptime expire;
|
ptime expire;
|
||||||
// the number of blocks in the cache for this piece
|
// the number of blocks in the cache for this piece
|
||||||
int num_blocks;
|
int num_blocks;
|
||||||
|
// used to determine if this piece should be flushed
|
||||||
|
int num_contiguous_blocks;
|
||||||
// the pointers to the block data
|
// the pointers to the block data
|
||||||
boost::shared_array<cached_block_entry> blocks;
|
boost::shared_array<cached_block_entry> blocks;
|
||||||
|
|
||||||
|
|
|
@ -639,8 +639,8 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
cache_lru_index_t::iterator i =
|
cache_lru_index_t::iterator i =
|
||||||
std::max_element(idx.begin(), idx.end()
|
std::max_element(idx.begin(), idx.end()
|
||||||
, boost::bind(&contiguous_blocks, _1)
|
, boost::bind(&disk_io_thread::cached_piece_entry::num_contiguous_blocks, _1)
|
||||||
< boost::bind(&contiguous_blocks, _2));
|
< boost::bind(&disk_io_thread::cached_piece_entry::num_contiguous_blocks, _2));
|
||||||
if (i == idx.end()) return ret;
|
if (i == idx.end()) return ret;
|
||||||
tmp = flush_contiguous_blocks(const_cast<cached_piece_entry&>(*i), l);
|
tmp = flush_contiguous_blocks(const_cast<cached_piece_entry&>(*i), l);
|
||||||
if (i->num_blocks == 0) idx.erase(i);
|
if (i->num_blocks == 0) idx.erase(i);
|
||||||
|
@ -758,6 +758,7 @@ namespace libtorrent
|
||||||
if (num_write_calls > 0)
|
if (num_write_calls > 0)
|
||||||
{
|
{
|
||||||
m_write_time.add_sample(total_microseconds(done - write_start) / num_write_calls);
|
m_write_time.add_sample(total_microseconds(done - write_start) / num_write_calls);
|
||||||
|
p.num_contiguous_blocks = contiguous_blocks(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_ASSERT(buffer_size == 0);
|
TORRENT_ASSERT(buffer_size == 0);
|
||||||
|
@ -795,6 +796,7 @@ namespace libtorrent
|
||||||
p.storage = j.storage;
|
p.storage = j.storage;
|
||||||
p.expire = time_now() + seconds(j.cache_min_time);
|
p.expire = time_now() + seconds(j.cache_min_time);
|
||||||
p.num_blocks = 1;
|
p.num_blocks = 1;
|
||||||
|
p.num_contiguous_blocks = 1;
|
||||||
p.blocks.reset(new (std::nothrow) cached_block_entry[blocks_in_piece]);
|
p.blocks.reset(new (std::nothrow) cached_block_entry[blocks_in_piece]);
|
||||||
if (!p.blocks) return -1;
|
if (!p.blocks) return -1;
|
||||||
int block = j.offset / m_block_size;
|
int block = j.offset / m_block_size;
|
||||||
|
@ -979,6 +981,7 @@ namespace libtorrent
|
||||||
p.storage = j.storage;
|
p.storage = j.storage;
|
||||||
p.expire = time_now() + seconds(j.cache_min_time);
|
p.expire = time_now() + seconds(j.cache_min_time);
|
||||||
p.num_blocks = 0;
|
p.num_blocks = 0;
|
||||||
|
p.num_contiguous_blocks = 0;
|
||||||
p.blocks.reset(new (std::nothrow) cached_block_entry[blocks_in_piece]);
|
p.blocks.reset(new (std::nothrow) cached_block_entry[blocks_in_piece]);
|
||||||
if (!p.blocks) return -1;
|
if (!p.blocks) return -1;
|
||||||
|
|
||||||
|
@ -1000,6 +1003,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
cached_piece_entry const& p = *i;
|
cached_piece_entry const& p = *i;
|
||||||
TORRENT_ASSERT(p.blocks);
|
TORRENT_ASSERT(p.blocks);
|
||||||
|
TORRENT_ASSERT(p.num_contiguous_blocks == contiguous_blocks(p));
|
||||||
|
|
||||||
TORRENT_ASSERT(p.storage);
|
TORRENT_ASSERT(p.storage);
|
||||||
int piece_size = p.storage->info()->piece_size(p.piece);
|
int piece_size = p.storage->info()->piece_size(p.piece);
|
||||||
|
@ -1100,6 +1104,7 @@ namespace libtorrent
|
||||||
pe.storage = j.storage;
|
pe.storage = j.storage;
|
||||||
pe.expire = time_now() + seconds(j.cache_min_time);
|
pe.expire = time_now() + seconds(j.cache_min_time);
|
||||||
pe.num_blocks = 0;
|
pe.num_blocks = 0;
|
||||||
|
pe.num_contiguous_blocks = 0;
|
||||||
pe.blocks.reset(new (std::nothrow) cached_block_entry[blocks_in_piece]);
|
pe.blocks.reset(new (std::nothrow) cached_block_entry[blocks_in_piece]);
|
||||||
if (!pe.blocks) return -1;
|
if (!pe.blocks) return -1;
|
||||||
ret = read_into_piece(pe, 0, options, INT_MAX, l);
|
ret = read_into_piece(pe, 0, options, INT_MAX, l);
|
||||||
|
@ -2048,8 +2053,11 @@ namespace libtorrent
|
||||||
int block = j.offset / m_block_size;
|
int block = j.offset / m_block_size;
|
||||||
TORRENT_ASSERT(j.buffer);
|
TORRENT_ASSERT(j.buffer);
|
||||||
TORRENT_ASSERT(j.buffer_size <= m_block_size);
|
TORRENT_ASSERT(j.buffer_size <= m_block_size);
|
||||||
|
int piece_size = j.storage->info()->piece_size(j.piece);
|
||||||
|
int blocks_in_piece = (piece_size + m_block_size - 1) / m_block_size;
|
||||||
if (p != idx.end())
|
if (p != idx.end())
|
||||||
{
|
{
|
||||||
|
bool recalc_contiguous = false;
|
||||||
TORRENT_ASSERT(p->blocks[block].buf == 0);
|
TORRENT_ASSERT(p->blocks[block].buf == 0);
|
||||||
if (p->blocks[block].buf)
|
if (p->blocks[block].buf)
|
||||||
{
|
{
|
||||||
|
@ -2057,6 +2065,13 @@ namespace libtorrent
|
||||||
--m_cache_stats.cache_size;
|
--m_cache_stats.cache_size;
|
||||||
--const_cast<cached_piece_entry&>(*p).num_blocks;
|
--const_cast<cached_piece_entry&>(*p).num_blocks;
|
||||||
}
|
}
|
||||||
|
else if ((block > 0 && p->blocks[block-1].buf) || (block < blocks_in_piece-1 && p->blocks[block+1].buf))
|
||||||
|
{
|
||||||
|
// update the contiguous blocks counter for this piece. Only if it has
|
||||||
|
// an adjacent block. If it doesn't, we already know it couldn't have
|
||||||
|
// increased the largest contiguous block span in this piece
|
||||||
|
recalc_contiguous = true;
|
||||||
|
}
|
||||||
p->blocks[block].buf = j.buffer;
|
p->blocks[block].buf = j.buffer;
|
||||||
p->blocks[block].callback.swap(j.callback);
|
p->blocks[block].callback.swap(j.callback);
|
||||||
#ifdef TORRENT_DISK_STATS
|
#ifdef TORRENT_DISK_STATS
|
||||||
|
@ -2064,6 +2079,10 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
++m_cache_stats.cache_size;
|
++m_cache_stats.cache_size;
|
||||||
++const_cast<cached_piece_entry&>(*p).num_blocks;
|
++const_cast<cached_piece_entry&>(*p).num_blocks;
|
||||||
|
if (recalc_contiguous)
|
||||||
|
{
|
||||||
|
const_cast<cached_piece_entry&>(*p).num_contiguous_blocks = contiguous_blocks(*p);
|
||||||
|
}
|
||||||
idx.modify(p, update_last_use(j.cache_min_time));
|
idx.modify(p, update_last_use(j.cache_min_time));
|
||||||
// we might just have created a contiguous range
|
// we might just have created a contiguous range
|
||||||
// that meets the requirement to be flushed. try it
|
// that meets the requirement to be flushed. try it
|
||||||
|
|
Loading…
Reference in New Issue