*** empty log message ***

This commit is contained in:
Arvid Norberg
2004-01-26 23:38:08 +00:00
parent 7013ee461c
commit b31ce8a10a
2 changed files with 93 additions and 13 deletions

View File

@@ -93,6 +93,12 @@ namespace libtorrent
// may throw file_error if storage for slot hasn't been allocated // may throw file_error if storage for slot hasn't been allocated
void write(const char* buf, int slot, int offset, int size); void write(const char* buf, int slot, int offset, int size);
#ifndef NDEBUG
// overwrites some slots with the
// contents of others
void storage::shuffle();
#endif
private: private:
class impl; class impl;
opaque_value_ptr<impl> m_pimpl; opaque_value_ptr<impl> m_pimpl;

View File

@@ -232,6 +232,36 @@ namespace libtorrent
m_pimpl.swap(other.m_pimpl); m_pimpl.swap(other.m_pimpl);
} }
#ifndef NDEBUG
void storage::shuffle()
{
int num_pieces = m_pimpl->info.num_pieces();
std::vector<int> pieces(num_pieces);
for (std::vector<int>::iterator i = pieces.begin();
i != pieces.end();
++i)
{
*i = i - pieces.begin();
}
std::vector<int> targets(pieces);
std::random_shuffle(pieces.begin(), pieces.end());
std::random_shuffle(targets.begin(), targets.end());
for (int i = 0; i < num_pieces / 4; ++i)
{
const int slot_index = targets[i];
const int piece_index = pieces[i];
const int slot_size = m_pimpl->info.piece_size(slot_index);
std::vector<char> buf(slot_size);
read(&buf[0], piece_index, 0, slot_size);
write(&buf[0], slot_index, 0, slot_size);
}
}
#endif
size_type storage::read( size_type storage::read(
char* buf char* buf
, int slot , int slot
@@ -1033,6 +1063,8 @@ namespace libtorrent
, std::vector<bool>& have_pieces , std::vector<bool>& have_pieces
, const std::multimap<sha1_hash, int>& hash_to_piece) , const std::multimap<sha1_hash, int>& hash_to_piece)
{ {
INVARIANT_CHECK;
assert((int)have_pieces.size() == m_info.num_pieces()); assert((int)have_pieces.size() == m_info.num_pieces());
const int piece_size = m_info.piece_length(); const int piece_size = m_info.piece_length();
@@ -1105,6 +1137,7 @@ namespace libtorrent
} }
if (other_piece >= 0) if (other_piece >= 0)
{ {
// replace the old slot with 'other_piece'
assert(have_pieces[other_piece] == false); assert(have_pieces[other_piece] == false);
have_pieces[other_piece] = true; have_pieces[other_piece] = true;
m_slot_to_piece[other_slot] = other_piece; m_slot_to_piece[other_slot] = other_piece;
@@ -1112,6 +1145,11 @@ namespace libtorrent
} }
else else
{ {
// this index is the only piece with this
// hash. The previous slot we found with
// this hash must be tha same piece. Mark
// that piece as unassigned, since this slot
// is the correct place for the piece.
m_slot_to_piece[other_slot] = unassigned; m_slot_to_piece[other_slot] = unassigned;
m_free_slots.push_back(other_slot); m_free_slots.push_back(other_slot);
} }
@@ -1144,6 +1182,7 @@ namespace libtorrent
assert(have_pieces[free_piece] == false); assert(have_pieces[free_piece] == false);
assert(m_piece_to_slot[free_piece] == has_no_slot); assert(m_piece_to_slot[free_piece] == has_no_slot);
have_pieces[free_piece] = true; have_pieces[free_piece] = true;
return free_piece; return free_piece;
} }
else else
@@ -1164,13 +1203,16 @@ namespace libtorrent
INVARIANT_CHECK; INVARIANT_CHECK;
// TODO: TEMP!
// m_storage.shuffle();
m_piece_to_slot.resize(m_info.num_pieces(), has_no_slot); m_piece_to_slot.resize(m_info.num_pieces(), has_no_slot);
m_slot_to_piece.resize(m_info.num_pieces(), unallocated); m_slot_to_piece.resize(m_info.num_pieces(), unallocated);
m_free_slots.clear(); m_free_slots.clear();
m_unallocated_slots.clear(); m_unallocated_slots.clear();
pieces.clear(); pieces.clear();
pieces.resize(m_info.num_pieces(), false); pieces.resize(m_info.num_pieces(), false);
/*
// if we have fast-resume info // if we have fast-resume info
// use it instead of doing the actual checking // use it instead of doing the actual checking
if (!data.piece_map.empty() if (!data.piece_map.empty()
@@ -1212,7 +1254,7 @@ namespace libtorrent
} }
return; return;
} }
*/
// ------------------------ // ------------------------
// DO THE FULL CHECK // DO THE FULL CHECK
@@ -1241,6 +1283,7 @@ namespace libtorrent
{ {
try try
{ {
m_storage.read( m_storage.read(
&piece_data[0] &piece_data[0]
, current_slot , current_slot
@@ -1255,19 +1298,49 @@ namespace libtorrent
if (piece_index >= 0) if (piece_index >= 0)
{ {
assert(m_slot_to_piece[current_slot] == unallocated); INVARIANT_CHECK;
assert(m_piece_to_slot[piece_index] == has_no_slot);
// the slot was identified as piece 'piece_index' if (m_slot_to_piece[piece_index] >= 0)
m_piece_to_slot[piece_index] = current_slot; {
// the storage is unsorted, sorting.
assert(piece_index != current_slot);
m_slot_to_piece[current_slot] = piece_index; // swap piece_index with this slot
int other_piece = m_slot_to_piece[piece_index];
m_slot_to_piece[piece_index] = piece_index;
m_slot_to_piece[current_slot] = other_piece;
m_piece_to_slot[piece_index] = piece_index;
m_piece_to_slot[other_piece] = current_slot;
const int slot1_size = m_info.piece_size(current_slot);
const int slot2_size = m_info.piece_size(piece_index);
std::vector<char> buf1(slot1_size);
std::vector<char> buf2(slot2_size);
m_storage.read(&buf1[0], current_slot, 0, slot1_size);
m_storage.read(&buf2[0], piece_index, 0, slot2_size);
m_storage.write(&buf2[0], current_slot, 0, slot2_size);
m_storage.write(&buf1[0], piece_index, 0, slot1_size);
}
else
{
assert(m_slot_to_piece[current_slot] == unallocated);
assert(m_piece_to_slot[piece_index] == has_no_slot);
// the slot was identified as piece 'piece_index'
m_piece_to_slot[piece_index] = current_slot;
m_slot_to_piece[current_slot] = piece_index;
}
} }
else else
{ {
INVARIANT_CHECK;
// the data in the slot was not recognized // the data in the slot was not recognized
// consider the slot free // consider the slot free
assert(m_slot_to_piece[current_slot]==unallocated); assert(m_slot_to_piece[current_slot] == unallocated);
m_slot_to_piece[current_slot] = unassigned; m_slot_to_piece[current_slot] = unassigned;
m_free_slots.push_back(current_slot); m_free_slots.push_back(current_slot);
} }
@@ -1391,9 +1464,10 @@ namespace libtorrent
m_piece_to_slot[piece_index] m_piece_to_slot[piece_index]
, m_piece_to_slot[piece_at_our_slot]); , m_piece_to_slot[piece_at_our_slot]);
std::vector<char> buf(m_info.piece_length()); const int slot_size = m_info.piece_size(slot_index);
m_storage.read(&buf[0], piece_index, 0, m_info.piece_length()); std::vector<char> buf(slot_size);
m_storage.write(&buf[0], slot_index, 0, m_info.piece_length()); m_storage.read(&buf[0], piece_index, 0, slot_size);
m_storage.write(&buf[0], slot_index, 0, slot_size);
assert(m_slot_to_piece[piece_index] == piece_index); assert(m_slot_to_piece[piece_index] == piece_index);
assert(m_piece_to_slot[piece_index] == piece_index); assert(m_piece_to_slot[piece_index] == piece_index);
@@ -1555,7 +1629,7 @@ namespace libtorrent
// do more detailed checks on piece_to_slot // do more detailed checks on piece_to_slot
if (m_piece_to_slot[i] >= 0) if (m_piece_to_slot[i] >= 0)
{ {
assert(m_slot_to_piece[m_piece_to_slot[i]]==i); assert(m_slot_to_piece[m_piece_to_slot[i]] == i);
if (m_piece_to_slot[i] != i) if (m_piece_to_slot[i] != i)
{ {
assert(m_slot_to_piece[i] == unallocated); assert(m_slot_to_piece[i] == unallocated);
@@ -1563,7 +1637,7 @@ namespace libtorrent
} }
else else
{ {
assert(m_piece_to_slot[i]==has_no_slot); assert(m_piece_to_slot[i] == has_no_slot);
} }
// do more detailed checks on slot_to_piece // do more detailed checks on slot_to_piece