fixed crash when shutting down while checking a torrent

This commit is contained in:
Arvid Norberg
2009-05-13 17:17:33 +00:00
parent c8066aabd8
commit 062e1796c0
4 changed files with 47 additions and 17 deletions

View File

@@ -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)