Changeset 12343


Ignore:
Timestamp:
Apr 10, 2011, 5:21:51 AM (11 years ago)
Author:
jordan
Message:

(trunk libT) use a better data struct for the tr_datatype list in peer-io

Location:
trunk/libtransmission
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/peer-io.c

    r12337 r12343  
    2525#include "bandwidth.h"
    2626#include "crypto.h"
    27 #include "list.h"
    2827#include "net.h"
    2928#include "peer-common.h" /* MAX_BLOCK_SIZE */
     
    7877    } while( 0 )
    7978
     79/**
     80***
     81**/
     82
    8083struct tr_datatype
    8184{
    82     bool    isPieceData;
    83     size_t  length;
     85    struct tr_datatype * next;
     86    size_t length;
     87    bool isPieceData;
    8488};
    8589
     90static struct tr_datatype * datatype_pool = NULL;
     91
     92static const struct tr_datatype TR_DATATYPE_INIT = { NULL, 0, false };
     93
     94static struct tr_datatype *
     95datatype_new( void )
     96{
     97    struct tr_datatype * ret;
     98
     99    if( datatype_pool == NULL )
     100        ret = tr_new( struct tr_datatype, 1 );
     101    else {
     102        ret = datatype_pool;
     103        datatype_pool = datatype_pool->next;
     104    }
     105
     106    *ret = TR_DATATYPE_INIT;
     107    return ret;
     108}
     109
     110static void
     111datatype_free( struct tr_datatype * datatype )
     112{
     113    datatype->next = datatype_pool;
     114    datatype_pool = datatype;
     115}
     116
     117static void
     118peer_io_pull_datatype( tr_peerIo * io )
     119{
     120    struct tr_datatype * tmp;
     121
     122    if(( tmp = io->outbuf_datatypes ))
     123    {
     124        io->outbuf_datatypes = tmp->next;
     125        datatype_free( tmp );
     126    }
     127}
     128
     129static void
     130peer_io_push_datatype( tr_peerIo * io, struct tr_datatype * datatype )
     131{
     132    struct tr_datatype * tmp;
     133
     134    if(( tmp = io->outbuf_datatypes )) {
     135        while( tmp->next != NULL )
     136            tmp = tmp->next;
     137        tmp->next = datatype;
     138    } else {
     139        io->outbuf_datatypes = datatype;
     140    }
     141}
    86142
    87143/***
     
    94150     while( bytes_transferred && tr_isPeerIo( io ) )
    95151     {
    96         struct tr_datatype * next = io->outbuf_datatypes->data;
     152        struct tr_datatype * next = io->outbuf_datatypes;
    97153
    98154        const unsigned int payload = MIN( next->length, bytes_transferred );
     
    114170            bytes_transferred -= payload;
    115171            next->length -= payload;
    116             if( !next->length ) {
    117                 tr_list_pop_front( &io->outbuf_datatypes );
    118                 tr_free( next );
    119             }
     172            if( !next->length )
     173                peer_io_pull_datatype( io );
    120174        }
    121175    }
     
    756810    io_close_socket( io );
    757811    tr_cryptoFree( io->crypto );
    758     tr_list_free( &io->outbuf_datatypes, tr_free );
     812
     813    while( io->outbuf_datatypes != NULL )
     814        peer_io_pull_datatype( io );
    759815
    760816    memset( io, ~0, sizeof( tr_peerIo ) );
     
    9741030{
    9751031    struct tr_datatype * d;
    976 
    977     d = tr_new( struct tr_datatype, 1 );
     1032    d = datatype_new( );
    9781033    d->isPieceData = isPieceData != 0;
    9791034    d->length = byteCount;
    980     tr_list_append( &io->outbuf_datatypes, d );
     1035    peer_io_push_datatype( io, d );
    9811036}
    9821037
     
    10561111
    10571112    assert( tr_isPeerIo( io ) );
    1058     assert( evbuffer_get_length( inbuf )  >= byteCount );
     1113    assert( evbuffer_get_length( inbuf ) >= byteCount );
    10591114
    10601115    /* append it to outbuf */
     
    12491304{
    12501305    size_t byteCount = 0;
    1251     tr_list * it;
     1306    const struct tr_datatype * it;
    12521307
    12531308    /* count up how many bytes are used by non-piece-data messages
    12541309       at the front of our outbound queue */
    12551310    for( it=io->outbuf_datatypes; it!=NULL; it=it->next )
    1256     {
    1257         struct tr_datatype * d = it->data;
    1258 
    1259         if( d->isPieceData )
     1311        if( it->isPieceData )
    12601312            break;
    1261 
    1262         byteCount += d->length;
    1263     }
     1313        else
     1314            byteCount += it->length;
    12641315
    12651316    return tr_peerIoFlush( io, TR_UP, byteCount );
  • trunk/libtransmission/peer-io.h

    r12303 r12343  
    3232struct tr_bandwidth;
    3333struct tr_crypto;
     34struct tr_datatype;
    3435struct tr_peerIo;
    35 struct tr_list;
    3636
    3737/**
     
    112112    struct evbuffer     * inbuf;
    113113    struct evbuffer     * outbuf;
    114     struct tr_list      * outbuf_datatypes; /* struct tr_datatype */
     114    struct tr_datatype  * outbuf_datatypes;
    115115
    116116    struct event        * event_read;
Note: See TracChangeset for help on using the changeset viewer.