static void qmgr_queue_resume(int event, char *context) { QMGR_QUEUE *queue = (QMGR_QUEUE *) context; const char *myname = "qmgr_queue_resume"; /* * Sanity checks. */ if (!QMGR_QUEUE_SUSPENDED(queue)) msg_panic("%s: bad queue status: %s", myname, QMGR_QUEUE_STATUS(queue)); /* * We can't simply force delivery on this queue: the transport's pending * count may already be maxed out, and there may be other constraints * that definitely should be none of our business. The best we can do is * to play by the same rules as everyone else: let qmgr_active_drain() * and round-robin selection take care of message selection. */ queue->window = 1; /* * Every event handler that leaves a queue in the "ready" state should * remove the queue when it is empty. */ if (QMGR_QUEUE_READY(queue) && queue->todo.next == 0 && queue->busy.next == 0) qmgr_queue_done(queue); }
static void qmgr_queue_resume(int event, char *context) { QMGR_QUEUE *queue = (QMGR_QUEUE *) context; const char *myname = "qmgr_queue_resume"; /* * Sanity checks. */ if (!QMGR_QUEUE_SUSPENDED(queue)) msg_panic("%s: bad queue status: %s", myname, QMGR_QUEUE_STATUS(queue)); /* * We can't simply force delivery on this queue: the transport's pending * count may already be maxed out, and there may be other constraints * that definitely should be none of our business. The best we can do is * to play by the same rules as everyone else: let qmgr_active_drain() * and round-robin selection take care of message selection. */ queue->window = 1; /* * Every event handler that leaves a queue in the "ready" state should * remove the queue when it is empty. * * XXX Do not omit the redundant test below. It is here to simplify code * consistency checks. The check is trivially eliminated by the compiler * optimizer. There is no need to sacrifice code clarity for the sake of * performance. * * XXX Do not expose the blocker job logic here. Rate-limited queues are not * a performance-critical feature. Here, too, there is no need to sacrifice * code clarity for the sake of performance. */ if (QMGR_QUEUE_READY(queue) && queue->todo.next == 0 && queue->busy.next == 0) qmgr_queue_done(queue); else qmgr_job_blocker_update(queue); }