1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-02-23 14:40:43 +00:00

(trunk libT) inline parts of peer-io and bandwidth, too

This commit is contained in:
Charles Kerr 2009-01-02 17:46:22 +00:00
parent 199e38dd66
commit 73f500e5be
5 changed files with 222 additions and 292 deletions

View file

@ -26,21 +26,6 @@
**** ****
***/ ***/
enum
{
HISTORY_MSEC = 2000,
INTERVAL_MSEC = HISTORY_MSEC,
GRANULARITY_MSEC = 50,
HISTORY_SIZE = ( INTERVAL_MSEC / GRANULARITY_MSEC ),
MAGIC_NUMBER = 43143
};
struct bratecontrol
{
int newest;
struct { uint64_t date, size; } transfers[HISTORY_SIZE];
};
static float static float
getSpeed( const struct bratecontrol * r, int interval_msec ) getSpeed( const struct bratecontrol * r, int interval_msec )
{ {
@ -82,30 +67,6 @@ bytesUsed( struct bratecontrol * r, size_t size )
******* *******
******/ ******/
struct tr_band
{
tr_bool isLimited;
tr_bool honorParentLimits;
size_t bytesLeft;
double desiredSpeed;
struct bratecontrol raw;
struct bratecontrol piece;
};
struct tr_bandwidth
{
struct tr_band band[2];
struct tr_bandwidth * parent;
int magicNumber;
tr_session * session;
tr_ptrArray children; /* struct tr_bandwidth */
tr_ptrArray peers; /* tr_peerIo */
};
/***
****
***/
static inline int static inline int
comparePointers( const void * a, const void * b ) comparePointers( const void * a, const void * b )
{ {
@ -115,12 +76,6 @@ comparePointers( const void * a, const void * b )
return 0; return 0;
} }
tr_bool
tr_isBandwidth( const tr_bandwidth * b )
{
return ( b != NULL ) && ( b->magicNumber == MAGIC_NUMBER );
}
/*** /***
**** ****
***/ ***/
@ -195,48 +150,6 @@ tr_bandwidthHonorParentLimits( tr_bandwidth * b,
**** ****
***/ ***/
void
tr_bandwidthSetDesiredSpeed( tr_bandwidth * b,
tr_direction dir,
double desiredSpeed )
{
assert( tr_isBandwidth( b ) );
assert( tr_isDirection( dir ) );
b->band[dir].desiredSpeed = desiredSpeed;
}
double
tr_bandwidthGetDesiredSpeed( const tr_bandwidth * b,
tr_direction dir )
{
assert( tr_isBandwidth( b ) );
assert( tr_isDirection( dir ) );
return b->band[dir].desiredSpeed;
}
void
tr_bandwidthSetLimited( tr_bandwidth * b,
tr_direction dir,
tr_bool isLimited )
{
assert( tr_isBandwidth( b ) );
assert( tr_isDirection( dir ) );
b->band[dir].isLimited = isLimited;
}
tr_bool
tr_bandwidthIsLimited( const tr_bandwidth * b,
tr_direction dir )
{
assert( tr_isBandwidth( b ) );
assert( tr_isDirection( dir ) );
return b->band[dir].isLimited;
}
#if 0 #if 0
#warning do not check the code in with this enabled #warning do not check the code in with this enabled
#define DEBUG_DIRECTION TR_UP #define DEBUG_DIRECTION TR_UP
@ -358,7 +271,6 @@ tr_bandwidthAddPeer( tr_bandwidth * b,
assert( tr_isBandwidth( b ) ); assert( tr_isBandwidth( b ) );
assert( tr_isPeerIo( peerIo ) ); assert( tr_isPeerIo( peerIo ) );
tr_ptrArrayInsertSorted( &b->peers, peerIo, comparePointers );
} }
void void

View file

@ -17,6 +17,42 @@
#ifndef TR_BANDWIDTH_H #ifndef TR_BANDWIDTH_H
#define TR_BANDWIDTH_H #define TR_BANDWIDTH_H
#include "transmission.h"
#include "ptrarray.h"
struct tr_peerIo;
/* these are PRIVATE IMPLEMENTATION details that should not be touched.
* it's included in the header for inlining and composition. */
enum
{
HISTORY_MSEC = 2000,
INTERVAL_MSEC = HISTORY_MSEC,
GRANULARITY_MSEC = 50,
HISTORY_SIZE = ( INTERVAL_MSEC / GRANULARITY_MSEC ),
MAGIC_NUMBER = 43143
};
/* these are PRIVATE IMPLEMENTATION details that should not be touched.
* it's included in the header for inlining and composition. */
struct bratecontrol
{
int newest;
struct { uint64_t date, size; } transfers[HISTORY_SIZE];
};
/* these are PRIVATE IMPLEMENTATION details that should not be touched.
* it's included in the header for inlining and composition. */
struct tr_band
{
tr_bool isLimited;
tr_bool honorParentLimits;
size_t bytesLeft;
double desiredSpeed;
struct bratecontrol raw;
struct bratecontrol piece;
};
/** /**
* Bandwidth is an object for measuring and constraining bandwidth speeds. * Bandwidth is an object for measuring and constraining bandwidth speeds.
* *
@ -56,10 +92,20 @@
* and call tr_bandwidthClamp() before performing I/O to see how much * and call tr_bandwidthClamp() before performing I/O to see how much
* bandwidth they can safely use. * bandwidth they can safely use.
*/ */
typedef struct tr_bandwidth
{
/* these are PRIVATE IMPLEMENTATION details that should not be touched.
* it's included in the header for inlining and composition. */
typedef struct tr_bandwidth tr_bandwidth; struct tr_band band[2];
struct tr_bandwidth * parent;
int magicNumber;
tr_session * session;
tr_ptrArray children; /* struct tr_bandwidth */
tr_ptrArray peers; /* tr_peerIo */
}
tr_bandwidth;
struct tr_peerIo;
/** /**
*** ***
@ -74,8 +120,10 @@ tr_bandwidth*
void tr_bandwidthFree ( tr_bandwidth * bandwidth ); void tr_bandwidthFree ( tr_bandwidth * bandwidth );
/** @brief test to see if the pointer refers to a live bandwidth object */ /** @brief test to see if the pointer refers to a live bandwidth object */
extern inline tr_bool static inline tr_bool tr_isBandwidth( const tr_bandwidth * b )
tr_isBandwidth ( const tr_bandwidth * bandwidth ); {
return ( b != NULL ) && ( b->magicNumber == MAGIC_NUMBER );
}
/****** /******
******* *******
@ -86,33 +134,42 @@ extern inline tr_bool
* @see tr_bandwidthAllocate * @see tr_bandwidthAllocate
* @see tr_bandwidthGetDesiredSpeed * @see tr_bandwidthGetDesiredSpeed
*/ */
extern inline void static inline void tr_bandwidthSetDesiredSpeed( tr_bandwidth * bandwidth,
tr_bandwidthSetDesiredSpeed ( tr_bandwidth * bandwidth, tr_direction dir,
tr_direction direction, double desiredSpeed )
double desiredSpeed ); {
bandwidth->band[dir].desiredSpeed = desiredSpeed;
}
/** /**
* @brief Get the desired speed (in KiB/s) for ths bandwidth subtree. * @brief Get the desired speed (in KiB/s) for ths bandwidth subtree.
* @see tr_bandwidthSetDesiredSpeed * @see tr_bandwidthSetDesiredSpeed
*/ */
extern inline double static inline double
tr_bandwidthGetDesiredSpeed ( const tr_bandwidth * bandwidth, tr_bandwidthGetDesiredSpeed( const tr_bandwidth * bandwidth,
tr_direction direction ); tr_direction dir )
{
return bandwidth->band[dir].desiredSpeed;
}
/** /**
* @brief Set whether or not this bandwidth should throttle its peer-io's speeds * @brief Set whether or not this bandwidth should throttle its peer-io's speeds
*/ */
extern inline void static inline void tr_bandwidthSetLimited( tr_bandwidth * bandwidth,
tr_bandwidthSetLimited ( tr_bandwidth * bandwidth, tr_direction dir,
tr_direction direction, tr_bool isLimited )
tr_bool isLimited ); {
bandwidth->band[dir].isLimited = isLimited;
}
/** /**
* @return nonzero if this bandwidth throttles its peer-ios speeds * @return nonzero if this bandwidth throttles its peer-ios speeds
*/ */
extern inline tr_bool static inline tr_bool tr_bandwidthIsLimited( const tr_bandwidth * bandwidth,
tr_bandwidthIsLimited ( const tr_bandwidth * bandwidth, tr_direction dir )
tr_direction direction ); {
return bandwidth->band[dir].isLimited;
}
/** /**
* @brief allocate the next period_msec's worth of bandwidth for the peer-ios to consume * @brief allocate the next period_msec's worth of bandwidth for the peer-ios to consume
@ -132,19 +189,13 @@ size_t tr_bandwidthClamp ( const tr_bandwidth * bandwidth,
******* *******
******/ ******/
/** /** @brief Get the raw total of bytes read or sent by this bandwidth subtree. */
* @brief Get the raw total of bytes read or sent by this bandwidth subtree. double tr_bandwidthGetRawSpeed( const tr_bandwidth * bandwidth,
*/ tr_direction direction );
extern inline double
tr_bandwidthGetRawSpeed ( const tr_bandwidth * bandwidth,
tr_direction direction );
/** /** @brief Get the number of piece data bytes read or sent by this bandwidth subtree. */
* @brief Get the number of piece data bytes read or sent by this bandwidth subtree. double tr_bandwidthGetPieceSpeed( const tr_bandwidth * bandwidth,
*/ tr_direction direction );
extern inline double
tr_bandwidthGetPieceSpeed ( const tr_bandwidth * bandwidth,
tr_direction direction );
/** /**
* @brief Notify the bandwidth object that some of its allocated bandwidth has been consumed. * @brief Notify the bandwidth object that some of its allocated bandwidth has been consumed.
@ -180,15 +231,13 @@ void tr_bandwidthHonorParentLimits ( tr_bandwidth * bandwidth,
* @brief add a tr_peerIo to this bandwidth's list. * @brief add a tr_peerIo to this bandwidth's list.
* They will be notified when more bandwidth is made available for them to consume. * They will be notified when more bandwidth is made available for them to consume.
*/ */
extern inline void void tr_bandwidthAddPeer( tr_bandwidth * bandwidth,
tr_bandwidthAddPeer ( tr_bandwidth * bandwidth, struct tr_peerIo * peerIo );
struct tr_peerIo * peerIo );
/** /**
* @brief remove a peer-io from this bandwidth's list. * @brief remove a peer-io from this bandwidth's list.
*/ */
extern inline void void tr_bandwidthRemovePeer( tr_bandwidth * bandwidth,
tr_bandwidthRemovePeer ( tr_bandwidth * bandwidth, struct tr_peerIo * peerIo );
struct tr_peerIo * peerIo );
#endif #endif

View file

@ -78,43 +78,6 @@ struct tr_datatype
struct __tr_list head; struct __tr_list head;
}; };
struct tr_peerIo
{
tr_bool isEncrypted;
tr_bool isIncoming;
tr_bool peerIdIsSet;
tr_bool extendedProtocolSupported;
tr_bool fastExtensionSupported;
int magicNumber;
uint8_t encryptionMode;
tr_port port;
int socket;
uint8_t peerId[SHA_DIGEST_LENGTH];
time_t timeCreated;
tr_session * session;
tr_address addr;
tr_can_read_cb canRead;
tr_did_write_cb didWrite;
tr_net_error_cb gotError;
void * userData;
tr_bandwidth * bandwidth;
tr_crypto * crypto;
struct evbuffer * inbuf;
struct evbuffer * outbuf;
struct __tr_list outbuf_datatypes; /* struct tr_datatype */
struct event event_read;
struct event event_write;
};
/*** /***
**** ****
***/ ***/
@ -799,34 +762,6 @@ tr_peerIoWriteBytes( tr_peerIo * io,
} }
} }
void
tr_peerIoWriteUint8( tr_peerIo * io,
struct evbuffer * outbuf,
uint8_t writeme )
{
tr_peerIoWriteBytes( io, outbuf, &writeme, sizeof( uint8_t ) );
}
void
tr_peerIoWriteUint16( tr_peerIo * io,
struct evbuffer * outbuf,
uint16_t writeme )
{
uint16_t tmp = htons( writeme );
tr_peerIoWriteBytes( io, outbuf, &tmp, sizeof( uint16_t ) );
}
void
tr_peerIoWriteUint32( tr_peerIo * io,
struct evbuffer * outbuf,
uint32_t writeme )
{
uint32_t tmp = htonl( writeme );
tr_peerIoWriteBytes( io, outbuf, &tmp, sizeof( uint32_t ) );
}
/*** /***
**** ****
***/ ***/
@ -856,34 +791,6 @@ tr_peerIoReadBytes( tr_peerIo * io,
} }
} }
void
tr_peerIoReadUint8( tr_peerIo * io,
struct evbuffer * inbuf,
uint8_t * setme )
{
tr_peerIoReadBytes( io, inbuf, setme, sizeof( uint8_t ) );
}
void
tr_peerIoReadUint16( tr_peerIo * io,
struct evbuffer * inbuf,
uint16_t * setme )
{
uint16_t tmp;
tr_peerIoReadBytes( io, inbuf, &tmp, sizeof( uint16_t ) );
*setme = ntohs( tmp );
}
void
tr_peerIoReadUint32( tr_peerIo * io,
struct evbuffer * inbuf,
uint32_t * setme )
{
uint32_t tmp;
tr_peerIoReadBytes( io, inbuf, &tmp, sizeof( uint32_t ) );
*setme = ntohl( tmp );
}
void void
tr_peerIoDrain( tr_peerIo * io, tr_peerIoDrain( tr_peerIo * io,
struct evbuffer * inbuf, struct evbuffer * inbuf,
@ -899,12 +806,6 @@ tr_peerIoDrain( tr_peerIo * io,
} }
} }
int
tr_peerIoGetAge( const tr_peerIo * io )
{
return time( NULL ) - io->timeCreated;
}
/*** /***
**** ****
***/ ***/
@ -981,22 +882,6 @@ tr_peerIoFlush( tr_peerIo * io, tr_direction dir, size_t limit )
return ret; return ret;
} }
struct evbuffer *
tr_peerIoGetReadBuffer( tr_peerIo * io )
{
assert( tr_isPeerIo( io ) );
return io->inbuf;
}
tr_bool
tr_peerIoHasBandwidthLeft( const tr_peerIo * io, tr_direction dir )
{
assert( tr_isPeerIo( io ) );
return tr_bandwidthClamp( io->bandwidth, dir, 1024 ) > 0;
}
/*** /***
**** ****
****/ ****/
@ -1043,3 +928,13 @@ tr_peerIoSetEnabled( tr_peerIo * io,
else else
event_disable( io, event ); event_disable( io, event );
} }
tr_bool
tr_peerIoHasBandwidthLeft( const tr_peerIo * io,
tr_direction dir )
{
assert( tr_isPeerIo( io ) );
return tr_bandwidthClamp( io->bandwidth, dir, 1024 ) > 0;
}

View file

@ -21,11 +21,77 @@
*** ***
**/ **/
#include <assert.h>
#include <event.h>
#include "transmission.h"
#include "list.h" /* __tr_list */
#include "net.h" /* tr_address */
struct evbuffer; struct evbuffer;
struct tr_address;
struct tr_bandwidth; struct tr_bandwidth;
struct tr_crypto; struct tr_crypto;
typedef struct tr_peerIo tr_peerIo; struct tr_peerIo;
typedef enum
{
READ_NOW,
READ_LATER,
READ_ERR
}
ReadState;
typedef ReadState ( *tr_can_read_cb )( struct tr_peerIo * io,
void * user_data,
size_t * setme_piece_byte_count );
typedef void ( *tr_did_write_cb )( struct tr_peerIo * io,
size_t bytesWritten,
int wasPieceData,
void * userData );
typedef void ( *tr_net_error_cb )( struct tr_peerIo * io,
short what,
void * userData );
typedef struct tr_peerIo
{
tr_bool isEncrypted;
tr_bool isIncoming;
tr_bool peerIdIsSet;
tr_bool extendedProtocolSupported;
tr_bool fastExtensionSupported;
int magicNumber;
uint8_t encryptionMode;
tr_port port;
int socket;
uint8_t peerId[SHA_DIGEST_LENGTH];
time_t timeCreated;
tr_session * session;
tr_address addr;
tr_can_read_cb canRead;
tr_did_write_cb didWrite;
tr_net_error_cb gotError;
void * userData;
struct tr_bandwidth * bandwidth;
struct tr_crypto * crypto;
struct evbuffer * inbuf;
struct evbuffer * outbuf;
struct __tr_list outbuf_datatypes; /* struct tr_datatype */
struct event event_read;
struct event event_write;
}
tr_peerIo;
/** /**
*** ***
@ -83,7 +149,10 @@ int tr_peerIoReconnect( tr_peerIo * io );
tr_bool tr_peerIoIsIncoming( const tr_peerIo * io ); tr_bool tr_peerIoIsIncoming( const tr_peerIo * io );
extern inline int tr_peerIoGetAge( const tr_peerIo * io ); static inline int tr_peerIoGetAge( const tr_peerIo * io )
{
return time( NULL ) - io->timeCreated;
}
/** /**
@ -99,27 +168,6 @@ const uint8_t* tr_peerIoGetPeersId( const tr_peerIo * io );
*** ***
**/ **/
typedef enum
{
READ_NOW,
READ_LATER,
READ_ERR
}
ReadState;
typedef ReadState ( *tr_can_read_cb )( tr_peerIo * io,
void * user_data,
size_t * setme_piece_byte_count );
typedef void ( *tr_did_write_cb )( tr_peerIo * io,
size_t bytesWritten,
int wasPieceData,
void * userData );
typedef void ( *tr_net_error_cb )( tr_peerIo * io,
short what,
void * userData );
void tr_peerIoSetIOFuncs ( tr_peerIo * io, void tr_peerIoSetIOFuncs ( tr_peerIo * io,
tr_can_read_cb readcb, tr_can_read_cb readcb,
tr_did_write_cb writecb, tr_did_write_cb writecb,
@ -163,37 +211,58 @@ void tr_peerIoWriteBytes( tr_peerIo * io,
const void * bytes, const void * bytes,
size_t byteCount ); size_t byteCount );
void tr_peerIoWriteUint8( tr_peerIo * io, static inline void tr_peerIoWriteUint8( tr_peerIo * io,
struct evbuffer * outbuf, struct evbuffer * outbuf,
uint8_t writeme ); uint8_t writeme )
{
tr_peerIoWriteBytes( io, outbuf, &writeme, sizeof( uint8_t ) );
}
void tr_peerIoWriteUint16( tr_peerIo * io, static inline void tr_peerIoWriteUint16( tr_peerIo * io,
struct evbuffer * outbuf, struct evbuffer * outbuf,
uint16_t writeme ); uint16_t writeme )
{
const uint16_t tmp = htons( writeme );
tr_peerIoWriteBytes( io, outbuf, &tmp, sizeof( uint16_t ) );
}
void tr_peerIoWriteUint32( tr_peerIo * io, static inline void tr_peerIoWriteUint32( tr_peerIo * io,
struct evbuffer * outbuf, struct evbuffer * outbuf,
uint32_t writeme ); uint32_t writeme )
{
const uint32_t tmp = htonl( writeme );
tr_peerIoWriteBytes( io, outbuf, &tmp, sizeof( uint32_t ) );
}
void tr_peerIoReadBytes( tr_peerIo * io, void tr_peerIoReadBytes( tr_peerIo * io,
struct evbuffer * inbuf, struct evbuffer * inbuf,
void * bytes, void * bytes,
size_t byteCount ); size_t byteCount );
extern inline void static inline void tr_peerIoReadUint8( tr_peerIo * io,
tr_peerIoReadUint8( tr_peerIo * io, struct evbuffer * inbuf,
struct evbuffer * inbuf, uint8_t * setme )
uint8_t * setme ); {
tr_peerIoReadBytes( io, inbuf, setme, sizeof( uint8_t ) );
}
extern inline void static inline void tr_peerIoReadUint16( tr_peerIo * io,
tr_peerIoReadUint16( tr_peerIo * io, struct evbuffer * inbuf,
struct evbuffer * inbuf, uint16_t * setme )
uint16_t * setme ); {
uint16_t tmp;
tr_peerIoReadBytes( io, inbuf, &tmp, sizeof( uint16_t ) );
*setme = ntohs( tmp );
}
extern inline void static inline void tr_peerIoReadUint32( tr_peerIo * io,
tr_peerIoReadUint32( tr_peerIo * io, struct evbuffer * inbuf,
struct evbuffer * inbuf, uint32_t * setme )
uint32_t * setme ); {
uint32_t tmp;
tr_peerIoReadBytes( io, inbuf, &tmp, sizeof( uint32_t ) );
*setme = ntohl( tmp );
}
void tr_peerIoDrain( tr_peerIo * io, void tr_peerIoDrain( tr_peerIo * io,
struct evbuffer * inbuf, struct evbuffer * inbuf,
@ -213,13 +282,13 @@ void tr_peerIoBandwidthUsed( tr_peerIo * io,
size_t byteCount, size_t byteCount,
int isPieceData ); int isPieceData );
tr_bool tr_peerIoHasBandwidthLeft( const tr_peerIo * io,
tr_direction dir );
/** /**
*** ***
**/ **/
extern inline tr_bool tr_peerIoHasBandwidthLeft( const tr_peerIo * io,
tr_direction direction );
void tr_peerIoSetEnabled( tr_peerIo * io, void tr_peerIoSetEnabled( tr_peerIo * io,
tr_direction dir, tr_direction dir,
tr_bool isEnabled ); tr_bool isEnabled );
@ -228,9 +297,16 @@ int tr_peerIoFlush( tr_peerIo * io,
tr_direction dir, tr_direction dir,
size_t byteLimit ); size_t byteLimit );
extern inline struct evbuffer * tr_peerIoGetReadBuffer( tr_peerIo * io ); /**
***
**/
static inline struct evbuffer * tr_peerIoGetReadBuffer( tr_peerIo * io )
{
assert( tr_isPeerIo( io ) );
return io->inbuf;
}
#endif #endif

View file

@ -40,8 +40,7 @@ void tr_peerMsgsSetChoke( tr_peermsgs *,
void tr_peerMsgsHave( tr_peermsgs * msgs, void tr_peerMsgsHave( tr_peermsgs * msgs,
uint32_t pieceIndex ); uint32_t pieceIndex );
extern inline void void tr_peerMsgsPulse( tr_peermsgs * msgs );
tr_peerMsgsPulse( tr_peermsgs * msgs );
void tr_peerMsgsCancel( tr_peermsgs * msgs, void tr_peerMsgsCancel( tr_peermsgs * msgs,
uint32_t pieceIndex, uint32_t pieceIndex,
@ -56,8 +55,7 @@ tr_addreq_t tr_peerMsgsAddRequest( tr_peermsgs * peer,
uint32_t offset, uint32_t offset,
uint32_t length ); uint32_t length );
extern inline void void tr_peerMsgsUnsubscribe( tr_peermsgs * peer,
tr_peerMsgsUnsubscribe( tr_peermsgs * peer,
tr_publisher_tag tag ); tr_publisher_tag tag );
size_t tr_generateAllowedSet( tr_piece_index_t * setmePieces, size_t tr_generateAllowedSet( tr_piece_index_t * setmePieces,