chiark / gitweb /
Install the READMEs
[innduct.git] / xmit.c
diff --git a/xmit.c b/xmit.c
index 4f873f3872300466566b4b7177afa0d6142f5c49..c4b1854717333b05249bf009e33387fe9b8d13de 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(use, &inqueue, &spare);
       if (!inqueue) use->since_activity= 0; /* reset idle counter */
       while (spare>0) {
        Article *art= dequeue(0);
@@ -166,7 +174,7 @@ int article_check_expired(Article *art /* must be queued, not conn */) {
 
   LIST_REMOVE(art->ipf->queue, art);
   art->missing= 1;
-  art->ipf->count_nooffer_missing++;
+  art->ipf->counts.events[nooffer_missing]++;
   article_done(art,-1);
   return 1;
 }
@@ -176,6 +184,7 @@ void inputfile_queue_check_expired(InputFile *ipf) {
 
   for (;;) {
     Article *art= LIST_HEAD(ipf->queue);
+    if (!art) break;
     int expd= article_check_expired(art);
     if (!expd) break;
   }
@@ -321,7 +330,7 @@ void conn_make_some_xmits(Conn *conn) {
        (abort(),-1);
 
       if (!artdata) art->missing= 1;
-      art->ipf->counts[art->state][ artdata ? RC_sent : RC_missing ]++;
+      art->ipf->counts.results[art->state][ artdata ? RC_sent : RC_missing ]++;
 
       if (conn->stream) {
        if (artdata) {
@@ -355,7 +364,7 @@ void conn_make_some_xmits(Conn *conn) {
       XMIT_LITERAL("\r\n");
 
       assert(art->state == art_Unchecked);
-      art->ipf->counts[art->state][RC_sent]++;
+      art->ipf->counts.results[art->state][RC_sent]++;
       LIST_ADDTAIL(conn->sent, art);
     }
   }