diff options
author | 2012-08-30 18:16:25 +0000 | |
---|---|---|
committer | 2012-08-30 18:16:25 +0000 | |
commit | 30f45e1a493a787cc70dd9b12228542a251da692 (patch) | |
tree | f1b9912620079e9a1ef52e9b5d118d4dde25ee96 | |
parent | Add the possibility to map DMA memory non-cached, based on the i386/amd64 (diff) | |
download | wireguard-openbsd-30f45e1a493a787cc70dd9b12228542a251da692.tar.xz wireguard-openbsd-30f45e1a493a787cc70dd9b12228542a251da692.zip |
- correctly free the task if all rcpt where rejected
- fix refcounting
- add some stat counters
ok gilles@ chl@
-rw-r--r-- | usr.sbin/smtpd/mta.c | 9 | ||||
-rw-r--r-- | usr.sbin/smtpd/mta_session.c | 13 |
2 files changed, 17 insertions, 5 deletions
diff --git a/usr.sbin/smtpd/mta.c b/usr.sbin/smtpd/mta.c index 0b992ff4ba9..365062e8afd 100644 --- a/usr.sbin/smtpd/mta.c +++ b/usr.sbin/smtpd/mta.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mta.c,v 1.139 2012/08/29 16:26:17 gilles Exp $ */ +/* $OpenBSD: mta.c,v 1.140 2012/08/30 18:16:25 eric Exp $ */ /* * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org> @@ -122,6 +122,7 @@ mta_imsg(struct imsgev *iev, struct imsg *imsg) /* XXX honour route->maxrcpt */ TAILQ_INSERT_TAIL(&task->envelopes, e, entry); + stat_increment("mta.envelope", 1); log_debug("mta: received evp:%016" PRIx64 " for <%s@%s>", e->id, e->dest.user, e->dest.domain); return; @@ -138,6 +139,7 @@ mta_imsg(struct imsgev *iev, struct imsg *imsg) task->route->refcount -= 1; task->route->ntask += 1; TAILQ_INSERT_TAIL(&task->route->tasks, task, entry); + stat_increment("mta.task", 1); mta_route_drain(task->route); } free(batch); @@ -440,6 +442,7 @@ mta_route_for(struct envelope *e) route->maxrcpt = MTA_MAXRCPT; log_trace(TRACE_MTA, "mta: new %s", mta_route_to_text(route)); + stat_increment("mta.route", 1); } else { log_trace(TRACE_MTA, "mta: reusing %s", mta_route_to_text(route)); } @@ -472,6 +475,7 @@ mta_route_drain(struct mta_route *route) if (route->ntask == 0 && route->refcount == 0 && route->nsession == 0) { mta_route_free(route); + stat_decrement("mta.route", 1); return; } @@ -492,8 +496,8 @@ mta_route_drain(struct mta_route *route) route->ntask -= 1; while((e = TAILQ_FIRST(&task->envelopes))) mta_envelope_done(task, e, route->errorline); - route->refcount -= 1; free(task); + stat_decrement("mta.task", 1); } route->nfail = 0; /* XXX maybe close the route for while */ @@ -530,6 +534,7 @@ mta_envelope_done(struct mta_task *task, struct envelope *e, const char *status) mta_response_delivery(e->errorline), 0, 0, -1, e, sizeof(*e)); TAILQ_REMOVE(&task->envelopes, e, entry); free(e); + stat_decrement("mta.envelope", 1); } static int diff --git a/usr.sbin/smtpd/mta_session.c b/usr.sbin/smtpd/mta_session.c index db7f15a31a8..f66222342f5 100644 --- a/usr.sbin/smtpd/mta_session.c +++ b/usr.sbin/smtpd/mta_session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mta_session.c,v 1.13 2012/08/21 20:19:46 eric Exp $ */ +/* $OpenBSD: mta_session.c,v 1.14 2012/08/30 18:16:25 eric Exp $ */ /* * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org> @@ -152,7 +152,7 @@ mta_session(struct mta_route *route) } log_debug("mta: %p: spawned for %s", session, mta_route_to_text(route)); - + stat_increment("mta.session", 1); mta_enter_state(session, MTA_INIT); } @@ -397,6 +397,7 @@ mta_enter_state(struct mta_session *s, int newstate) } route = s->route; free(s); + stat_decrement("mta.session", 1); mta_route_collect(route); break; @@ -454,6 +455,8 @@ mta_enter_state(struct mta_session *s, int newstate) TAILQ_REMOVE(&s->route->tasks, s->task, entry); s->route->ntask -= 1; s->task->session = s; + stat_decrement("mta.task", 1); + stat_increment("mta.task.running", 1); mta_enter_state(s, MTA_DATA); } else { log_debug("mta: %p: no pending task for %s", s, @@ -598,6 +601,9 @@ mta_response(struct mta_session *s, char *line) if (line[0] != '2') { mta_envelope_done(s->task, evp, line); if (TAILQ_EMPTY(&s->task->envelopes)) { + free(s->task); + s->task = NULL; + stat_decrement("mta.task.running", 1); mta_enter_state(s, MTA_SMTP_RSET); break; } @@ -833,6 +839,7 @@ mta_status(struct mta_session *s, int connerr, const char *fmt, ...) mta_envelope_done(s->task, e, status); free(s->task); s->task = NULL; + stat_decrement("mta.task.running", 1); } if (connerr) @@ -861,8 +868,8 @@ mta_envelope_done(struct mta_task *task, struct envelope *e, const char *status) mta_response_delivery(e->errorline), 0, 0, -1, e, sizeof(*e)); TAILQ_REMOVE(&task->envelopes, e, entry); - free(e); + stat_decrement("mta.envelope", 1); } #define CASE(x) case x : return #x |