From 6ab918a202884ce81173c9e48a0fd676b977f48a Mon Sep 17 00:00:00 2001 From: Jordan Lee Date: Mon, 21 Feb 2011 01:40:19 +0000 Subject: [PATCH] (trunk libT) code cleanup: moving bitset functions to their own .c file. --- libtransmission/Makefile.am | 1 + libtransmission/bitfield.c | 21 ------- libtransmission/bitset.c | 106 ++++++++++++++++++++++++++++++++++++ libtransmission/bitset.h | 94 +++++--------------------------- libtransmission/peer-mgr.c | 6 +- 5 files changed, 125 insertions(+), 103 deletions(-) create mode 100644 libtransmission/bitset.c diff --git a/libtransmission/Makefile.am b/libtransmission/Makefile.am index 96018a9fa..a02666036 100644 --- a/libtransmission/Makefile.am +++ b/libtransmission/Makefile.am @@ -21,6 +21,7 @@ libtransmission_a_SOURCES = \ bandwidth.c \ bencode.c \ bitfield.c \ + bitset.c \ blocklist.c \ cache.c \ clients.c \ diff --git a/libtransmission/bitfield.c b/libtransmission/bitfield.c index 97e1ed5a8..2563ca9a6 100644 --- a/libtransmission/bitfield.c +++ b/libtransmission/bitfield.c @@ -210,24 +210,3 @@ tr_bitfieldCountTrueBits( const tr_bitfield* b ) return ret; } - -/*** -**** -***/ - -void -tr_bitsetReserve( tr_bitset * b, size_t size ) -{ - if( b->bitfield.bitCount < size ) - { - tr_bitfield * tmp = tr_bitfieldDup( &b->bitfield ); - - tr_bitfieldDestruct( &b->bitfield ); - tr_bitfieldConstruct( &b->bitfield, size ); - - if( ( tmp->bits != NULL ) && ( tmp->byteCount > 0 ) ) - memcpy( b->bitfield.bits, tmp->bits, tmp->byteCount ); - - tr_bitfieldFree( tmp ); - } -} diff --git a/libtransmission/bitset.c b/libtransmission/bitset.c new file mode 100644 index 000000000..82c6360f0 --- /dev/null +++ b/libtransmission/bitset.c @@ -0,0 +1,106 @@ +/* + * This file Copyright (C) Mnemosyne LLC + * + * This file is licensed by the GPL version 2. Works owned by the + * Transmission project are granted a special exemption to clause 2(b) + * so that the bulk of its code can remain under the MIT license. + * This exemption does not extend to derived works not owned by + * the Transmission project. + * + * $Id$ + */ + +#include "transmission.h" +#include "bitset.h" + +void +tr_bitsetConstructor( tr_bitset * b, size_t size ) +{ + tr_bitfieldConstruct( &b->bitfield, size ); +} + +void +tr_bitsetDestructor( tr_bitset * b ) +{ + tr_bitfieldDestruct( &b->bitfield ); +} + +void +tr_bitsetReserve( tr_bitset * b, size_t size ) +{ + if( b->bitfield.bitCount < size ) + { + tr_bitfield * tmp = tr_bitfieldDup( &b->bitfield ); + + tr_bitfieldDestruct( &b->bitfield ); + tr_bitfieldConstruct( &b->bitfield, size ); + + if( ( tmp->bits != NULL ) && ( tmp->byteCount > 0 ) ) + memcpy( b->bitfield.bits, tmp->bits, tmp->byteCount ); + + tr_bitfieldFree( tmp ); + } +} + +tr_bool +tr_bitsetHas( const tr_bitset * b, const size_t nth ) +{ + if( b->haveAll ) return TRUE; + if( b->haveNone ) return FALSE; + if( nth >= b->bitfield.bitCount ) return FALSE; + return tr_bitfieldHas( &b->bitfield, nth ); +} + +void +tr_bitsetOr( tr_bitfield * a, const tr_bitset * b ) +{ + if( b->haveAll ) + tr_bitfieldAddRange( a, 0, a->bitCount ); + else if( !b->haveNone ) + tr_bitfieldOr( a, &b->bitfield ); +} + +/* set 'a' to all the flags that were in 'a' but not 'b' */ +void +tr_bitsetDifference( tr_bitfield * a, const tr_bitset * b ) +{ + if( b->haveAll ) + tr_bitfieldClear( a ); + else if( !b->haveNone ) + tr_bitfieldDifference( a, &b->bitfield ); +} + +double +tr_bitsetPercent( const tr_bitset * b ) +{ + if( b->haveAll ) return 1.0; + if( b->haveNone ) return 0.0; + if( b->bitfield.bitCount == 0 ) return 0.0; + return tr_bitfieldCountTrueBits( &b->bitfield ) / (double)b->bitfield.bitCount; +} + +void +tr_bitsetSetHaveAll( tr_bitset * b ) +{ + b->haveAll = 1; + b->haveNone = 0; +} + +void +tr_bitsetSetHaveNone( tr_bitset * b ) +{ + b->haveAll = 0; + b->haveNone = 1; +} + +int +tr_bitsetAdd( tr_bitset * b, size_t i ) +{ + int ret = 0; + if( !b->haveAll ) { + b->haveNone = 0; + tr_bitsetReserve( b, i+1 ); + ret = tr_bitfieldAdd( &b->bitfield, i ); + } + return ret; +} diff --git a/libtransmission/bitset.h b/libtransmission/bitset.h index f99fddfb6..7fc842975 100644 --- a/libtransmission/bitset.h +++ b/libtransmission/bitset.h @@ -29,90 +29,26 @@ typedef struct tr_bitset } tr_bitset; -static inline void -tr_bitsetConstructor( tr_bitset * b, size_t size ) -{ - tr_bitfieldConstruct( &b->bitfield, size ); -} - -static inline void -tr_bitsetDestructor( tr_bitset * b ) -{ - tr_bitfieldDestruct( &b->bitfield ); -} - void tr_bitsetReserve( tr_bitset * b, size_t size ); +void tr_bitsetConstructor( tr_bitset * b, size_t size ); +void tr_bitsetDestructor( tr_bitset * b ); -static inline tr_bool -tr_bitsetHasFast( const tr_bitset * b, const size_t nth ) -{ - if( b->haveAll ) return TRUE; - if( b->haveNone ) return FALSE; - if( nth >= b->bitfield.bitCount ) return FALSE; - return tr_bitfieldHasFast( &b->bitfield, nth ); -} +void tr_bitsetSetHaveAll( tr_bitset * b ); +void tr_bitsetSetHaveNone( tr_bitset * b ); -static inline tr_bool -tr_bitsetHas( const tr_bitset * b, const size_t nth ) -{ - if( b->haveAll ) return TRUE; - if( b->haveNone ) return FALSE; - if( nth >= b->bitfield.bitCount ) return FALSE; - return tr_bitfieldHas( &b->bitfield, nth ); -} +int tr_bitsetAdd( tr_bitset * b, size_t i ); -static inline void -tr_bitsetOr( tr_bitfield * a, const tr_bitset * b ) -{ - if( b->haveAll ) - tr_bitfieldAddRange( a, 0, a->bitCount ); - else if( !b->haveNone ) - tr_bitfieldOr( a, &b->bitfield ); -} +/*** +**** +***/ + +double tr_bitsetPercent( const tr_bitset * b ); + +tr_bool tr_bitsetHas( const tr_bitset * b, const size_t nth ); + +void tr_bitsetOr( tr_bitfield * a, const tr_bitset * b ); /* set 'a' to all the flags that were in 'a' but not 'b' */ -static inline void -tr_bitsetDifference( tr_bitfield * a, const tr_bitset * b ) -{ - if( b->haveAll ) - tr_bitfieldClear( a ); - else if( !b->haveNone ) - tr_bitfieldDifference( a, &b->bitfield ); -} - -static inline double -tr_bitsetPercent( const tr_bitset * b ) -{ - if( b->haveAll ) return 1.0; - if( b->haveNone ) return 0.0; - if( b->bitfield.bitCount == 0 ) return 0.0; - return tr_bitfieldCountTrueBits( &b->bitfield ) / (double)b->bitfield.bitCount; -} - -static inline void -tr_bitsetSetHaveAll( tr_bitset * b ) -{ - b->haveAll = 1; - b->haveNone = 0; -} - -static inline void -tr_bitsetSetHaveNone( tr_bitset * b ) -{ - b->haveAll = 0; - b->haveNone = 1; -} - -static inline int -tr_bitsetAdd( tr_bitset * b, size_t i ) -{ - int ret = 0; - if( !b->haveAll ) { - b->haveNone = 0; - tr_bitsetReserve( b, i+1 ); - ret = tr_bitfieldAdd( &b->bitfield, i ); - } - return ret; -} +void tr_bitsetDifference( tr_bitfield * a, const tr_bitset * b ); #endif diff --git a/libtransmission/peer-mgr.c b/libtransmission/peer-mgr.c index db05ca5f8..34c07854e 100644 --- a/libtransmission/peer-mgr.c +++ b/libtransmission/peer-mgr.c @@ -475,7 +475,7 @@ replicationNew( Torrent * t ) uint16_t r = 0; for( peer_i=0; peer_ihave, piece_i ) ) + if( tr_bitsetHas( &peers[peer_i]->have, piece_i ) ) ++r; t->pieceReplication[piece_i] = r; @@ -1023,7 +1023,7 @@ assertReplicationCountIsExact( Torrent * t ) uint16_t r = 0; for( peer_i=0; peer_ihave, piece_i ) ) + if( tr_bitsetHas( &peers[peer_i]->have, piece_i ) ) ++r; assert( rep[piece_i] == r ); @@ -1333,7 +1333,7 @@ tr_peerMgrGetNextRequests( tr_torrent * tor, struct weighted_piece * p = pieces + i; /* if the peer has this piece that we want... */ - if( tr_bitsetHasFast( have, p->index ) ) + if( tr_bitsetHas( have, p->index ) ) { tr_block_index_t b = tr_torPieceFirstBlock( tor, p->index ); const tr_block_index_t e = b + tr_torPieceCountBlocks( tor, p->index );