about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRichard Nyberg <rnyberg@murmeldjur.se>2006-01-16 20:29:28 +0000
committerRichard Nyberg <rnyberg@murmeldjur.se>2006-01-16 20:29:28 +0000
commitcdd5e3fbb1bcfc4c0c42758d15a7bf6e2dced8c6 (patch)
tree25bc3269ece14781ee05e92d3785afdd116953f0
parent1c14af0ab4f34bc134c68e98493e6a43bdef3848 (diff)
downloadbtpd-cdd5e3fbb1bcfc4c0c42758d15a7bf6e2dced8c6.tar.gz
btpd-cdd5e3fbb1bcfc4c0c42758d15a7bf6e2dced8c6.zip
There should be one level of pointer indirection less for the arguments
of rate_cmp. Also the wrong variable was passed to peer_unchoke.
s/unsigned/int where it makes sense.

-rw-r--r--btpd/upload.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/btpd/upload.c b/btpd/upload.c
index 7de5243..c812881 100644
--- a/btpd/upload.c
+++ b/btpd/upload.c
@@ -17,8 +17,8 @@ struct peer_sort {
 static int
 rate_cmp(const void *arg1, const void *arg2)
 {
-    struct peer *p1 = (*(struct peer_sort **)arg1)->p;
-    struct peer *p2 = (*(struct peer_sort **)arg2)->p;
+    struct peer *p1 = ((struct peer_sort *)arg1)->p;
+    struct peer *p2 = ((struct peer_sort *)arg2)->p;
     unsigned long rate1 = cm_full(p1->n->tp) ? p1->rate_up : p1->rate_dwn;
     unsigned long rate2 = cm_full(p2->n->tp) ? p2->rate_up : p2->rate_dwn;
     if (rate1 < rate2)
@@ -44,14 +44,15 @@ choke_do(void)
                 peer_choke(p);
     } else if (m_npeers > 0) {
         struct peer_sort worthy[m_npeers];
-        unsigned nworthy = 0;
-        unsigned i = 0;
-        unsigned found = 0;
+        int nworthy = 0;
+        int i = 0;
+        int found = 0;
         struct peer *p;
         int unchoked[m_npeers];
 
         BTPDQ_FOREACH(p, &m_peerq, ul_entry) {
-            if (((cm_full(p->n->tp) && p->rate_up > 0)
+            if (!peer_full(p) &&
+                ((cm_full(p->n->tp) && p->rate_up > 0)
                     || (!cm_full(p->n->tp) && p->rate_dwn > 0))) {
                 worthy[nworthy].p = p;
                 worthy[nworthy].i = i;
@@ -62,18 +63,18 @@ choke_do(void)
         qsort(worthy, nworthy, sizeof(worthy[0]), rate_cmp);
 
         bzero(unchoked, sizeof(unchoked));
-        for (i = nworthy; i > 0 && found < m_max_downloaders - 1; i--) {
-            if ((worthy[i - 1].p->flags & PF_P_WANT) != 0)
+        for (i = nworthy - 1; i >= 0 && found < m_max_downloaders - 1; i--) {
+            if ((worthy[i].p->flags & PF_P_WANT) != 0)
                 found++;
-            if ((worthy[i - 1].p->flags & PF_I_CHOKE) != 0)
-                peer_unchoke(p);
-            unchoked[worthy[i - 1].i] = 1;
+            if ((worthy[i].p->flags & PF_I_CHOKE) != 0)
+                peer_unchoke(worthy[i].p);
+            unchoked[worthy[i].i] = 1;
         }
 
         i = 0;
         BTPDQ_FOREACH(p, &m_peerq, ul_entry) {
             if (!unchoked[i]) {
-                if (found < m_max_downloaders) {
+                if (found < m_max_downloaders && !peer_full(p)) {
                     if (p->flags & PF_P_WANT)
                         found++;
                     if (p->flags & PF_I_CHOKE)
@@ -91,7 +92,7 @@ choke_do(void)
 static void
 shuffle_optimists(void)
 {
-    for (unsigned i = 0; i < m_npeers; i++) {
+    for (int i = 0; i < m_npeers; i++) {
         struct peer *p = BTPDQ_FIRST(&m_peerq);
         if ((p->flags & (PF_P_WANT|PF_I_CHOKE)) == (PF_P_WANT|PF_I_CHOKE)) {
             break;