From f0efd7fea86271b70c2c1ef350e36735ffa06b11 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Wed, 24 Dec 2008 17:45:27 +0000 Subject: [PATCH] (trunk libT) #1627: OSX mutex lockup in 141 and up to 7490 --- libtransmission/bandwidth.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/libtransmission/bandwidth.c b/libtransmission/bandwidth.c index 85c8389be..450acf356 100644 --- a/libtransmission/bandwidth.c +++ b/libtransmission/bandwidth.c @@ -7,7 +7,7 @@ * This exemption does not extend to derived works not owned by * the Transmission project. * - * $Id:$ + * $Id$ */ #include @@ -296,6 +296,9 @@ tr_bandwidthAllocate( tr_bandwidth * b, int i, n, peerCount; tr_ptrArray * tmp; struct tr_peerIo ** peers; + const uint64_t now = tr_date( ); + const uint64_t cutoff = now + 100; /* 1/10th of a second */ + /* allocateBandwidth() is a helper function with two purposes: * 1. allocate bandwidth to b and its subtree @@ -311,11 +314,11 @@ tr_bandwidthAllocate( tr_bandwidth * b, /* First phase of IO. Tries to distribute bandwidth fairly to keep faster * peers from starving the others. Loop through the peers, giving each a - * small chunk of bandwidth. Keep looping until we run out of bandwidth - * or pweers that can use it */ + * small chunk of bandwidth. Keep looping until we reach the cutoff or + * run out of bandwidth and/or peers that can use it */ n = peerCount; i = n ? tr_cryptoWeakRandInt( n ) : 0; /* pick a random starting point */ - for( ; n>0; ) + for( ; n>0 && tr_date()<=cutoff; ) { const int increment = n==1 ? 4096 : 1024; const int byteCount = tr_peerIoFlush( peers[i], dir, increment);