summaryrefslogtreecommitdiffstats
path: root/src/queue.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/queue.c')
-rw-r--r--src/queue.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/queue.c b/src/queue.c
index 16142d9..70b2965 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998-2009, 2011 Sendmail, Inc. and its suppliers.
+ * Copyright (c) 1998-2009, 2011, 2012 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@@ -14,7 +14,7 @@
#include <sendmail.h>
#include <sm/sem.h>
-SM_RCSID("@(#)$Id: queue.c,v 8.991 2011/03/15 23:14:36 ca Exp $")
+SM_RCSID("@(#)$Id: queue.c,v 8.997 2012/06/14 23:54:03 ca Exp $")
#include <dirent.h>
@@ -1493,6 +1493,7 @@ runqueue(forkflag, verbose, persistent, runall)
for (i = 0; i < NumWorkGroups && !NoMoreRunners; i++)
{
int rwgflags = RWG_NONE;
+ int wasblocked;
/*
** If MaxQueueChildren active then test whether the start
@@ -1529,7 +1530,11 @@ runqueue(forkflag, verbose, persistent, runall)
** increase if some queue runners "hang" for a long time.
*/
+ /* don't let proc_list_drop() change CurRunners */
+ wasblocked = sm_blocksignal(SIGCHLD);
CurRunners += WorkGrp[curnum].wg_maxact;
+ if (wasblocked == 0)
+ (void) sm_releasesignal(SIGCHLD);
if (forkflag)
rwgflags |= RWG_FORK;
if (verbose)
@@ -1549,7 +1554,13 @@ runqueue(forkflag, verbose, persistent, runall)
if (!ret)
{
+ /* don't let proc_list_drop() change CurRunners */
+ wasblocked = sm_blocksignal(SIGCHLD);
CurRunners -= WorkGrp[curnum].wg_maxact;
+ CHK_CUR_RUNNERS("runqueue", curnum,
+ WorkGrp[curnum].wg_maxact);
+ if (wasblocked == 0)
+ (void) sm_releasesignal(SIGCHLD);
break;
}
@@ -2031,6 +2042,9 @@ run_work_group(wgrp, flags)
{
IgnoreHostStatus = true;
MinQueueAge = 0;
+#if _FFR_EXPDELAY
+ MaxQueueAge = 0;
+#endif /* _FFR_EXPDELAY */
}
/*
@@ -2300,7 +2314,7 @@ run_work_group(wgrp, flags)
if (bitset(RWG_PERSISTENT, flags))
{
sequenceno = 1;
- sm_setproctitle(true, CurEnv, "running queue: %s",
+ sm_setproctitle(true, NULL, "running queue: %s",
qid_printqueue(qgrp, qdir));
/*
@@ -2860,7 +2874,7 @@ gatherq(qgrp, qdir, doall, full, more, pnentries)
#if _FFR_EXPDELAY
if (MaxQueueAge > 0)
{
- time_t lasttry, delay;
+ time_t lasttry, delay;
lasttry = (time_t) atol(&lbuf[1]);
delay = MIN(lasttry - w->w_ctime,
@@ -3704,6 +3718,7 @@ dowork(qgrp, qdir, id, forkflag, requeueflag, e)
(void) dropenvelope(e, true, false);
sm_rpool_free(rpool);
e->e_rpool = NULL;
+ e->e_message = NULL;
}
}
e->e_id = NULL;
@@ -4577,7 +4592,7 @@ readqf(e, openonly)
e->e_dfdev = st.st_dev;
e->e_dfino = ST_INODE(st);
(void) sm_snprintf(buf, sizeof(buf), "%ld",
- e->e_msgsize);
+ PRT_NONNEGL(e->e_msgsize));
macdefine(&e->e_macro, A_TEMP, macid("{msg_size}"),
buf);
}
OpenPOWER on IntegriCloud