stat files in the disk thread, in default_storage::initialize() instead of the constructor

This commit is contained in:
arvidn 2018-03-15 00:34:20 +01:00 committed by Arvid Norberg
parent 3721d8e710
commit 0edb0f28c1
1 changed files with 34 additions and 32 deletions

View File

@ -415,30 +415,6 @@ namespace libtorrent
? to_hex(params.info->info_hash().to_string()) ? to_hex(params.info->info_hash().to_string())
: params.files->name()) + ".parts"; : params.files->name()) + ".parts";
file_storage const& fs = files();
// if some files have priority 0, we need to check if they exist on the
// filesystem, in which case we won't use a partfile for them.
// this is to be backwards compatible with previous versions of
// libtorrent, when part files were not supported.
for (int i = 0; i < m_file_priority.size(); ++i)
{
if (m_file_priority[i] != 0 || fs.pad_file_at(i))
continue;
file_status s;
std::string const file_path = files().file_path(i, m_save_path);
error_code ec;
stat_file(file_path, &s, ec);
if (!ec)
{
use_partfile(i, false);
}
else
{
need_partfile();
}
}
} }
default_storage::~default_storage() default_storage::~default_storage()
@ -583,9 +559,34 @@ namespace libtorrent
m_file_created.resize(files().num_files(), false); m_file_created.resize(files().num_files(), false);
} }
file_storage const& fs = files();
// if some files have priority 0, we need to check if they exist on the
// filesystem, in which case we won't use a partfile for them.
// this is to be backwards compatible with previous versions of
// libtorrent, when part files were not supported.
for (int i = 0; i < m_file_priority.size(); ++i)
{
if (m_file_priority[i] != 0 || fs.pad_file_at(i))
continue;
file_status s;
std::string const file_path = fs.file_path(i, m_save_path);
error_code err;
stat_file(file_path, &s, err);
if (!err)
{
use_partfile(i, false);
}
else
{
need_partfile();
}
}
// first, create all missing directories // first, create all missing directories
std::string last_path; std::string last_path;
for (int file_index = 0; file_index < files().num_files(); ++file_index) for (int file_index = 0; file_index < fs.num_files(); ++file_index)
{ {
// ignore files that have priority 0 // ignore files that have priority 0
if (int(m_file_priority.size()) > file_index if (int(m_file_priority.size()) > file_index
@ -595,13 +596,13 @@ namespace libtorrent
} }
// ignore pad files // ignore pad files
if (files().pad_file_at(file_index)) continue; if (fs.pad_file_at(file_index)) continue;
boost::int64_t cached_size = m_stat_cache.get_filesize(file_index); boost::int64_t cached_size = m_stat_cache.get_filesize(file_index);
if (cached_size == stat_cache::not_in_cache) if (cached_size == stat_cache::not_in_cache)
{ {
file_status s; file_status s;
std::string file_path = files().file_path(file_index, m_save_path); std::string file_path = fs.file_path(file_index, m_save_path);
stat_file(file_path, &s, ec.ec); stat_file(file_path, &s, ec.ec);
if (!ec) if (!ec)
{ {
@ -625,9 +626,9 @@ namespace libtorrent
// deliberately don't truncate files that already exist // deliberately don't truncate files that already exist
// if a file is supposed to have size 0, but already exists, we will // if a file is supposed to have size 0, but already exists, we will
// never truncate it to 0. // never truncate it to 0.
if (files().file_size(file_index) == 0 && cached_size == stat_cache::no_exist) if (fs.file_size(file_index) == 0 && cached_size == stat_cache::no_exist)
{ {
std::string file_path = files().file_path(file_index, m_save_path); std::string file_path = fs.file_path(file_index, m_save_path);
std::string dir = parent_path(file_path); std::string dir = parent_path(file_path);
if (dir != last_path) if (dir != last_path)
@ -671,16 +672,17 @@ namespace libtorrent
bool default_storage::has_any_file(storage_error& ec) bool default_storage::has_any_file(storage_error& ec)
{ {
m_stat_cache.init(files().num_files()); file_storage const& fs = files();
m_stat_cache.init(fs.num_files());
std::string file_path; std::string file_path;
for (int i = 0; i < files().num_files(); ++i) for (int i = 0; i < fs.num_files(); ++i)
{ {
file_status s; file_status s;
boost::int64_t cache_status = m_stat_cache.get_filesize(i); boost::int64_t cache_status = m_stat_cache.get_filesize(i);
if (cache_status < 0 && cache_status != stat_cache::no_exist) if (cache_status < 0 && cache_status != stat_cache::no_exist)
{ {
file_path = files().file_path(i, m_save_path); file_path = fs.file_path(i, m_save_path);
stat_file(file_path, &s, ec.ec); stat_file(file_path, &s, ec.ec);
boost::int64_t r = s.file_size; boost::int64_t r = s.file_size;
if (ec.ec || !(s.mode & file_status::regular_file)) if (ec.ec || !(s.mode & file_status::regular_file))