mirror of https://github.com/aria2/aria2
2009-04-25 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed the bug that prevents torrent download from finishing. The bug doesn't reveal for all torrents. The torrents affected this bug satisfies ((N+7)/8)%4 == 0 and N%32 != 0 where N is the number of pieces. * src/bitfield.h * test/bitfieldTest.ccpull/1/head
parent
ea8668d80f
commit
35763a2ae0
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2009-04-25 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
|
|
||||||
|
Fixed the bug that prevents torrent download from finishing. The
|
||||||
|
bug doesn't reveal for all torrents. The torrents affected this
|
||||||
|
bug satisfies ((N+7)/8)%4 == 0 and N%32 != 0 where N is the number
|
||||||
|
of pieces.
|
||||||
|
* src/bitfield.h
|
||||||
|
* test/bitfieldTest.cc
|
||||||
|
|
||||||
2009-04-24 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
2009-04-24 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Code cleanup
|
Code cleanup
|
||||||
|
|
|
@ -97,17 +97,18 @@ inline size_t countSetBit(const unsigned char* bitfield, size_t nbits)
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
size_t size = sizeof(uint32_t);
|
size_t size = sizeof(uint32_t);
|
||||||
size_t len = (nbits+7)/8;
|
size_t len = (nbits+7)/8;
|
||||||
|
if(nbits%32 != 0) {
|
||||||
|
--len;
|
||||||
|
count +=
|
||||||
|
countBit32(static_cast<uint32_t>(bitfield[len]&lastByteMask(nbits)));
|
||||||
|
}
|
||||||
size_t to = len/size;
|
size_t to = len/size;
|
||||||
for(size_t i = 0; i < to; ++i) {
|
for(size_t i = 0; i < to; ++i) {
|
||||||
count += countBit32(*reinterpret_cast<const uint32_t*>(&bitfield[i*size]));
|
count += countBit32(*reinterpret_cast<const uint32_t*>(&bitfield[i*size]));
|
||||||
}
|
}
|
||||||
for(size_t i = len-len%size; i < len-1; ++i) {
|
for(size_t i = len-len%size; i < len; ++i) {
|
||||||
count += countBit32(static_cast<uint32_t>(bitfield[i]));
|
count += countBit32(static_cast<uint32_t>(bitfield[i]));
|
||||||
}
|
}
|
||||||
if(nbits%32 != 0) {
|
|
||||||
count +=
|
|
||||||
countBit32(static_cast<uint32_t>(bitfield[len-1]&lastByteMask(nbits)));
|
|
||||||
}
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,11 +40,17 @@ void bitfieldTest::testCountBit32()
|
||||||
|
|
||||||
void bitfieldTest::testCountSetBit()
|
void bitfieldTest::testCountSetBit()
|
||||||
{
|
{
|
||||||
unsigned char bitfield[] = { 0xff, 0xff, 0xff, 0xf0, 0xff, 0x01 };
|
unsigned char bitfield[] = { 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xf9 };
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)37, bitfield::countSetBit(bitfield, 48));
|
// (nbits+7)/8 == 0 && nbits%32 == 0
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)36, bitfield::countSetBit(bitfield, 47));
|
CPPUNIT_ASSERT_EQUAL((size_t)62, bitfield::countSetBit(bitfield, 64));
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)28, bitfield::countSetBit(bitfield, 32));
|
// (nbits+7)/8 != 0 && nbits%32 != 0 && len%4 == 0
|
||||||
|
CPPUNIT_ASSERT_EQUAL((size_t)56, bitfield::countSetBit(bitfield, 56));
|
||||||
|
// (nbits+7)/8 != 0 && nbits%32 != 0 && len%4 != 0
|
||||||
|
CPPUNIT_ASSERT_EQUAL((size_t)40, bitfield::countSetBit(bitfield, 40));
|
||||||
|
// (nbits+7)/8 == 0 && nbits%32 != 0
|
||||||
|
CPPUNIT_ASSERT_EQUAL((size_t)61, bitfield::countSetBit(bitfield, 63));
|
||||||
|
// nbts == 0
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)0, bitfield::countSetBit(bitfield, 0));
|
CPPUNIT_ASSERT_EQUAL((size_t)0, bitfield::countSetBit(bitfield, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue