chiark / gitweb /
changelog: Finalise 2.2
[innduct.git] / xmit.c
diff --git a/xmit.c b/xmit.c
index 4f873f3872300466566b4b7177afa0d6142f5c49..96e599af02eaceea39fb79864a5ab2cb9468dd37 100644 (file)
--- a/xmit.c
+++ b/xmit.c
@@ -3,25 +3,9 @@
  *  tailing reliable realtime streaming feeder for inn
  *  xmit.c - transmitting checks and articles, flow control, expiry
  *
- *  Copyright (C) 2010 Ian Jackson <ijackson@chiark.greenend.org.uk>
- * 
- *  This program is free software: you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation, either version 3 of the License, or
- *  (at your option) any later version.
- * 
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- * 
- *  You should have received a copy of the GNU General Public License
- *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- *  (I believe that when you compile and link this as part of the inn2
- *  build, with the Makefile runes I have provided, all the libraries
- *  and files which end up included in innduct are licence-compatible
- *  with GPLv3.  If not then please let me know.  -Ian Jackson.)
+ *  Copyright Ian Jackson <ijackson@chiark.greenend.org.uk>
+ *  and contributors; see LICENCE.txt.
+ *  SPDX-License-Identifier: GPL-3.0-or-later
  */
 
 #include "innduct.h"
@@ -49,13 +33,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 +56,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 +158,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 +168,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 +314,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 +348,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);
     }
   }