void tr_cpPieceRem( tr_completion * cp, tr_piece_index_t piece ) { const tr_torrent * tor = cp->tor; const tr_block_index_t start = tr_torPieceFirstBlock( tor, piece ); const tr_block_index_t end = start + tr_torPieceCountBlocks( tor, piece ); tr_block_index_t block; assert( cp ); assert( piece < tor->info.pieceCount ); assert( start < tor->blockCount ); assert( start <= end ); assert( end <= tor->blockCount ); for( block = start; block < end; ++block ) if( tr_cpBlockIsComplete( cp, block ) ) cp->sizeNow -= tr_torBlockCountBytes( tor, block ); cp->sizeWhenDoneIsDirty = 1; cp->haveValidIsDirty = 1; cp->completeBlocks[piece] = 0; tr_bitfieldRemRange ( cp->blockBitfield, start, end ); tr_bitfieldRem( cp->pieceBitfield, piece ); }
static int test_bitfields (void) { unsigned int i; unsigned int bitcount = 500; tr_bitfield field; tr_bitfieldConstruct (&field, bitcount); /* test tr_bitfieldAdd */ for (i=0; i<bitcount; i++) if (! (i % 7)) tr_bitfieldAdd (&field, i); for (i=0; i<bitcount; i++) check (tr_bitfieldHas (&field, i) == (! (i % 7))); /* test tr_bitfieldAddRange */ tr_bitfieldAddRange (&field, 0, bitcount); for (i=0; i<bitcount; i++) check (tr_bitfieldHas (&field, i)); /* test tr_bitfieldRemRange in the middle of a boundary */ tr_bitfieldRemRange (&field, 4, 21); for (i=0; i<64; i++) check (tr_bitfieldHas (&field, i) == ((i < 4) || (i >= 21))); /* test tr_bitfieldRemRange on the boundaries */ tr_bitfieldAddRange (&field, 0, 64); tr_bitfieldRemRange (&field, 8, 24); for (i=0; i<64; i++) check (tr_bitfieldHas (&field, i) == ((i < 8) || (i >= 24))); /* test tr_bitfieldRemRange when begin & end is on the same word */ tr_bitfieldAddRange (&field, 0, 64); tr_bitfieldRemRange (&field, 4, 5); for (i=0; i<64; i++) check (tr_bitfieldHas (&field, i) == ((i < 4) || (i >= 5))); /* test tr_bitfieldAddRange */ tr_bitfieldRemRange (&field, 0, 64); tr_bitfieldAddRange (&field, 4, 21); for (i=0; i<64; i++) check (tr_bitfieldHas (&field, i) == ((4 <= i) && (i < 21))); /* test tr_bitfieldAddRange on the boundaries */ tr_bitfieldRemRange (&field, 0, 64); tr_bitfieldAddRange (&field, 8, 24); for (i=0; i<64; i++) check (tr_bitfieldHas (&field, i) == ((8 <= i) && (i < 24))); /* test tr_bitfieldAddRange when begin & end is on the same word */ tr_bitfieldRemRange (&field, 0, 64); tr_bitfieldAddRange (&field, 4, 5); for (i=0; i<64; i++) check (tr_bitfieldHas (&field, i) == ((4 <= i) && (i < 5))); tr_bitfieldDestruct (&field); return 0; }
void tr_cpPieceRem( tr_completion * cp, tr_piece_index_t piece ) { tr_block_index_t i, f, l; const tr_torrent * tor = cp->tor; tr_torGetPieceBlockRange( cp->tor, piece, &f, &l ); for( i=f; i<=l; ++i ) if( tr_cpBlockIsComplete( cp, i ) ) cp->sizeNow -= tr_torBlockCountBytes( tor, i ); cp->haveValidIsDirty = true; cp->sizeWhenDoneIsDirty = true; tr_bitfieldRemRange( &cp->blockBitfield, f, l+1 ); }