Do not sleep for tiny periods, or hang trying to sleep for zero. Bug 1426
authorJeremy Harris <jgh146exb@wizmail.org>
Mon, 11 Aug 2014 16:47:01 +0000 (17:47 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Mon, 11 Aug 2014 16:47:01 +0000 (17:47 +0100)
src/src/exim.c

index 517b5435ebc675fb6ac6ef5a746a5870faea749b..51daa55760d4a2aa2a88139ad2bd6f3abf7d5b70 100644 (file)
@@ -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. :-)
 
+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
 */
@@ -276,6 +280,9 @@ milliwait(struct itimerval *itval)
 {
 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 */