chiark / gitweb /
Recalculate inqueue/spare for use properly
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Fri, 28 May 2010 21:42:53 +0000 (22:42 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Fri, 28 May 2010 21:42:53 +0000 (22:42 +0100)
xmit.c

diff --git a/xmit.c b/xmit.c
index 4f873f3..8adb082 100644 (file)
--- a/xmit.c
+++ b/xmit.c
@@ -49,13 +49,20 @@ static Article *dequeue(int peek) {
   return 0;
 }
 
+static void conn_inqueue_spare(const Conn *conn,
+                              int *inqueue_r, int *spare_r) {
+  int inqueue= conn->sent.count + conn->priority.count + conn->waiting.count;
+  int spare= conn->max_queue - inqueue;
+  if (inqueue_r) *inqueue_r= inqueue;
+  if (spare_r) *spare_r= spare;
+}
+
 void check_assign_articles(void) {
   for (;;) {
     if (!dequeue(1))
       break;
 
     Conn *walk, *use=0;
-    int spare=0, inqueue=0;
 
     /* Find a connection to offer this article.  We prefer a busy
      * connection to an idle one, provided it's not full.  We take the
@@ -65,15 +72,16 @@ void check_assign_articles(void) {
      */
     FOR_CONN(walk) {
       if (walk->quitting) continue;
-      inqueue= walk->sent.count + walk->priority.count
-            + walk->waiting.count;
-      spare= walk->max_queue - inqueue;
+      int inqueue, spare;
+      conn_inqueue_spare(walk, &inqueue, &spare);
       assert(inqueue <= max_queue_per_conn);
       assert(spare >= 0);
       if (inqueue==0) /*idle*/ { if (!use) use= walk; }
       else if (spare>0) /*working*/ { use= walk; break; }
     }
     if (use) {
+      int inqueue, spare;
+      conn_inqueue_spare(walk, &inqueue, &spare);
       if (!inqueue) use->since_activity= 0; /* reset idle counter */
       while (spare>0) {
        Article *art= dequeue(0);