Ticket #3427: verify-shortest-job-first-bugfix.diff

File verify-shortest-job-first-bugfix.diff, 3.0 KB (added by wateenellende, 12 years ago)

Previous patches had a bug in tr_list_insert_ordered(...) in list.c, handling of empty list. Fixed in this patch.

  • libtransmission/verify.c

     
    273273    return hasAny;
    274274}
    275275
     276static int
     277compareVerifyBySizeNow( const void * va,
     278                        const void * vb )
     279{
     280    const struct verify_node * a = va;
     281    const struct verify_node * b = vb;
     282
     283    return a->torrent->completion.sizeNow - b->torrent->completion.sizeNow;
     284}
     285
    276286void
    277287tr_verifyAdd( tr_torrent *      tor,
    278288              tr_verify_done_cb verify_done_cb )
     
    312322
    313323        tr_lockLock( getVerifyLock( ) );
    314324        tr_torrentSetVerifyState( tor, TR_VERIFY_WAIT );
    315         tr_list_append( &verifyList, node );
     325        /*tr_list_append( &verifyList, node );*/
     326        tr_list_insert_ordered( &verifyList, node, compareVerifyBySizeNow );
    316327        if( verifyThread == NULL )
    317328            verifyThread = tr_threadNew( verifyThreadFunc, NULL );
    318329        tr_lockUnlock( getVerifyLock( ) );
  • libtransmission/list.c

     
    1010 * $Id$
    1111 */
    1212
     13#include <assert.h>
     14
    1315#include "transmission.h"
    1416#include "list.h"
    1517#include "utils.h"
     
    5860}
    5961
    6062void
     63tr_list_insert_ordered( tr_list ** list,
     64                        void *     data,
     65                        TrListCompareFunc compare_func )
     66{
     67    tr_list * node;
     68    tr_list * l;
     69
     70    /* empty list ? */
     71    if( ! *list )
     72    {
     73        *list = node_alloc ( );
     74        (*list)->data = data;
     75        return;
     76    }
     77
     78    /* first element ? */
     79    if ( !compare_func(data, (*list)->data) )
     80    {
     81        tr_list_prepend(list, data);
     82        return;
     83    }
     84
     85    /* search for correct position */
     86    for (l = *list; l; l = l->next)
     87    {
     88        assert( !l->next || compare_func(l->data, l->next->data) >= 0 ); /* in-order ? */
     89        if ( compare_func(data, l->data) <= 0)
     90            break;
     91    }
     92
     93
     94    /* end of list ? */
     95    if ( !l )
     96    {
     97        tr_list_append(list, data);
     98        return;
     99    }
     100
     101    /* Put it before l */
     102    node = node_alloc ( );
     103    node->data = data;
     104    node->next = l;
     105    node->prev = l->prev;
     106    l->prev = node;
     107}
     108
     109void
    61110tr_list_append( tr_list ** list,
    62111                void *     data )
    63112{
  • libtransmission/list.h

     
    100100                       const void *      b,
    101101                       TrListCompareFunc compare_func );
    102102
     103/**
     104 * @brief Insert in an ordered list
     105 * @param list pointer to the list
     106 * @param item the item to prepend
     107 * @param compare_func the comparison function.
     108 */
     109void
     110tr_list_insert_ordered( tr_list ** list,
     111                        void *     data,
     112                        TrListCompareFunc compare_func );
    103113
    104114/* @} */
    105115#endif /* TR_LIST_H */