Ignore:
Timestamp:
Sep 26, 2011, 6:18:48 AM (10 years ago)
Author:
jordan
Message:

(trunk libT) add several more tr_completion assertions to smoke out the (sizeWhenDone() < sizeNow()) error reported in the forums

Location:
trunk/libtransmission
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/completion.c

    r12902 r12918  
    4949    /* set sizeNow */
    5050    cp->sizeNow = tr_bitfieldCountTrueBits( &cp->blockBitfield );
     51    assert( cp->sizeNow <= cp->tor->blockCount );
    5152    cp->sizeNow *= cp->tor->blockSize;
    5253    if( tr_bitfieldHas( b, cp->tor->blockCount-1 ) )
    5354        cp->sizeNow -= ( cp->tor->blockSize - cp->tor->lastBlockSize );
     55    assert( cp->sizeNow <= cp->tor->info.totalSize );
    5456}
    5557
     
    142144        uint64_t size = 0;
    143145        const tr_torrent * tor = ccp->tor;
     146        const tr_info * inf = tr_torrentInfo( tor );
    144147        tr_completion * cp = (tr_completion *) ccp; /* mutable */
    145148
    146149        if( tr_cpHasAll( ccp ) )
    147150        {
    148             size = tor->info.totalSize;
     151            size = inf->totalSize;
    149152        }
    150153        else
     
    152155            tr_piece_index_t p;
    153156
    154             for( p=0; p<tor->info.pieceCount; ++p )
     157            for( p=0; p<inf->pieceCount; ++p )
    155158            {
    156                 if( !tor->info.pieces[p].dnd )
     159                uint64_t n = 0;
     160                const uint64_t pieceSize = tr_torPieceCountBytes( tor, p );
     161
     162                if( !inf->pieces[p].dnd )
    157163                {
    158                     size += tr_torPieceCountBytes( tor, p );
     164                    n = pieceSize;
    159165                }
    160166                else
    161167                {
     168                    uint64_t o = 0;
    162169                    tr_block_index_t b, f, l;
    163170                    tr_torGetPieceBlockRange( cp->tor, p, &f, &l );
    164171                    for( b=f; b<=l; ++b )
    165172                        if( tr_cpBlockIsComplete( cp, b ) )
    166                             size += tr_torBlockCountBytes( tor, b );
     173                            n += tr_torBlockCountBytes( tor, b );
     174
     175                    o = tr_bitfieldCountRange( &cp->blockBitfield, f, l+1 );
     176                    o *= cp->tor->blockSize;
     177                    if( l == ( cp->tor->blockCount - 1 )  && tr_bitfieldHas( &cp->blockBitfield, l ) )
     178                        o -= ( cp->tor->blockSize - cp->tor->lastBlockSize );
     179
     180                    assert( n == o );
    167181                }
     182
     183                assert( n <= tr_torPieceCountBytes( tor, p ) );
     184                size += n;
    168185            }
    169186        }
    170187
     188        assert( size <= inf->totalSize );
     189        assert( size >= cp->sizeNow );
     190
    171191        cp->sizeWhenDoneLazy = size;
    172192        cp->sizeWhenDoneIsDirty = false;
     
    174194
    175195    return ccp->sizeWhenDoneLazy;
     196}
     197
     198uint64_t
     199tr_cpLeftUntilDone( const tr_completion * cp )
     200{
     201    const uint64_t sizeWhenDone = tr_cpSizeWhenDone( cp );
     202
     203    assert( sizeWhenDone >= cp->sizeNow );
     204
     205    return sizeWhenDone - cp->sizeNow;
    176206}
    177207
  • trunk/libtransmission/completion.h

    r12262 r12918  
    7777uint64_t          tr_cpSizeWhenDone( const tr_completion * );
    7878
     79uint64_t          tr_cpLeftUntilDone( const tr_completion * );
     80
    7981void              tr_cpGetAmountDone( const   tr_completion * completion,
    8082                                      float                 * tab,
     
    9294{
    9395    return tr_torrentInfo(cp->tor)->totalSize - cp->sizeNow;
    94 }
    95 
    96 static inline uint64_t
    97 tr_cpLeftUntilDone( const tr_completion * cp )
    98 {
    99     return tr_cpSizeWhenDone( cp ) - cp->sizeNow;
    10096}
    10197
Note: See TracChangeset for help on using the changeset viewer.