fixed crash when shutting down while checking a torrent
This commit is contained in:
@@ -64,7 +64,7 @@ void on_read_piece(int ret, disk_io_job const& j, char const* data, int size)
|
||||
if (ret > 0) TEST_CHECK(std::equal(j.buffer, j.buffer + ret, data));
|
||||
}
|
||||
|
||||
void on_check_resume_data(int ret, disk_io_job const& j)
|
||||
void on_check_resume_data(int ret, disk_io_job const& j, bool* done)
|
||||
{
|
||||
std::cerr << "on_check_resume_data ret: " << ret;
|
||||
switch (ret)
|
||||
@@ -75,19 +75,20 @@ void on_check_resume_data(int ret, disk_io_job const& j)
|
||||
<< " file: " << j.error_file << std::endl; break;
|
||||
case -3: std::cerr << " aborted" << std::endl; break;
|
||||
}
|
||||
*done = true;
|
||||
}
|
||||
|
||||
void on_check_files(int ret, disk_io_job const& j)
|
||||
void on_check_files(int ret, disk_io_job const& j, bool* done)
|
||||
{
|
||||
std::cerr << "on_check_files ret: " << ret;
|
||||
|
||||
switch (ret)
|
||||
{
|
||||
case 0: std::cerr << " done" << std::endl; break;
|
||||
case 0: std::cerr << " done" << std::endl; *done = true; break;
|
||||
case -1: std::cerr << " current slot: " << j.piece << " have: " << j.offset << std::endl; break;
|
||||
case -2: std::cerr << " disk error: " << j.str
|
||||
<< " file: " << j.error_file << std::endl; break;
|
||||
case -3: std::cerr << " aborted" << std::endl; break;
|
||||
<< " file: " << j.error_file << std::endl; *done = true; break;
|
||||
case -3: std::cerr << " aborted" << std::endl; *done = true; break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -187,19 +188,23 @@ void run_storage_tests(boost::intrusive_ptr<torrent_info> info
|
||||
boost::mutex lock;
|
||||
|
||||
error_code ec;
|
||||
bool done = false;
|
||||
lazy_entry frd;
|
||||
pm->async_check_fastresume(&frd, &on_check_resume_data);
|
||||
pm->async_check_fastresume(&frd, boost::bind(&on_check_resume_data, _1, _2, &done));
|
||||
ios.reset();
|
||||
ios.run(ec);
|
||||
|
||||
pm->async_check_files(&on_check_files);
|
||||
for (int i = 0; i < 4; ++i)
|
||||
while (!done)
|
||||
{
|
||||
ios.reset();
|
||||
ios.run_one(ec);
|
||||
}
|
||||
|
||||
done = false;
|
||||
pm->async_check_files(boost::bind(&on_check_files, _1, _2, &done));
|
||||
while (!done)
|
||||
{
|
||||
ios.reset();
|
||||
ios.run_one(ec);
|
||||
}
|
||||
ios.reset();
|
||||
ios.poll(ec);
|
||||
|
||||
// test rename_file
|
||||
remove(test_path / "part0");
|
||||
@@ -260,7 +265,8 @@ void run_storage_tests(boost::intrusive_ptr<torrent_info> info
|
||||
TEST_CHECK(!exists(test_path / "part0"));
|
||||
TEST_CHECK(exists(test_path / "temp_storage/test1.tmp"));
|
||||
|
||||
ios.run(ec);
|
||||
ios.reset();
|
||||
ios.poll(ec);
|
||||
|
||||
io.join();
|
||||
remove_all(test_path / "temp_storage2");
|
||||
@@ -367,13 +373,18 @@ void test_check_files(path const& test_path
|
||||
boost::mutex lock;
|
||||
|
||||
error_code ec;
|
||||
bool done = false;
|
||||
lazy_entry frd;
|
||||
pm->async_check_fastresume(&frd, &on_check_resume_data);
|
||||
pm->async_check_fastresume(&frd, boost::bind(&on_check_resume_data, _1, _2, &done));
|
||||
ios.reset();
|
||||
ios.run(ec);
|
||||
while (!done)
|
||||
{
|
||||
ios.reset();
|
||||
ios.run_one(ec);
|
||||
}
|
||||
|
||||
bool pieces[4] = {false, false, false, false};
|
||||
bool done = false;
|
||||
done = false;
|
||||
|
||||
pm->async_check_files(bind(&check_files_fill_array, _1, _2, pieces, &done));
|
||||
while (!done)
|
||||
|
Reference in New Issue
Block a user