*** empty log message ***
This commit is contained in:
@@ -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;
|
||||||
|
100
src/storage.cpp
100
src/storage.cpp
@@ -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
|
||||||
|
Reference in New Issue
Block a user