git://git.exim.org
/
exim.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
a40bc6c
)
Do not sleep for tiny periods, or hang trying to sleep for zero. Bug 1426
author
Jeremy Harris
<jgh146exb@wizmail.org>
Tue, 27 May 2014 20:50:41 +0000
(21:50 +0100)
committer
Jeremy Harris
<jgh146exb@wizmail.org>
Tue, 22 Jul 2014 22:06:15 +0000
(23:06 +0100)
src/src/exim.c
patch
|
blob
|
history
diff --git
a/src/src/exim.c
b/src/src/exim.c
index 6a2336450fabc909f74624d2cf528b531eade000..51daa55760d4a2aa2a88139ad2bd6f3abf7d5b70 100644
(file)
--- a/
src/src/exim.c
+++ b/
src/src/exim.c
@@
-267,6
+267,10
@@
will wait for ever, so we panic in this instance. (There was a case of this
when a bug in a function that calls milliwait() caused it to pass invalid data.
That's when I added the check. :-)
when a bug in a function that calls milliwait() caused it to pass invalid data.
That's when I added the check. :-)
+We assume it to be not worth sleeping for under 100us; this value will
+require revisiting as hardware advances. This avoids the issue of
+a zero-valued timer setting meaning "never fire".
+
Argument: an itimerval structure containing the interval
Returns: nothing
*/
Argument: an itimerval structure containing the interval
Returns: nothing
*/
@@
-276,6
+280,9
@@
milliwait(struct itimerval *itval)
{
sigset_t sigmask;
sigset_t old_sigmask;
{
sigset_t sigmask;
sigset_t old_sigmask;
+
+if (itval->it_value.tv_usec < 100 && itval->it_value.tv_sec == 0)
+ return;
(void)sigemptyset(&sigmask); /* Empty mask */
(void)sigaddset(&sigmask, SIGALRM); /* Add SIGALRM */
(void)sigprocmask(SIG_BLOCK, &sigmask, &old_sigmask); /* Block SIGALRM */
(void)sigemptyset(&sigmask); /* Empty mask */
(void)sigaddset(&sigmask, SIGALRM); /* Add SIGALRM */
(void)sigprocmask(SIG_BLOCK, &sigmask, &old_sigmask); /* Block SIGALRM */
@@
-310,8
+317,7
@@
struct itimerval itval;
itval.it_interval.tv_sec = 0;
itval.it_interval.tv_usec = 0;
itval.it_value.tv_sec = msec/1000;
itval.it_interval.tv_sec = 0;
itval.it_interval.tv_usec = 0;
itval.it_value.tv_sec = msec/1000;
-if ((itval.it_value.tv_usec = (msec % 1000) * 1000) == 0)
- itval.it_value.tv_usec = 1;
+itval.it_value.tv_usec = (msec % 1000) * 1000;
milliwait(&itval);
}
milliwait(&itval);
}