Changeset 2746


Ignore:
Timestamp:
Aug 14, 2007, 2:18:54 PM (15 years ago)
Author:
charles
Message:

make list less error-prone by changing the API s.t. we're guaranteed to update the list's pointer correctly.

Location:
trunk/libtransmission
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/list.c

    r2310 r2746  
    3030
    3131void
    32 tr_list_free( tr_list_t* list )
     32tr_list_free( tr_list_t** list )
    3333{
    34     while( list )
     34    while( *list )
    3535    {
    36         tr_list_t * node = list;
    37         list = list->next;
     36        tr_list_t * node = *list;
     37        *list = (*list)->next;
    3838        node_free( node );
    3939    }
    4040}
    4141
    42 tr_list_t*
    43 tr_list_prepend( tr_list_t * list, void * data )
     42void
     43tr_list_prepend( tr_list_t ** list, void * data )
    4444{
    4545    tr_list_t * node = node_alloc ();
    4646    node->data = data;
    47     node->next = list;
    48     if( list )
    49         list->prev = node;
    50     return node;
     47    node->next = *list;
     48    if( *list )
     49        (*list)->prev = node;
     50    *list = node;
    5151}
    5252
    53 tr_list_t*
    54 tr_list_append( tr_list_t * list, void * data )
     53void
     54tr_list_append( tr_list_t ** list, void * data )
    5555{
    5656    tr_list_t * node = node_alloc( );
    5757    node->data = data;
    58     if( !list )
    59         return node;
     58    if( !*list )
     59        *list = node;
    6060    else {
    61         tr_list_t * l = list;
     61        tr_list_t * l = *list;
    6262        while( l->next )
    6363            l = l->next;
    6464        l->next = node;
    6565        node->prev = l;
    66         return list;
    6766    }
    6867}
     68
     69void
     70tr_list_insert_sorted( tr_list_t ** list,
     71                       void       * data,
     72                       int          compare(const void*,const void*) )
     73{
     74    /* find l, the node that we'll insert this data before */
     75    tr_list_t * l;
     76    for( l=*list; l!=NULL; l=l->next ) {
     77        const int c = (compare)( data, l->data );
     78        if( c <= 0 )
     79            break;
     80    }
     81
     82    if( l == NULL)
     83        tr_list_append( list, data );
     84    else if( l == *list )
     85        tr_list_prepend( list, data );
     86    else {
     87        tr_list_t * node = node_alloc( );
     88        node->data = data;
     89        if( l->prev ) { node->prev = l->prev; node->prev->next = node; }
     90        node->next = l;
     91        l->prev = node;
     92    }
     93}
     94
    6995
    7096tr_list_t*
     
    78104}
    79105
    80 tr_list_t*
    81 tr_list_remove_data ( tr_list_t * list, const void * data )
     106void
     107tr_list_remove_data ( tr_list_t ** list, const void * data )
    82108{
    83     tr_list_t * node = tr_list_find_data( list, data );
     109    tr_list_t * node = tr_list_find_data( *list, data );
    84110    tr_list_t * prev = node ? node->prev : NULL;
    85111    tr_list_t * next = node ? node->next : NULL;
    86112    if( prev ) prev->next = next;
    87113    if( next ) next->prev = prev;
    88     if( list == node ) list = next;
     114    if( *list == node ) *list = next;
    89115    node_free( node );
    90     return list;
    91116}
    92117
    93118tr_list_t*
    94 tr_list_find ( tr_list_t * list , TrListCompareFunc func, const void * b )
     119tr_list_find ( tr_list_t * list , const void * b, TrListCompareFunc func )
    95120{
    96121    for( ; list; list=list->next )
  • trunk/libtransmission/list.h

    r2552 r2746  
    2020tr_list_t;
    2121
    22 void        tr_list_free        ( tr_list_t* );
    23 tr_list_t*  tr_list_append      ( tr_list_t*, void * data );
    24 tr_list_t*  tr_list_prepend     ( tr_list_t*, void * data );
    25 tr_list_t*  tr_list_remove_data ( tr_list_t*, const void * data );
     22typedef int (*TrListCompareFunc)(const void * a, const void * b);
     23typedef void (*TrListForeachFunc)(void *);
    2624
    27 typedef int (*TrListCompareFunc)(const void * a, const void * b);
    28 tr_list_t*  tr_list_find        ( tr_list_t*, TrListCompareFunc func, const void * b );
    29 tr_list_t*  tr_list_find_data   ( tr_list_t*, const void * data );
     25void        tr_list_free           ( tr_list_t         ** list );
    3026
    31 typedef void (*TrListForeachFunc)(void *);
    32 void tr_list_foreach            ( tr_list_t*, TrListForeachFunc func );
     27void        tr_list_append         ( tr_list_t         ** list,
     28                                     void               * data );
     29
     30void        tr_list_prepend        ( tr_list_t         ** list,
     31                                     void               * data );
     32
     33void        tr_list_remove_data    ( tr_list_t         ** list,
     34                                     const void         * data );
     35
     36void        tr_list_insert_sorted  ( tr_list_t         ** list,
     37                                     void               * data,
     38                                     TrListCompareFunc    compare_func );
     39
     40tr_list_t*  tr_list_find           ( tr_list_t          * list,
     41                                     const void         * b,
     42                                     TrListCompareFunc    compare_func );
     43
     44tr_list_t*  tr_list_find_data      ( tr_list_t          * list,
     45                                     const void         * data );
     46
     47void        tr_list_foreach        ( tr_list_t          * list,
     48                                     TrListForeachFunc    foreach_func );
    3349
    3450#endif /* TR_LIST_H */
  • trunk/libtransmission/peer.c

    r2573 r2746  
    314314    tr_bitfieldFree( peer->reqfield );
    315315    tr_list_foreach( peer->outRequests, tr_free );
    316     tr_list_free( peer->outRequests );
     316    tr_list_free( &peer->outRequests );
    317317    tr_free( peer->inRequests );
    318318    tr_free( peer->buf );
  • trunk/libtransmission/peermessages.h

    r2531 r2746  
    124124        r = (tr_request_t*) peer->outRequests->data;
    125125        assert( r != NULL );
    126         peer->outRequests = tr_list_remove_data( peer->outRequests, r );
     126        tr_list_remove_data( &peer->outRequests, r );
    127127
    128128        if( !tr_cpPieceIsComplete( tor->completion, r->index ) ) /* sanity clause */
     
    227227        /* Drop older requests from the last time it was unchoked, if any */
    228228        tr_list_foreach( peer->outRequests, tr_free );
    229         tr_list_free( peer->outRequests );
     229        tr_list_free( &peer->outRequests );
    230230        peer->outRequests = NULL;
    231231    }
  • trunk/libtransmission/peerparse.h

    r2555 r2746  
    245245    r->begin = begin;
    246246    r->length = length;
    247     peer->outRequests = tr_list_append( peer->outRequests, r );
     247    tr_list_append( &peer->outRequests, r );
    248248
    249249    return TR_OK;
     
    419419    req.begin = begin;
    420420    req.length = length;
    421     while(( l = tr_list_find( peer->outRequests, reqCompare, &req ) )) {
     421    while(( l = tr_list_find( peer->outRequests, &req, reqCompare ) )) {
    422422        tr_request_t * r = (tr_request_t *) l->data;
    423         peer->outRequests = tr_list_remove_data( peer->outRequests, r );
     423        tr_list_remove_data( &peer->outRequests, r );
    424424        tr_free( r );
    425425    }
  • trunk/libtransmission/transmission.c

    r2591 r2746  
    271271                tor = tr_torrentInit( h, path, destination, flags, NULL );
    272272                if( tor != NULL ) {
    273                     list = tr_list_append( list, tor );
     273                    tr_list_append( &list, tor );
    274274                    //fprintf (stderr, "#%d - %s\n", n, tor->info.name );
    275275                    n++;
     
    285285    assert( i==n );
    286286
    287     tr_list_free( list );
     287    tr_list_free( &list );
    288288
    289289    *setmeCount = n;
Note: See TracChangeset for help on using the changeset viewer.