diff options
Diffstat (limited to 'usr.sbin/smtpd/scheduler_ramqueue.c')
| -rw-r--r-- | usr.sbin/smtpd/scheduler_ramqueue.c | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/usr.sbin/smtpd/scheduler_ramqueue.c b/usr.sbin/smtpd/scheduler_ramqueue.c index aeaeae3b954..c622ae4c576 100644 --- a/usr.sbin/smtpd/scheduler_ramqueue.c +++ b/usr.sbin/smtpd/scheduler_ramqueue.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scheduler_ramqueue.c,v 1.3 2012/01/30 10:02:55 chl Exp $ */ +/* $OpenBSD: scheduler_ramqueue.c,v 1.4 2012/01/31 21:05:26 gilles Exp $ */ /* * Copyright (c) 2012 Gilles Chehade <gilles@openbsd.org> @@ -118,7 +118,7 @@ static void scheduler_ramqueue_init(void); static int scheduler_ramqueue_setup(time_t, time_t); static int scheduler_ramqueue_next(u_int64_t *, time_t *); static void scheduler_ramqueue_insert(struct envelope *); -static void scheduler_ramqueue_remove(u_int64_t); +static void scheduler_ramqueue_remove(void *, u_int64_t); static void *scheduler_ramqueue_host(char *); static void *scheduler_ramqueue_message(u_int32_t); static void *scheduler_ramqueue_batch(u_int64_t); @@ -263,10 +263,10 @@ scheduler_ramqueue_next(u_int64_t *evpid, time_t *sched) log_debug("scheduler_ramqueue: next"); TAILQ_FOREACH(rq_evp, &ramqueue.queue, queue_entry) { if (rq_evp->rq_batch->type == D_MDA) - if (env->sc_opts & SMTPD_MDA_PAUSED) + if (env->sc_flags & (SMTPD_MDA_PAUSED|SMTPD_MDA_BUSY)) continue; if (rq_evp->rq_batch->type == D_MTA) - if (env->sc_opts & SMTPD_MTA_PAUSED) + if (env->sc_flags & (SMTPD_MTA_PAUSED|SMTPD_MTA_BUSY)) continue; if (evpid) *evpid = rq_evp->evpid; @@ -331,8 +331,9 @@ scheduler_ramqueue_insert(struct envelope *envelope) } static void -scheduler_ramqueue_remove(u_int64_t evpid) +scheduler_ramqueue_remove(void *hdl, u_int64_t evpid) { + struct ramqueue_iter *iter = hdl; struct ramqueue_batch *rq_batch; struct ramqueue_message *rq_msg; struct ramqueue_envelope *rq_evp; @@ -349,17 +350,33 @@ scheduler_ramqueue_remove(u_int64_t evpid) TAILQ_REMOVE(&ramqueue.queue, rq_evp, queue_entry); stat_decrement(STATS_RAMQUEUE_ENVELOPE); + /* check if we are the last of a batch */ - if (TAILQ_FIRST(&rq_batch->envelope_queue) == NULL) + if (TAILQ_FIRST(&rq_batch->envelope_queue) == NULL) { ramqueue_remove_batch(rq_host, rq_batch); + if (iter != NULL && iter->type == RAMQUEUE_ITER_BATCH) { + log_debug("scheduler_ramqueue_remove: batch removed"); + iter->u.batch = NULL; + } + } /* check if we are the last of a message */ - if (RB_ROOT(&rq_msg->evptree) == NULL) + if (RB_ROOT(&rq_msg->evptree) == NULL) { ramqueue_remove_message(rq_msg); + if (iter != NULL && iter->type == RAMQUEUE_ITER_MESSAGE) { + log_debug("scheduler_ramqueue_remove: message removed"); + iter->u.message = NULL; + } + } /* check if we are the last of a host */ - if (TAILQ_FIRST(&rq_host->batch_queue) == NULL) + if (TAILQ_FIRST(&rq_host->batch_queue) == NULL) { ramqueue_remove_host(rq_host); + if (iter != NULL && iter->type == RAMQUEUE_ITER_HOST) { + log_debug("scheduler_ramqueue_remove: host removed"); + iter->u.host = NULL; + } + } free(rq_evp); } @@ -422,6 +439,7 @@ scheduler_ramqueue_message(u_int32_t msgid) iter->u.message = rq_msg; return iter; + } static void * @@ -453,6 +471,8 @@ scheduler_ramqueue_fetch(void *hdl, u_int64_t *evpid) switch (iter->type) { case RAMQUEUE_ITER_HOST: { + if (iter->u.host == NULL) + return 0; rq_batch = TAILQ_FIRST(&iter->u.host->batch_queue); if (rq_batch == NULL) break; @@ -464,6 +484,8 @@ scheduler_ramqueue_fetch(void *hdl, u_int64_t *evpid) } case RAMQUEUE_ITER_BATCH: + if (iter->u.batch == NULL) + return 0; rq_evp = TAILQ_FIRST(&iter->u.batch->envelope_queue); if (rq_evp == NULL) break; @@ -471,6 +493,8 @@ scheduler_ramqueue_fetch(void *hdl, u_int64_t *evpid) return 1; case RAMQUEUE_ITER_MESSAGE: + if (iter->u.message == NULL) + return 0; rq_evp = RB_ROOT(&iter->u.message->evptree); if (rq_evp == NULL) break; |
