From: Ian Jackson Date: Fri, 28 May 2010 21:42:53 +0000 (+0100) Subject: Recalculate inqueue/spare for use properly X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=innduct.git;a=commitdiff_plain;h=5871f835aa5215f8d5e416bb44d13a059b523013 Recalculate inqueue/spare for use properly --- diff --git a/xmit.c b/xmit.c index 4f873f3..8adb082 100644 --- 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);